STM32 闪存编程总结 下载本文

1、 STM32小容量和中容量(flash 256k以内)的每个页为1k,大容量(256k及以上)、互联型

(什么容量都有)的为2k。

2、 其中Flash中有一个信息块,包括系统存储器(片内boot)、选项字节(控制读写保护、

用户选项字节、用户自定义信息)。

3、 STM32 上电是flash操作相关寄存器是锁定的,不允许flash相关寄存器操作(包括擦写、

编程、选项字节读写(读写保护配置(默认出厂为读写保护都无效)等)),如果需要以上操作需要先解锁Flash寄存器。 4、 Flash寄存器解锁:

1、 往FLASH_KEY里依次写KEY1 (0x45670123)、 KEY2 ( 0xCDEF89AB )。 2、 可通过判断FLASH_CR的LOCK位(1为锁住),进行判断当前是否锁住; 3、 可往FLASH_CR的LOCK位写1来从新锁定flash寄存器。

5、 选项字节操作

a) 选项字节擦除

1、先执行Flash寄存器解锁(如果之前没解过锁);

2、再执行OPT寄存器解锁:FLASH_OPTKEYR里依次写KEY1 (0x45670123)、 KEY2 ( 0xCDEF89AB );

3、再FLASH_CR寄存器的OPTWRE位写1允许编程或擦除选项字节; 4、再FLASH_CR寄存器的OPTER位写1后; 5、以及FLASH_CR的STRT位写1; 6、判断FLASH_SR的BUSY直到完成。

7、等完成需清除FLASH_CR寄存器的OPTER位; 8、系统复位重新加载后生效,到此擦除选项字节后flash读保护有效、写保护已经解除。 (flash读保护开启时,程序不能jtag调试,但可用jtag ram执行解锁程序来解锁)

b) flash关闭读保护

如果需要关闭读保护,需要先通过a)选项字节擦除过程(不需要先系统复位,即步骤8不需要执行),接着执行以下操作:( 此操作比较危险因为会擦除整个flash)。

8、FLASH_CR的OPTPG位写1;

9、0x1FFFF800位置的RDP写入半字0x00A5; 10、判断FLASH_SR的BUSY直到完成。

11、等完成需清除FLASH_CR寄存器的OPTPG位;

12、系统复位重新加载后生效,可通过FLASH_OBR[1]中RDPRT读出1表示读保护。

c) flash写保护关闭

1、 整片flash写保护关闭可以通过a)选项字节擦除过程来实现,擦除并系统复位后写

保护无效,读保护有效;

2、 部分flash写保护关闭,需要先通过a)选项字节擦除过程(不需要先系统复位,即

步骤8不需要执行),再重写入0到需保护的对应位,可参考flash关闭读保护

流程(通过写对应的选项字节来实现)。

3、 可通过读FLASH_WRPR来获取对应那些页具有写保护(1表示写保护失效)。

注:

1、对于大容量和互联型产品,从第0页至第61页,写保护是以每2页为单位实现的,剩下的存储器块(大容量产品的第62页至第255页,和互联型产品的第62页至第127页)则是同时提供保。

2、对于小容量和中容量的产品,写保护是以每4页为单位实现。

3、选项字节包含用户选项字节,擦除后,如果需要特殊用途还需将其修改回来(一般不需要管),包括:

— 选择看门狗事件:硬件或软件 ─ 进入停机(STOP)模式时的复位事件 ─ 进入待机模式时的复位事件

6、 Flash页擦除:

1、 先执行Flash寄存器解锁(如果之前没解过锁); 2、 然后往FLASH_CR的PER位写1; 3、 然后FLASH_AR里写入页首地址; 4、 FLASH_CR的STRT位写1后;

5、 判断FLASH_SR的BUSY直到完成; 6、 等完成一页擦除需清除PER位;

7、 如果需要下一页擦除,需要重新开始所有步骤才行。

7、 Flash半字编程:

1、 先执行Flash寄存器解锁(如果之前没解过锁); 2、 然后往FLASH_CR的PG位写1; 3、 然后往目标Addr写入半字后; 4、 判断FLASH_SR的BUSY直到完成; 5、 再依次往下一半字地址写和判断状态; 6、 循环写操作;

7、 等全部写完需清除PG位。