STM32 FALSH闪存编程原理

一、STM32编程方式

1、在线编程(icp in-cricuit programing)

通过JTAP/SWD协议或者系统加载程序(BOOTLOADER)下载用户应用程序到微控制器中

2、在程序中编程(IAP,in application programming)

通过任何一种通信接口(如IO口,USB,CAN,UART,I2C,SPI)等下载程序或者应用数据到存储器中,也就是说,STM32允许用户在应用程序中重新烧写闪存存储器中的内容。然而IAP需要至少有一部分程序已经使用ICP方式烧写到闪存存储器中(bootloader)

在线编程的boolloader是已经固化在系统存储区中的
在程序中编程的boolloader是我们写的一段代码,通过在线编程的方式下载到芯片中,用于将程序跳转到flash中的某个区域中运行。

二、闪存模块存储器组织

按照不同容量
存储器组织成32个 1K字节/页(小容量)
存储器组织成128个 1K字节/页(中容量)
存储器组织成256个 2K字节/页(大容量)

一个闪存模块组织(大容量)分为以下三部分:
1、主存储器 (分为N个页,每页多少个字节,是存储器容量的指标)
主要用来存放代码和数据常数,起始地址为0x08000000,B0,B1接GND时运行0x08000000开始运行代码
2、信息块 分为两个小部分,其中启动程序代码(系统存储器),是用来存储ST自带的启动程序,用于串口下载代码,当B0接V3.3,B1接GND时候,运行的就是这部分的代码,用户选择字节,则一般用于配置写保护,读保护等功能。
3、闪存存储器接口寄存器,该部分用于控制闪存读写中,是整个闪存模块的控制机构

对于主存储器和信息块的写入由闪存编程/擦除控制器FPEC管理,编程与擦除的高电压由内部产生

三、FLASH内存的读取

内置闪存模块可以通过地址空间直接寻址,在任何32位数据的读操作都能访问闪存模块的内容并得到相应的数据
例如,我们要从地址addr,读取一个半字(半字为16位,字为32位),可以通过如下的语句读取

data = *(vu16 *)addr;

将addr强制转换为vu16指针,然后取改指针所指向的地址的值,即得到addr地址的值,类似的,将上面的vu16改为vu8,即可读取指定地址的一个字节

四、FLASH内存的写和擦除

STM32的闪存编程是由FPEC(闪存编程和擦除控制器)模块处理,这个模块包含7个32位的寄存器
FPEC键寄存器FLASH_KEYR
选择字节键寄存器 FLASH_OPTKEYR
闪存控制寄存器 FLASH_CR
闪存状态寄存器 FLASH_SR
闪存地址寄存器 FLASH_AR
选择字节寄存器 FLASH_OBR
写保护寄存器 FLASH_WRPR

其中FPEC共有三个键值:
RDPRT键 = 0x000000a5
KEY1=0X45671234
KEY2=0XCDEF89AB

擦除操作分为页擦除和全片擦除
页擦除:
①、检查FLASH_CR的LOCK是否解锁,如果没有则先解锁
②、检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的编程操作
③、设置FLASH_CR寄存器的PER位为1(指定页擦除)
④、用FLASH_AR寄存器选择要擦除的页
⑤、设置FLASH_CR寄存器的STRT位为1(开启页擦除)
⑥、等待BSY位变为1(等待擦除完毕)
⑦、读取被擦除的页并做验证

全片擦除:
①、检查FLASH_CR的LOCK是否解锁,如果没有则先解锁
②、检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的编程操作
③、设置FLASH_CR寄存器的MER位为1(指定全片擦除)
④、设置FLASH_CR寄存器的STRT位为1(开启页擦除)
⑤、等待BSY位变为1(等待擦除完毕)
⑥、读取被擦除的页并做验证

五、FALSH编程的注意事项

1、STM32复位后,FPEC模块是写保护的,不能写入FLASH_CR寄存器,通过写入特定的序列到FLASH_KEYR寄存器可以打开FPEC模块(即KEY1和KEY2),只有在写保护接触后,我们才能操作相关寄存器
2、STM32闪存编程每次必须写入16为,不能单纯写入8位的数据,当FLASH_CR寄存器的PG位为1时,在一个闪存地址写入一个半字将启动一次编程
3、在编程过程中FLASH_SR的BSY位为1,任何读写闪存的操作都会使CPU暂停,直到此次的闪存编程结束
4、STM32的FALSH编程,也必须要求其写入地址的FLASH是被擦除的也就是其值为0XFFFFFFF,否则无法写入

六、FLASH编程的过程

①、检查FLASH_CR的LOCK是否解锁,如果没有则先解锁
②、检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的编程操作
③、设置FLASH_CR寄存器的PG位为1,在指定的地址写入编程的半字
④、等待BSY位变为0
⑤、读出写入的地址并验证数据

你可能感兴趣的:(STM32,stm32,flash,闪存,存储器)