stm32 选项字节的使用,u16宽度掉电存储用户数据

2019-07-21 02:41发布

本帖最后由 275891381 于 2018-6-13 22:33 编辑

选项字节是详细参考  http://blog.sina.com.cn/s/blog_bf63e2650102vyi1.html

选项字节
     选项字节用于存储芯片使用者对芯片的配置信息。
目前,所有的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,由芯片使用者自由使用 0x1FFFF804
Data1  字节6。数据字节1,由芯片使用者自由使用 0x1FFFF806
WRP0  字节8。写保护字节0,存储对主存储块的写保护设置。
WRP1  字节10。写保护字节1,存储对主存储块的写保护设置。
WRP2  字节12。写保护字节2,存储对主存储块的写保护设置。
WRP3  字节14。写保护字节3,存储对主存储块的写保护设置。



用户可以使用的是 Data0 Data1 两个u8位置

这样可以用这u16(两个u8)保存自己掉电保存的紧急数据。自己可以合理分配u16的位,发挥使用效果最大化


//用户选项字节
u16  OptionByte;
u16 OptionByte_Read(void)      //两个8字节合成1个16字节使用
{
                u8 high=(*(vu16*)(0x1FFFF804))&0x00ff;//读0x1FFFF804
                u8 low =(*(vu16*)(0x1FFFF806))&0x00ff;//读0x1FFFF806
                return (   (high<<8)+low  );
}
void OptionByte_Write(u16 data)//两个8字节合成1个16字节使用
{
                FLASH_Unlock();//解锁
                FLASH_EraseOptionBytes();//flash为ff时候才能写入,所以先擦除,网上很多不成功就是没擦除
                FLASH_ProgramOptionByteData(0x1FFFF804,data>>8);    //写0x1FFFF804
                FLASH_ProgramOptionByteData(0x1FFFF806,data&0x00ff);//写0x1FFFF806
                FLASH_Lock();  //上锁
}

main 里面
{
                        //简单记录复位次数
                        OptionByte=OptionByte_Read();   
                        printf("OptionByte=0x%4x ",OptionByte);
                        OptionByte_Write(OptionByte+1);

}

串口下载程序的时候可以设置初值
1.JPG




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。