STMCU小助手
发布时间:2022-5-16 11:15
|
1、什么是Flash FLASH闪存是属于内存器件的一种,其存储特性相当于硬盘,下图就能看出Flash扇区就等于电脑硬盘分区,但是对Flash进行写数据时必须先进行扇区擦除,然后才能再写入,否则会写入失败,MCU的Flash大小可参考数据手册
2、闪存模块存储器组织 此为STM32F407ZGT6的FLASH大小为1024K
不同容量的STM32F4,拥有的扇区数不一样,比如我们的STM32F407ZGT6,则拥有全部12个扇区。从上图可以看出主存储器的起始地址就是0X08000000, B0、B1都接GND的时候,就是从0X08000000开始运行代码的。 STM32F40x的闪存模块由:主存储器、系统存储器、OPT区域和选项字节等4部分组成: 2.1、主存储器 该部分用来存放代码和数据常数(如const类型的数据)。分为12个扇区,前4个扇区为16KB大小,然后扇区4是64KB大小,扇区5~11是128K大小。 2.2、系统存储器 主要用来存放STM32F4的bootloader代码,此代码是出厂的时候就固化在STM32F4里面了,专门来给主存储器下载代码的。当B0接V3.3,B1接GND的时候,从该存储器启动(即进入串口下载模式)。 2.3、OTP区域 即一次性可编程区域,共528字节,被分成两个部分,前面512字节(32字节为1块,分成16块),可以用来存储一些用户数据(一次性的,写完一次,永远不可以擦除!!),后面16字节,用于锁定对应块。 2.4、选项字节 用于配置读保护、BOR级别、软件/硬件看门狗以及器件处于待机或停止模式下的复位。 3、STM32F4的闪存6个32位寄存器控制 ①访问控制寄存器(FLASH_ACR) ②密钥寄存器(FLASH_KEYR) 其中FPEC 密钥总共有2个键值:
③选项秘钥寄存器(FLASH_OPTKEYR) ④状态寄存器(FLASH_SR) ⑤控制寄存器(FLASH_CR) ⑥选项控制寄存器(FLASH_OPTCR) 相关寄存器的操作可参考《STM32F4xx中文参考手册》的第3.8小节 4、Flash等待周期与CPU时钟频率间的关系 为了准确读取 Flash 数据,必须根据 CPU 时钟 (HCLK) 频率和器件电源电压在 Flash 存取控制寄存器 (FLASH_ACR) 中正确地设置等待周期数 (LATENCY)。当电源电压低于2.1V 时,必须关闭预取缓冲器。
我们供电电压一般是3.3V,所以,在我们设置168Mhz频率作为CPU时钟之前,必须先设置LATENCY为5,否则FLASH读写可能出错,导致死机。 5、FLASH的操作介绍 5.1、读 STM23F4的FLASH读取是很简单的。例如,我们要从地址addr,读取一个字(字节为8位,半字为16位,字为32位),可以通过如下的语句读取: data=*(vu32*)addr; 将addr强制转换为vu32指针,然后取该指针所指向的地址的值,即得到了addr地址的值。类似的,将上面的vu32改vu16,即可读取指定地址的一个半字。 5.2、写 在对 STM32F4的Flash执行写入或擦除操作期间,任何读取Flash的尝试都会导致总线阻塞。只有在完成编程操作后,才能正确处理读操作。这意味着,写/擦除操作进行期间不能从Flash中执行代码或数据获取操作。 注意: 编程前,要确保要写如地址的FLASH已经擦除。 要先解锁(否则不能操作FLASH_CR)。 编程操作对OPT区域也有效,方法一模一样。 5.3、闪存擦除 我们在STM32F4的FLASH编程的时候,先判断首地址是否被擦除了,STM32F4的闪存擦除分为两种:扇区擦除整片擦除。 5.3.1、扇区擦除步骤 ①检查FLASH_CR的LOCK是否解锁,如果没有则先解锁 ②检查FLASH_SR寄存器中的BSY 位,确保当前未执行任何FLASH操作 ③将FLASH_CR控制寄存器的SER位置1,并从主存储块的12个扇区中选择要擦除的扇区 (SNB) ④将FLASH_CR寄存器中的STRT位置1,触发擦除操作 ⑤等待BSY位清零 经过以上五步,就可以擦除某个扇区。 5.3.2、批量/整片擦除步骤 ①检查FLASH_SR寄存器中的BSY 位,确保当前未执行任何FLASH操作 ②在FLASH_CR寄存器中,将MER位置1 (STM32F407xx/405xx/43xxx) ③将FLASH_CR寄存器中的STRT位置1,触发擦除操作 ④等待BSY位清零 经过以上四步,就可以批量擦除扇区。扇区擦除功能可以看《STM32F4xx中文参考手册》第3.5小节。 6、STM32F4的标准编程步骤 ①检查FLASH_SR中的BSY位,确保当前未执行任何FLASH操作。 ②将FLASH_CR寄存器中的PG位置1,激活FLASH编程。 ③针对所需存储器地址(主存储器块或OTP区域内)执行数据写入操作: —并行位数为x8时按字节写入(PSIZE=00) —并行位数为x16时按半字写入(PSIZE=01) —并行位数为x32时按字写入(PSIZE=02) —并行位数为x64时按双字写入(PSIZE=03) ④等待BSY位清零,完成一次编程。 按以上四步操作,就可以完成一次FLASH编程。不过有几点要注意: 1、编程前,要确保要写如地址的FLASH已经擦除 2、要先解锁(否则不能操作FLASH_CR) 3、编程操作对OPT区域也有效,方法一模一样 4、Flash写数据时会把整个扇区擦除掉,所以原来的数据得不到保存,如果想要保存数据,需要分配一个扇区大小的内存去存储原来的数据,占用内存太大,不像SPI的W25Qxx那么方便 7、代码的编写实现 flash.c:
flash.h
|
经验分享 | FDCAN数据段波特率增加后发送失败的问题分析
STM32几种流行开发环境的优缺点
好用软件推荐-TouchGFX Designer
OpenSTLinux 6.1发布:M33-TD加持+安全升级,STM32MPU开发效率翻倍!
【经验分享】STM32CubeIDE汉化
手把手教你VSCode搭建STM32开发环境
RTOS在STM32中的应用
【下载有礼】STM32 Finder华为应用商店正式上线!移动选型工具助力开发效率升级
【2025·STM32峰会】GUI解决方案实训分享5-调通板载的NRF24L01 SPI接口并使用模块进行无线通信(发送和接收)
【2025·STM32峰会】GUI解决方案实训分享2-编译运行TouchGFX咖啡机例程(含桌面仿真)
微信公众号
手机版