首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

关于STM32的FLASH操作(3)

关于STM32的FLASH操作(3)

选项字节编程

建议使用如下步骤对选项字节进行编程:

      1.检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的编程操作。

      2.解锁FLASH_CR寄存器的OPTWRE位。即,打开写使能。

      3.设置FLASH_CR寄存器的OPTPG位为1。选择编程操作。

      4.写入要编程的半字到指定的地址。启动编程操作。

      5.等待FLASH_SR寄存器的BSY位变为0,表示操作完成。

      6.查询FLASH_SR寄存器的EOP位,EOP1时,表示操作成功。

7.读出写入的选项字节并验证数据。

对选项字节编程时,FPEC使用半字中的低字节并自动地计算出高字节(高字节为低字节的反码),并开始编程操作,这将保证选项字节和它的反码始终是正确的。

主存储块的保护

可以对主存储块中的数据进行读保护、写保护。

读保护用于保护数据不被非法读出。防止程序泄密。

写保护用于保护数据不被非法改写,增强程序的健壮性。

读保护

主存储块启动读保护后,简单的说具有以下特性:

1.从主存储块启动的程序,可以对整个主存储块执行读操作,不允许对主存储块的前4KB进行擦除编程操作,可以对4KB之后的区域进行擦除编程操作。

2.从SRAM启动的程序,不能对主存储块进行读、页擦除、编程操作,但可以进行主存储块整片擦除操作。

      3.使用调试接口不能访问主存储块。

这些特性足以阻止主存储器数据的非法读出,又能保证程序的正常运行。

只有当RDP选项字节的值为RDPRT键值时,读保护才被关闭,否则,读保护就是启动的。因此,擦除选项字节的操作,将启动主存储块的读保护。如果要关闭读保护,必须将RDP选项字节编程为RDPRT键值。并且,如果编程选项字节,使RDP由非键值变为键值(即由保护变为非保护)时,STM32将会先擦除整个主存储块,再编程RDP

芯片出厂时,RDP会事先写入RDPRT键值,关闭写保护功能。

写保护

STM32主存储块可以分域进行写保护。

如果试图对写保护的域进行擦除或编程操作,在闪存状态寄存器(FLASH_SR)中会返回一个写保护错误标志。

STM32主存储块每个域4KBWRP0-WRP3选项字节中的每一位对应一个域,位为0时,写保护有效。对于超过128KB的产品,WRP315保护了域31及之后的所有域。

显然,擦除选项字节将导致解除主存储块的写保护。

选项字节与它的寄存器映象

我们知道,FPEC有两个寄存器存储了选项字节的映象。那么,选项字节本体(在FLASH中)与映象(在寄存器中)究竟有什么区别呢?

选项字节的本体只是个FLASH,它的作用只是掉电存储选项字节内容而以,真正起作用的是寄存器中的映象。即,一个配置是否有效,不是看本体,而是看映象。而映象是在复位后,用本体的值加载的,此后,除非复位,映象将不再改变。所以,更改本体的数据后,不会立即生效,只有复位加载到映象中后,才会生效。

有一点要注意的是,当更改本体的值,使主存储块读保护变为不保护时,会先擦除整片主存储块,然后再改变本体。这是唯一一个改变本体会引发的动作。但即使这样,读保护依然要等到复位后,加载到映象后,才会解除。



关于FLASH编程手册中文版的几处错误(不一定是,但是与我的理解不符)
1.选项字节编程一节中:
FPEC解锁后,必须分别写入KEY1KEY2(2.3.1)FLASH_OPTKEYR寄存器,再设置FLASH_CR寄存器的OPTWRE位为’1’,此时可以对选项字节进行编程
实际上,对FLASH_OPTKEYR写入KEY1KEY2后,OPTWRE位会被硬件置1,而不是用软件写1。这一点在后面的寄存器描述中也可以得到验证。
2.对读保护的描述中:
对读保护的数值对无法理解。正确的应该是,RDPRDPRT键值时,解除读保护,为其它值时,读保护生效。
继承事业,薪火相传
返回列表