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