关于STM32片上Flash读写操作,之前很多朋友遇到过坑,也问过很多相关的问题,这里再简单总结一下。
1写在前面
STM32片上Flash除了存储我们的代码,多余的空间还可以供我自己编程(读写)。比如,存储标志位、字库等。
如果对片上Flash读写操作不当,将会导致不可挽回的结局。比如:修改了应用程序代码导致程序跑飞,非对其操作导致异常中断等。
因此,我们对片上Flash读写操作时,一定要避免一些错误的做法。下面将讲述一些关于STM32片上Flash的知识,让大家掌握更多相关知识。
2
Flash闪存接口
STM32片上Flash闪存接口是在AHB协议上实现了对指令和数据的访问,它通过对存储器的预取缓存,加快了存储器的访问;
闪存接口还实现了在所有工作电压下对闪存编程和擦除所需的逻辑电路,这里还包括访问和写入保护以及选项字节的控制。
内置闪存模块可以在通用地址空间直接寻址,任何32位数据的读操作都能访问闪存模块的内容并得到相应的数据。
3
STM32片上Flash容量
STM32片上Flash容量大小与芯片的型号有关,具体大小可以参看命名规则:
而我们也可以通过读取Flash容量寄存器,或通过STM32 ST-LINK Utility工具获取芯片容量。具体可以参看我的另一篇文章《关于STM32的这几个寄存器》
4
Flash闪存模块的组织
STM32的Flash,有的是分页,而有的却是分块,具体可以查阅“参考手册”。
比如:STM32F0、 F1、 F3、 L1等就是按Page页来划分的,如下图:
而像STM32F2、F4等就是按Sector扇区来划分,如下图:
所以,如果移植代码,从Page页移植到Sector扇区,或者从Sector扇区移植到Page页,这部分底层代码必须要修改才行。
5
非对其写操作
STM32为32位的MCU,即4个字节。如果不是按照4个字节的写Flash,将导致Faults异常。
写Flash过程:
这里大家可以参看我之前分享的文章:
1.位带别名区最低有效位
2.谈谈STM32(CM3)的Faults异常
6
写操作不响应代码或数据读取
对STM32内部FLash的写操作,相对于执行指令是比较耗时的。从数据手册可以得出16位数据编程时间再40 --- 70us。
从STM32编程手册中,可以知道:在进行写或擦除操作时,不能进行代码或数据的读取操作。
比如:你在写Flash期间有接收串口数据,很有可能会丢串口数据。
因为比较耗时,所以,在写数据时,CPU不会执行其他操作。
简单说:在写Flash时,CPU 不能取指令,导致中断得不到及时响应,从而发生接收到的数据未及时读走而被覆盖的现象。
遇到这种情况,解决的办法:使用DMA。DMA不需要CPU干预,一旦 USART 有数据接收到,由 DMA 负责将其传输至循环缓冲区中。软件定期检测循环缓冲区中是否有接收到的数据,如果有则加以处理。
提示:
如果你的代码会反复读Flash,建议使用外部Flash。
全部0条评论
快来发表一下你的评论吧 !