理论教育 STM32单片机内部Flash写过程解析

STM32单片机内部Flash写过程解析

更新时间:2025-09-11 理论教育 版权反馈
【摘要】:Flash的写入地址必须是偶数。再往Flash密钥寄存器FLASH_KEYR中写入KEY2=0xCDEF89AB。STM32提供了扇区擦除指令和整个FLASH擦除的指令,批量擦除指令仅针对主存储区。扇区擦除的过程如下。检查FLASH_SR中的BSY位,以确认当前未执行任何其他的内部Flash操作。将FLASH_CR寄存器中的“激活编程寄存器位PG”置1。

Flash的写入地址必须是偶数(FLASH机制决定的FLASH写入的时候只能是偶数地址写入,必须写入半字或字,也就是2个字节或是4字节的内容)。其过程如下所述。

1.解锁(固定的KEY值)

直接调用include"stm32f10x_flash.h"中的void FLASH_Unlock(void)函数,这个函数是官方提供的。

(1)往Flash密钥寄存器FLASH_KEYR中写入KEY1=0x45670123。

(2)再往Flash密钥寄存器FLASH_KEYR中写入KEY2=0xCDEF89AB。

2.数据操作位数

最大操作位数会影响擦除和写入的速度,其中64位宽度的操作除了配置寄存器位外,还需要在Vpp引脚外加一个8~9V的电压源,且其供电间不得超过一小时,否则FLASH可能损坏,所以64位宽度的操作一般是在量产中对FLASH写入应用程序时才使用,大部分应用场合都是用32位的宽度。

3.擦除扇区

直接调用固件库官方的函数FLASH_Status FLASH_ErasePage(uint32_t Page_Address),在写入新的数据前,需要先擦除存储区域。STM32提供了扇区擦除指令和整个FLASH擦除(批量擦除)的指令,批量擦除指令仅针对主存储区。扇区擦除的过程如下。

(1)检查FLASH_SR寄存器中的“忙碌寄存器位BSY”,以确认当前未执行任何Flash操作。

(2)在FLASH_CR寄存器中,将“激活扇区擦除寄存器位SER”置1,并设置“扇区编号寄存器位SNB”,选择要擦除的扇区。(https://www.daowen.com)

(3)将FLASH_CR寄存器中的“开始擦除寄存器位STRT”置1,开始擦除。

(4)等待BSY位被清零时,表示擦除完成。

4.写入数据

擦除完毕后即可写入数据,写入数据的过程并不是仅仅使用指针向地址赋值,赋值前还需要配置一系列的寄存器,步骤如下。

(1)检查FLASH_SR中的BSY位,以确认当前未执行任何其他的内部Flash操作。

(2)将FLASH_CR寄存器中的“激活编程寄存器位PG”置1。

(3)针对所需存储器地址(主存储器块或OTP区域内)执行数据写入操作。

(4)等待BSY位被清零时,表示写入完成。

【实例6-1】

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈