文章目录

  • 〇、EEPROM与Flash(知识储备)
  • 一、STM32F103内部
  • 二、SD卡的读写
  • 1. 说明
  • 2.实验过程
  • 3.从SD卡里读出数据
  • 3.1 代码修改
  • 3.2 结果显示
  • 三、将内容写入flash
  • 1.CubeMX设置
  • 2.代码部分
  • 3.硬件连接以及环境配置
  • 4.调试程序
  • 四、实例——基于片内Flash的提示音播放程序
  • 1.音频准备
  • 2.录制“您好欢迎光临 ”
  • 3.生成wav文件
  • 4.将.wav文件转换成十六进制
  • 5.将生成的音频十六进制写入FLASH
  • 总结
  • 参考资料


〇、EEPROM与Flash(知识储备)

什么是EEPROM?

EEPROM (Electrically Erasable Programmable read only memory)是指带电可擦可编程只读存储器。是一种掉电后数据不丢失的存储芯片。
再次强调:它是一种掉电后数据不丢失的存储芯片!
换句话就是说,如果你这次使用断电后,下次使用时,上一次储存的代码依然存在!

在开发项目的时候,总会有需要掉电存储一些配置信息的时候。不过,ST公司为了节约成本,没有加入 EEPROM,但是许多场合下我们需要用EEPROM,怎么办呢?
有一种方法是利用FLASH模拟EEPROM

什么是Flash?

Flash 是存储芯片的一种,通过特定的程序可以修改里面的数据。Flash 存储器又称闪存,它结合了ROM 和RAM 的长处,不仅具备电子可擦除可编程(EEPROM)的性能——不会断电丢失数据,同时可以快速读取数据(NVRAM 的优势)。
再次重申:Flash的巨大特点就是:不会断电丢失数据、快速读取数据!!
那么我们可以基于Flash的这两大优点进行利用。

一、STM32F103内部

补充完EEPROM和Flash的基础知识,下面我们来说说STM32F103的内部结构

  • STM32F103内部结构图

    通过结果图我们可以看到,右上角的就是Flash接口和Flash设备了,除此之外我们还需要注意一个地方,就是在Flash下方的SRAM。

什么是SRAM?

SRAM,全名Static Random-Access Memory,译为静态随机存取存储器,是随机存取存储器的一种。所谓的“静态”,是指这种存储器只要保持通电,里面储存的数据就可以恒常保持。与之相对应的是DRAM,也就是动态随机存取存储器,其里面所储存的数据就需要周期性地更新。然而,当电力供应停止时,SRAM储存的数据是会消失的。

下面我们总结对比一下RAM和Flash:

Flash

RAM

地址

flash地址起始于0x0800 0000,结束地址是0x0800 0000+芯片实际的flash大小,不同的芯片flash大小不同

RAM起始地址是0x2000 0000,结束地址是0x2000 0000+芯片的RAM大小。不同的芯片RAM也不同

作用

一般用来存储代码和一些定义为const的数据,断电不丢失

可以理解为内存,用来存储代码运行时的数据,变量等等。掉电数据丢失

相对之下,Flash不会断电丢失数据的特性就被无限放大。

二、SD卡的读写

1. 说明

将64K数据分250次,每次256字节,写入SD卡,测试速度
具体操作,如:硬件连接,协议分析介绍等,可以参考博主前面的博客:SD卡协议原理并用STM32F103 完成对SD卡的数据读取(FAT文件模式)

2.实验过程

esp32 获取flash剩余大小 esp32内部flash_数据


总共用了13分钟,共写入了64K字节

  • 查看hello.txt文档

    一共有250行数据

3.从SD卡里读出数据

利用FATS从SD卡读出数据,并且串口输出

3.1 代码修改

  • 因为要进行读取,所以将写入部分的函数改为读出函数
  • 声明读出函数,定义双字节数据类型s,用来保存地址(或者存放指针),再定义字节类型格式的变量和一个存储读取的数组
  • ① 修改f_open函数的第三个参数设置为打开状态为FA_READ模式。②文件指针移至相应位置,否则无输出。③指针加地址④使用FATS的read函数,第一个参数是指针,第二个是存储数组,第三个是数组大小,第四个是强制转换br为UINT格式。⑤输出

3.2 结果显示

esp32 获取flash剩余大小 esp32内部flash_数据_02

三、将内容写入flash


1.CubeMX设置

  • 将定时器设置成Sys Tick
  • 将引脚PC13配置为输出模式,并使能该引脚
  • 时钟配置
  • 设置堆栈大小

2.代码部分

生成工程文件后,进入MDK,进入代码部分,对代码做如下修改

  • 在main.c中加入如下代码
  • esp32 获取flash剩余大小 esp32内部flash_单片机_03

  • 修改数据内容( 将数组中写入要存储的数据)
  • esp32 获取flash剩余大小 esp32内部flash_单片机_04


  • esp32 获取flash剩余大小 esp32内部flash_十六进制_05

3.硬件连接以及环境配置

  • STM32与ST-link连接方式

ST-LINK

STM32

SWCLK/TCK

SWCLK/TCK

SWDIO/TMS

SWDIO/TMS

GND

GND

VCC

VCC

esp32 获取flash剩余大小 esp32内部flash_stm32_06

  • 设置debug为st-link debugger
  • esp32 获取flash剩余大小 esp32内部flash_esp32 获取flash剩余大小_07

  • 点进去后可以看到要检测出SWDIO有信息即可烧录
  • esp32 获取flash剩余大小 esp32内部flash_单片机_08

4.调试程序

  • 编译工程无错误后,点击download下载程序
  • esp32 获取flash剩余大小 esp32内部flash_十六进制_09

  • 注意,download后,要将STM32调整至工作模式,并按下复位键
  • 进行程序调试,全速运行
  • esp32 获取flash剩余大小 esp32内部flash_数据_10

  • View->memory windows->memory 1打开内存观察窗口,并在地址栏中输入:0x800c000,观察将要修改的flash区间区容
  • esp32 获取flash剩余大小 esp32内部flash_单片机_11

  • 在Memory 1窗口中可以看到在FLASH地址0x0800C000区成功写入对应内容
  • esp32 获取flash剩余大小 esp32内部flash_单片机_12

  • View->Watch windows->Watch 1打开一个变量观察窗口,将变量FlashWBuff 和 FlashRBuff加入到 Watch 1 观察窗口
  • esp32 获取flash剩余大小 esp32内部flash_单片机_13

  • 全速运行程序,可以看到数组FlashRBuff中内容与数组FlashWBuff中内容一样了
  • esp32 获取flash剩余大小 esp32内部flash_数据_14

四、实例——基于片内Flash的提示音播放程序

1.音频准备

  • 安装音频处理软件

百度安装网盘:
链接:https://pan.baidu.com/s/1FgJ8f_XZflNWyB_T2SX3sA 提取码:qwer

2.录制“您好欢迎光临 ”

  • 点击录制按钮选择录音时间为2s
    注意:如果没打开麦克风权限,会开始失败!
  • 录音波形如图

3.生成wav文件

  • 打开后一直点着拖动可以选取截取音频范围,然后点击修剪
  • 点击效果->重取样,将采样频率改成8000HZ
  • 点击文件→保存转换→编辑预设→选择8bit 单→设置名称
  • 点击文件->保存转换->Wave->8*8
  • 将修建好的音频以.wav格式保存

4.将.wav文件转换成十六进制

用ultraEdit打开刚刚生成的.wav文件

esp32 获取flash剩余大小 esp32内部flash_stm32_15

  • CTRL+A,接着鼠标右键,选择 十六进制复制选定视图,将内容粘贴到一个新建文件中
  • 全选后,右键选择范围,选中十六进制的范围
  • 将复制的数据粘贴到notePad++中
  • 采用列编辑,在每一列前面加上0x

5.将生成的音频十六进制写入FLASH

使用野火例程代码
链接:https://pan.baidu.com/s/1n6D4TDhnKX2DxjeOgsxBqQ 提取码:qwer

  • 将生成的音频十六进制放入到Sine12bit中

    将代码烧入到STM32芯片中,再通过PCM模块,接到一个蜂鸣器上即可听到声音。

总结

本篇博客介绍了Flash的特点,并通过实例初步讲解了如何合理的使用它,写入Flash的过程并不复杂,但是将音频文件写入Flash的过程确实繁多,因为首先在写入Flash时,要先将音频转成16进制。注意一点,在数据写不进Flash时,有可能是因为你的芯片没有设置成工作模式。