关于STM32片上Flash的读写操作,之前有很多朋友遇到了一些问题,并且提出了相关的疑问。在这里我想简要总结一下。
1写在前面
STM32片上Flash不仅用于存储我们的代码,还可以用来进行自定义的读写操作,比如存储标志位、字库等。
如果对片上Flash的读写操作不慎,可能会导致一些无法挽回的后果,比如修改了应用程序代码导致程序崩溃,或者非正确的操作导致异常中断等。
因此,在进行片上Flash的读写操作时,我们必须避免一些错误的做法。下面将介绍一些关于STM32片上Flash的知识,以便大家能够更全面地了解相关内容。
2Flash闪存接口
STM32片上Flash的闪存接口是在AHB(Advanced High-performance Bus)协议的基础上实现的,它通过对存储器的预取缓存来加速存储器的访问;
闪存接口还提供了在所有工作电压下进行闪存编程和擦除所需的逻辑电路,并包括访问和写入保护以及选项字节的控制。
内置的闪存模块可以在通用地址空间中直接寻址,通过对任何32位数据进行读取操作,可以访问闪存模块的内容并获取相应的数据。
3STM32片上Flash容量
STM32片上Flash容量大小与芯片的型号有关,具体大小可以参看命名规则:
![image-20231229202548671](https://lxlinux.superbed.verylink.top/item/658ebafec458853aef7756bf.png)
而我们也可以通过读取Flash容量寄存器,或通过STM32 ST-LINK Utility工具获取芯片容量。具体可以参看我的另一篇文章《关于STM32的这几个寄存器》
4Flash闪存模块的组织
STM32的Flash,有的是分页,而有的却是分块,具体可以查阅“参考手册”。
比如:STM32F0、 F1、 F3、 L1等就是按Page页来划分的,如下图:
![image-20231229202554244](https://lxlinux.superbed.verylink.top/item/658ebafec458853aef77569c.png)
而像STM32F2、F4等就是按Sector扇区来划分,如下图:
![image-20231229202557941](https://lxlinux.superbed.verylink.top/item/658ebafec458853aef7756e5.png)
所以,如果移植代码,从Page页移植到Sector扇区,或者从Sector扇区移植到Page页,这部分底层代码必须要修改才行。
5非对其写操作
STM32为32位的MCU,即4个字节。如果不是按照4个字节的写Flash,将导致Faults异常。
写Flash过程:
![image-20231229202601514](https://lxlinux.superbed.verylink.top/item/658ebafec458853aef7756d3.png)
这里大家可以参看我之前分享的文章:
**
**
6写操作不响应代码或数据读取
对STM32内部FLash的写操作,相对于执行指令是比较耗时的。从数据手册可以得出16位数据编程时间再40 — 70us。
![image-20231229202604614](https://lxlinux.superbed.verylink.top/item/658ebafec458853aef7757aa.png)
从STM32编程手册中,可以知道:在进行写或擦除操作时,不能进行代码或数据的读取操作。
比如:你在写Flash期间有接收串口数据,很有可能会丢串口数据。
因为比较耗时,所以,在写数据时,CPU不会执行其他操作。
简单说:在写Flash时,CPU 不能取指令,导致中断得不到及时响应,从而发生接收到的数据未及时读走而被覆盖的现象。
遇到这种情况,解决的办法:使用DMA。DMA不需要CPU干预,一旦 USART 有数据接收到,由 DMA 负责将其传输至循环缓冲区中。软件定期检测循环缓冲区中是否有接收到的数据,如果有则加以处理。
提示:
如果你的代码会反复读Flash,建议使用外部Flash。
不知道还遗漏了哪些重要内容,暂时只想到这些,有需要补充的,可以留言。
以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !
![137e00002230ad9f26e78-265x300](https://lxlinux.superbed.verylink.top/item/658ebafec458853aef77568e.png)