你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32学习之Flash(主存储块、系统存储器和选项字节)详解2

[复制链接]
奮闘ing 发布时间:2015-11-23 17:33
选项字节
     选项字节用于存储芯片使用者对芯片的配置信息。
目前,所有的STM32101xx、STM32102xx、STM32103xx、STM32105xx、STM32107xx产品,选项字节都是16字节。但是这16字节,每两个字节组成一个正反对,即,字节1是字节0的反码,字节3是字节2的反码,...,字节15是字节14的反码,所以,芯片使用者只要设置8个字节就行了,另外8个字节系统自动填充为反码。因此,有时候,也说STM32的选项字节是8个字节,但是占了16字节的空间。选项字节的8字节正码概述如下:


RDP   字节0。读保护字节,存储对主存储块的读保护设置。
USER  字节2。用户字节,配置看门狗、停机、待机。
Data0  字节4。数据字节0,由芯片使用者自由使用。
Data1  字节6。数据字节1,由芯片使用者自由使用。
WRP0  字节8。写保护字节0,存储对主存储块的写保护设置。
WRP1  字节10。写保护字节1,存储对主存储块的写保护设置。
WRP2  字节12。写保护字节2,存储对主存储块的写保护设置。
WRP3  字节14。写保护字节3,存储对主存储块的写保护设置。

选项字节写使能

     在FLASH_CR中,有一个OPTWRE位,该位为0时,不允许进行选项字节操作(擦除、编程)。这称为选项字节写使能。只有该位为1时,才能进行选项字节操作。 该位不能软件置1,但可以软件清零。只有向FLASH_OPTKEYR依次写入KEY1和KEY2后,硬件会自动对该位置1,此时,才允许选项字节操作。这称为解锁(打开)选项字节写使能。该位为1后,可以由软件清零,关闭写使能。复位后,该位为0。错误操作不会永远关闭写使能,只要写入正确的键序列,则又可以打开写使能。写使能已打开时,再次打开,不会出错,并且依然是打开的。 很显然,进行选项字节操作前,先要解开闪存锁,然后打开选项字节写使能,之后,才能进行选项字节操作。

选项字节擦除
     建议使用如下步骤对选项字节进行擦除:
1.检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的闪存操作。  

2.解锁FLASH_CR寄存器的OPTWRE位。即,打开写使能。
3.设置FLASH_CR寄存器的OPTER位为1。选择选项字节擦除操作。  

4.设置FLASH_CR寄存器的STRT位为1。
5.等待FLASH_SR寄存器的BSY位变为0,表示操作完成。
6.查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。

7.读出选项字节并验证数据。
由于选项字节只有16字节,因此,擦除时是整个选项字节都被擦除了。

选项字节编程
     建议使用如下步骤对选项字节进行编程:
1.检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的编程操作。  
2.解锁FLASH_CR寄存器的OPTWRE位。即,打开写使能。  
3.设置FLASH_CR寄存器的OPTPG位为1。选择编程操作。  
4.写入要编程的半字到指定的地址。启动编程操作。
5.等待FLASH_SR寄存器的BSY位变为0,表示操作完成。
6.查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。
7.读出写入的选项字节并验证数据。 对选项字节编程时,FPEC使用半字中的低字节并自动地计算出高字节(高字节为低字节的反码),并开始编程操作,这将保证选项字节和它的反码始终是正确的。

主存储块的保护
     可以对主存储块中的数据进行读保护、写保护。 读保护用于保护数据不被非法读出。防止程序泄密。
写保护用于保护数据不被非法改写,增强程序的健壮性。

读保护
     主存储块启动读保护后,简单的说具有以下特性:
1.从主存储块启动的程序,可以对整个主存储块执行读操作,不允许对主存储块的前4KB进行擦除编程操作,可以对4KB之后的区域进行擦除编程操作。
2.从SRAM启动的程序,不能对主存储块进行读、页擦除、编程操作,但可以进行主存储块整片擦除操作。
3.使用调试接口不能访问主存储块。这些特性足以阻止主存储器数据的非法读出,又能保证程序的正常运行。
只有当RDP选项字节的值为RDPRT键值时,读保护才被关闭,否则,读保护就是启动的。因此,擦除选项字节的操作,将启动主存储块的读保护。如果要关闭读保护,必须将RDP选项字节编程为RDPRT键值。并且,如果编程选项字节,使RDP由非键值变为键值(即由保护变为非保护)时,STM32将会先擦除整个主存储块,再编程RDP。芯片出厂时,RDP会事先写入RDPRT键值,关闭写保护功能。

写保护
      STM32主存储块可以分域进行写保护。如果试图对写保护的域进行擦除或编程操作,在闪存状态寄存器(FLASH_SR)中会返回一个写保护错误标志。STM32主存储块每个域4KB,WRP0-WRP3选项字节中的每一位对应一个域,位为0时,写保护有效。对于超过128KB的产品,WRP3.15保护了域31及之后的所有域。显然,擦除选项字节将导致解除主存储块的写保护。

选项字节与它的寄存器映象
我们知道,FPEC有两个寄存器存储了选项字节的映象。那么,选项字节本体(在FLASH中)与映象(在寄存器中)究竟有什么区别呢?
选项字节的本体只是个FLASH,它的作用只是掉电存储选项字节内容而以,真正起作用的是寄存器中的映象。即,一个配置是否有效,不是看本体,而是看映象。而映象是在复位后,用本体的值加载的,此后,除非复位,映象将不再改变。所以,更改本体的数据后,不会立即生效,只有复位加载到映象中后,才会生效。 有一点要注意的是,当更改本体的值,使主存储块读保护变为不保护时,会先擦除整片主存储块,然后再改变本体。这是唯一一个改变本体会引发的动作。但即使这样,读保护依然要等到复位后,加载到映象后,才会解除。
  
关于FLASH编程手册中文版的几处错误(不一定是,但是与我的理解不符)

1.选项字节编程一节中:
对FPEC解锁后,必须分别写入KEY1和KEY2(见2.3.1节)到FLASH_OPTKEYR寄存器,再设置FLASH_CR寄存器的OPTWRE位为’1’,此时可以对选项字节进行编程
实际上,对FLASH_OPTKEYR写入KEY1和KEY2后,OPTWRE位会被硬件置1,而不是用软件写1。这一点在后面的寄存器描述中也可以得到验证。 2.对读保护的描述中:
对读保护的数值对无法理解。正确的应该是,RDP为RDPRT键值时,解除读保护,为其它值时,读保护生效。



看了半天,原来只要几句就可以解决,当然是不考虑其他功能,只是简单的读写操作。
其中写操作如下:
     FLASH_Unlock();  //解锁FLASH编程擦除控制器
     FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);//清除标志位
     /*********************************************************************************
          //               FLASH_FLAG_BSY            FLASH忙标志位
          //               FLASH_FLAG_EOP            FLASH操作结束标志位
          //               FLASH_FLAG_PGERR            FLASH编写错误标志位
          //               FLASH_FLAG_WRPRTERR       FLASH页面写保护错误标净         
     **********************************************************************************/
     FLASH_ErasePage(FLASH_START_ADDR);     //擦除指定地址页
     FLASH_ProgramHalfWord(FLASH_START_ADDR+(addr+i)*2,dat); //从指定页的addr地址开始写
     FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);//清除标志位
     FLASH_Lock();    //锁定FLASH编程擦除控制器

从上面可以看出基本顺序是:解锁-》清除标志位(可以不要)-》擦除-》写半字-》清楚标志位(也可以不要)-》上锁。其中FLASH_START_ADDR是宏定义的0x8000000+2048*255,0x8000000是Flash的起始地址,2048是因为我用的是大容量芯片,根据上一笔记Flash地址可以看出芯片每页容量2K,即2048字节,255表示芯片的最后一页,这个根据不同芯片而定。之所以从后面页写起可以防止储存数据破坏用户程序。addr*2是因为每个数据占用2字节(半字),虽然写入的是1字节数据,但是编程是2字节为单位,也就是说一个字节的数据也会占用两个字节地址。

读操作如下:
    u16 value;
    value = *(u16*)(FLASH_START_ADDR+(addr*2));//从指定页的addr地址开始读

收藏 4 评论4 发布时间:2015-11-23 17:33

举报

4个回答
Paderboy 回答时间:2015-11-23 18:38:07
呵呵。沙发哦。。。。
dsjsjf 回答时间:2015-11-23 21:02:05
顶一下   
枫之叶 回答时间:2016-5-13 09:16:20
很好欸!还给了例子~这下可以对着看了~~
无薪税绵 回答时间:2017-1-26 22:20:06
这资料很好,谢谢楼主了。

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版