本帖最后由 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);
}
串口下载程序的时候可以设置初值
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
确认,别的操作,库函数里面都有了
我没有试过标准库的OP字节读写操作,不过在HAL库,写入OP用户字节是需要两步解锁的,先解锁FLASH,然后解锁obFLASH。这样才可以编程OP里面的用户字节。
/*保存程序数据至Flash,实现掉电存储*/
HAL_FLASH_Unlock(); //解锁flash
HAL_FLASH_OB_Unlock(); //解锁flash ob
FLASH_OBProgramInitTypeDef obData; //定义flash ob编程结构体变量
HAL_FLASHEx_OBGetConfig(&obData); //读取原ob数据
HAL_FLASHEx_OBErase(); //ob数据擦除
obData.DATAAddress = OB_DATA_ADDRESS_DATA0; //设置用户字节0的flash地址
obData.DATAData = ch; //修改用户字节0的内容,保存工作信道号至Flash保存
obData.OptionType = OPTIONBYTE_DATA; //操作模式设定为用户字节操作
while(HAL_FLASHEx_OBProgram(&obData) != HAL_OK); //写入修改后的ob结构体数据
HAL_FLASH_OB_Lock(); //锁定flash ob
HAL_FLASH_Lock(); //锁定flash
没试,你可以试试,要是都擦出了,你可以向4楼那样,全部读出来改了再写进去
一周热门 更多>