闪存锁
在FLASH_CR中,有一个LOCK位,该位为1时,不能写FLASH_CR寄存器,从而也就不能擦除和编程FLASH,这称为闪存锁。
当LOCK位为1时,闪存锁有效,只有向FLASH_KEYR依次写入KEY1、KEY2后,LOCK位才会被硬件清零,从而解除闪存锁。当LOCK位为1时,对FLASH_KEYR的任何错误写操作(第一次不是KEY1,或第二次不是KEY2),都将会导致闪存锁的彻底锁死,一旦闪存锁彻底锁死,在下一次复位前,都无法解锁,只有复位后,闪存锁才恢复为一般锁住状态。
复位后,LOCK位默认为1,闪存锁有效,此时,可以进行解锁。解锁后,可进行FLASH的擦除编程工作。任何时候,都可以通过对LOCK位置1来软件加锁,软件加锁与复位加锁是一样的,都可以解锁。
主存储块的擦除
主存储块可以按页擦除,也可以整片擦除。
页擦除
主存储块的任何一页都可以通过FPEC的页擦除功能擦除。
建议使用以下步骤进行页擦除:
1.检查FLASH_SR寄存器的BSY位。以确认没有其他正在进行的闪存操作。必须等待BSY位为0,才能继续操作。
2.设置FLASH_CR寄存器的PER位为1。选择页擦除操作。
3.设置FLASH_AR寄存器为要擦除页所在地址,选择要擦除的页。FLASH_AR的值在哪一页范围内,就表示要擦除哪一页。
4.设置FLASH_CR寄存器的STRT位为1,启动擦除操作。
5.等待FLASH_SR寄存器的BSY位变为0,表示操作完成。
6.查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。
7.读出被擦除的页并做验证。擦完后所有数据位都为1。
整片擦除
整片擦除功能擦除整个主存储块,信息块不受此操作影响。
建议使用以下步骤进行整片擦除:
1.检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的闪存操作。
2.设置FLASH_CR寄存器的MER位为1。选择整片擦除操作。
3.设置FLASH_CR寄存器的STRT位为1。启动整片擦除操作。
4.等待FLASH_SR寄存器的BSY位变为0,表示操作完成。
5.查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。
6.读出所有页并做验证。擦完后所有数据位都为1。
主存储块的编程
对主存储块编程每次可以写入16位。当FLASH_CR寄存器的PG位为1时,在一个闪存地址写入一个半字(16位)将启动一次编程;写入任何非半字的数据,FPEC都会产生总线错误。在编程过程中(BSY位为1时),任何读写闪存的操作都会使CPU暂停,直到此次闪存编程结束。
建议使用如下步骤对主存储块进行编:
1.检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的编程操作。
2.设置FLASH_CR寄存器的PG位为1。选择编程操作。
3.在指定的地址写入要编程的半字。直接用指针写。
4.等待FLASH_SR寄存器的BSY位变为0,表示操作完成。
5.查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。
6.读出写入的地址并验证数据。
关于主存储块擦除编程操作的一些疑问
1. 为什么每次都要检查BSY位是否为0?
因为BSY位为1时,不能对任何FPEC寄存器执行写操作,所以必须要等BSY位为0时,才能执行闪存操作。
2. 如果没有擦除就进行编程,会出现什么结果?
STM32在执行编程操作前,会先检查要编程的地址是否被擦除,如果没有,则不进行编程,并置FLASH_SR寄存器的PGERR位为1。唯一例外的是,当要编程的数据为0X0000时,即使未擦除,也会进行编程,因为0X0000即使擦除也可以正确编程。
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |