目录
一、Flash地址空间的数据读取
1、Flash简介
Flash全名叫做Flash Memory,从名字就能看出,是种数据存储设备,存储设备有很多类,Flash属于非易失性存储设备(Non-volatile Memory Device),与此相对应的是易失性存储设备(Volatile Memory Device)。关于什么是非易失性/易失性,从名字中就可以看出,非易失性就是不容易丢失,数据存储在这类设备中,即使断电了,也不会丢失,这类设备,除了Flash,还有其他比较常见的入硬盘,ROM等,与此相对的,易失性就是断电了,数据就丢失了,比如大家常用的内存,不论是以前的SDRAM,DDR SDRAM,还是现在的DDR2,DDR3等,都是断电后,数据就没了。
2、Flash的硬件实现机制
Flash的内部存储是MOSFET,里面有个悬浮门(Floating Gate),是真正存储数据的单元。
在Flash之前,紫外线可擦除(uv-erasable)的EPROM,就已经采用了Floating Gate存储数据这一技术了。
典型的Flash内存单元的物理结构
数据在Flash内存单元中是以电荷(electrical charge) 形式存储的。存储电荷的多少,取决于图中的外部门(external gate)所被施加的电压,其控制了是向存储单元中冲入电荷还是使其释放电荷。而数据的表示,以所存储的电荷的电压是否超过一个特定的阈值Vth来表示,因此,Flash的存储单元的默认值,不是0(其他常见的存储设备,比如硬盘灯,默认值为0),而是1,而如果将电荷释放掉,电压降低到一定程度,表述数字0。
Flash和普通设备相比所具有的特殊性
3、使用到的硬件及软件
STM32F103C8T6、STlink
软件:Keil、STM32CubeMX
4、STM32CubeMX工程配置
定时器配置
RCC
引脚配置
中断配置
系统时钟树
设置堆栈大小,设置为2k或4k
然后导出
5、keil代码
链接:百度网盘 请输入提取码
提取码:wpsg
将事先准备好的flash.c 及flash.h加入到工程中
如果下载源代码,只需要修改main函数中:
编译无误,进行调试
6、STlink调试说明
事先在电脑上下载好响应的ST-Link驱动
回到Keil下,在魔法棒Option选项卡进行设置
首先是选择调试器,如果使用的是 ST-Link,在 Debug 选项卡中,请选择ST-Link Debugger
,如果你使用的是 JLINK,那么需要选择J-LINK/J-Trace Cortex
。
在选择完调试器之后,点击右边的 Setting 按钮,如果看到以下内容说明连接成功
然后点击红框中的箭头,就可以将程序烧录到stm32中。
注意:使用st-link和keil进行烧录会严格检查stm32型号,如果不是对应的型号烧录会报错。
7、调试
点击仿真调试
View->memory windows->memory 1打开内存观察窗口
View->Watch windows->Watch 1打开一个变量观察窗口,将变量FlashWBuff 和 FlashRBuff加入到 Watch 1 观察窗口
全速运行程序,可以看到数组FlashRBuff中内容与数组FlashWBuff中内容一样了
在Memory 1窗口中可以看到在FLASH地址0x0800C000区成功写入对应内容。
断电,重新上电后再次调试,程序刚停在main入口处时还可以看到Flash对应区间的内容保持上一次写入内容值。
二、基于片内Flash的提示音播放程序
1、使用DAC输出周期2khz的正弦波
打开软件Adobe Audition
文件—>新建—>音频文件
效果->生成->音调
文件->导出->设置导出为wav文件
用UltraEdit得到相关数据
用UltraEdit打开刚才保存的wav文件
CTRL+A,接着鼠标右键,选择 十六进制复制选定视图,将内容粘贴到一个新建文件中
在新建文件中,CTRL+A,接着鼠标右键,选择范围输入起始的行号和列号,确定就选中了整个我们需要的内容
可见复制的是11行到59行的数据
复制到notepad++中
Edit编辑->列块编辑->输入0x
这里借用DAC生成正弦波的例程代码
链接:百度网盘 请输入提取码
提取码:706i
将内容复制到keil文件对应的位置,在下图红框中进行替换。
之后,编译下载,看能否观察到正弦波。
2、使用DAC输出数字音频歌曲数据转换为模拟音频波形输出
步骤跟前面差不多,这里不过多赘述
编辑好代码后,烧录,借助音频模块听听看能否还原。
三、总结
通过此次实验对Flash有了一定的了解
四、参考资料
STM32 进阶教程 13 – FLASH的读写操作_张十三的博客-CSDN博客_stm32f103c8t6flash读写