文章目录
- 〇、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.实验过程
总共用了13分钟,共写入了64K字节
- 查看hello.txt文档
一共有250行数据
3.从SD卡里读出数据
利用FATS从SD卡读出数据,并且串口输出
3.1 代码修改
- 因为要进行读取,所以将写入部分的函数改为读出函数
- 声明读出函数,定义双字节数据类型s,用来保存地址(或者存放指针),再定义字节类型格式的变量和一个存储读取的数组
- ① 修改f_open函数的第三个参数设置为打开状态为FA_READ模式。②文件指针移至相应位置,否则无输出。③指针加地址④使用FATS的read函数,第一个参数是指针,第二个是存储数组,第三个是数组大小,第四个是强制转换br为UINT格式。⑤输出
3.2 结果显示
三、将内容写入flash
源码链接:
链接:https://pan.baidu.com/s/1jJ6_YlAI9W81w7h6c7FVBw
提取码:qwer
1.CubeMX设置
- 将定时器设置成Sys Tick
- 将引脚PC13配置为输出模式,并使能该引脚
- 时钟配置
- 设置堆栈大小
2.代码部分
生成工程文件后,进入MDK,进入代码部分,对代码做如下修改
-
在main.c中加入如下代码
-
修改数据内容( 将数组中写入要存储的数据)
3.硬件连接以及环境配置
- STM32与ST-link连接方式
ST-LINK | STM32 |
---|---|
SWCLK/TCK | SWCLK/TCK |
SWDIO/TMS | SWDIO/TMS |
GND | GND |
VCC | VCC |
-
设置debug为st-link debugger
-
点进去后可以看到要检测出SWDIO有信息即可烧录
4.调试程序
-
编译工程无错误后,点击download下载程序
注意,download后,要将STM32调整至工作模式,并按下复位键 -
进行程序调试,全速运行
-
View->memory windows->memory 1打开内存观察窗口,并在地址栏中输入:0x800c000,观察将要修改的flash区间区容
-
在Memory 1窗口中可以看到在FLASH地址0x0800C000区成功写入对应内容
-
View->Watch windows->Watch 1打开一个变量观察窗口,将变量FlashWBuff 和 FlashRBuff加入到 Watch 1 观察窗口
-
全速运行程序,可以看到数组FlashRBuff中内容与数组FlashWBuff中内容一样了
四、实例——基于片内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文件
- CTRL+A,接着鼠标右键,选择 十六进制复制选定视图,将内容粘贴到一个新建文件中
- 全选后,右键选择范围,选中十六进制的范围
- 将复制的数据粘贴到notePad++中
- 采用列编辑,在每一列前面加上0x
5.将生成的音频十六进制写入FLASH
使用野火例程代码
链接:https://pan.baidu.com/s/1n6D4TDhnKX2DxjeOgsxBqQ
提取码:qwer
- 将生成的音频十六进制放入到Sine12bit中
将代码烧入到STM32芯片中,再通过PCM模块,接到一个蜂鸣器上即可听到声音。
总结
本篇博客介绍了Flash的特点,并通过实例初步讲解了如何合理的使用它,写入Flash的过程并不复杂,但是将音频文件写入Flash的过程确实繁多,因为首先在写入Flash时,要先将音频转成16进制。注意一点,在数据写不进Flash时,有可能是因为你的芯片没有设置成工作模式。
参考资料
EEPROM——百度百科
STM32F103C8T6使用内部Flash的第63页保存参数
STM32 进阶教程 13 – FLASH的读写操作
STM32F103的DAC——输出声音效果