提个似乎很少人去研究的问题~STM32选项字的那两个用户字节~

[复制链接]
 楼主| 电子白菜 发表于 2010-7-27 12:32 | 显示全部楼层 |阅读模式
也就是STM32选项字中,可以被用户使用的两个字节:
位于:0x1FFFF804,0x1FFFF806.这个理论上用STM32的库函数FLASH_ProgramOptionByteData是可以写入的.但我试了,写入后,无论是读FLASH->OBR,还是直接从地址读,都读不出我之前写入的字~
ProgramOptionByteData函数我看了内容,已经包含了FLASH的解锁了,为什么还是写不入呢?奇怪啊奇怪~

这两个选项字,我是打算用来做软加密用的,密文就放这两个选项字里了.比放FLASH里要安全,因为如果选项字中设置了读保护(也就是加密了),那么要在保存当前FLASH内容下,改变这两个用户选项字,基本是不可能的了~因为选项字是一同刷除的,而读保护被刷,FLASH也就被刷了~

评论

做了试验,使用ST-link utility,STM32F103VC芯片,在执行擦除OPTION BYTES之后,USER DATA的数据还是保持的。所以靠这2个字节放密钥=直接把密钥告诉PJ者。  发表于 2023-2-9 12:24
happya1 发表于 2010-7-27 13:27 | 显示全部楼层
支持白菜,我有你的开发板
 楼主| 电子白菜 发表于 2010-7-27 13:32 | 显示全部楼层
我倒~~~:L
hotpower 发表于 2010-7-27 13:53 | 显示全部楼层
这个ID有些眼晕…
 楼主| 电子白菜 发表于 2010-7-27 14:13 | 显示全部楼层
:L咋都成水贴了~难道还真是没人用过这两个选项字?不用白不用哇~
香水城 发表于 2010-7-27 15:01 | 显示全部楼层
从库函数的源码中,没有看到有解锁的操作呀?你看的是哪个版本,是不是看错了?


  1. FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data)
  2. {
  3.   FLASH_Status status = FLASH_COMPLETE;
  4.   /* Check the parameters */
  5.   assert_param(IS_OB_DATA_ADDRESS(Address));
  6.   status = FLASH_WaitForLastOperation(ProgramTimeout);
  7.   if(status == FLASH_COMPLETE)
  8.   {
  9.     /* Authorize the small information block programming */
  10.     FLASH->OPTKEYR = FLASH_KEY1;
  11.     FLASH->OPTKEYR = FLASH_KEY2;
  12.     /* Enables the Option Bytes Programming operation */
  13.     FLASH->CR |= CR_OPTPG_Set;
  14.     *(__IO uint16_t*)Address = Data;
  15.    
  16.     /* Wait for last operation to be completed */
  17.     status = FLASH_WaitForLastOperation(ProgramTimeout);
  18.     if(status != FLASH_TIMEOUT)
  19.     {
  20.       /* if the program operation is completed, disable the OPTPG Bit */
  21.       FLASH->CR &= CR_OPTPG_Reset;
  22.     }
  23.   }
  24.   /* Return the Option Byte Data Program Status */
  25.   return status;
  26. }
IJK 发表于 2010-7-27 16:51 | 显示全部楼层
这个问题有点意思,什么时候有空我试试看。
 楼主| 电子白菜 发表于 2010-7-27 17:58 | 显示全部楼层
FLASH->OPTKEYR = FLASH_KEY1;
FLASH->OPTKEYR = FLASH_KEY2;

这个还不是解锁?难道还有别的锁?
我倒是知道还有设置写保护的功能,但那是对FLASH空间的页保护,似乎没说选项字也要保护,而且默认是没写保护的~
 楼主| 电子白菜 发表于 2010-7-27 18:01 | 显示全部楼层
难道还要这个?
FLASH->KEYR = FLASH_KEY1;
FLASH->KEYR = FLASH_KEY2;

晕了,我被OPTKEYR 给忽悠了哈哈~~原来是不一样的寄存器~~
香水城 发表于 2010-7-27 18:15 | 显示全部楼层
看楼主的帖子,以为你知道呢:;P

void FLASH_Lock  ( void  );
void FLASH_Unlock  ( void  );
 楼主| 电子白菜 发表于 2010-7-27 18:20 | 显示全部楼层
高速一瞄,还真以为是同一回事~~~,细细看,原来是被忽悠了:L
初入江湖 发表于 2010-7-28 08:13 | 显示全部楼层
顶一下
jungle1989 发表于 2013-12-30 15:10 | 显示全部楼层
贴上程序吧,学习下。。
zhyntu 发表于 2014-7-18 18:31 | 显示全部楼层
调用FLASH_ProgramOptionByteData前应该用FLASH_OB_Unlock(),结束后FLASH_OB_lock(),跟用户区的flash操作不一样.
用户区FLASH_Unlock(),FLASH_lock().
RolingStone 发表于 2015-7-6 16:42 | 显示全部楼层
贴主,不知你还记得关于用户选项字节使用吗?
希望帮忙解答一下!我的也读取不出来,串口输出总是0xFF 0XFF

  1. #define _USER_DATA0_ADDR        0x1FFFF804
  2. #define _USER_DATA1_ADDR        0x1FFFF806
  3. //读出上次断电前
  4. //保存在user data option bytes中
  5. void StatuesPop_inOB(void)
  6. {
  7.         u8 data1 ;
  8.         u16 data2;
  9.        
  10.         //FLASH_Unlock();
  11.         data2 = OB->RESERVED0;//*(__IO uint16_t*)_USER_DATA0_ADDR;//
  12.        
  13.         Usart1_SendBlock(&data2,2);
  14.         if(data1>0 &&data1<4)
  15.         {
  16.                 g_move_status=(enum Move_status)data1;
  17.                 Usart1_SendByte((u8) data1);
  18.         }
  19.         else
  20.                 g_move_status=Move_hold ;
  21.         //FLASH_Lock();
  22. }
  23. //写入最新状态值
  24. //保存在user data option bytes中
  25. void StatuesPush_inOB(void)
  26. {
  27.         u8 n=3;
  28.         static u32 time_interval;
  29.        
  30.         if(g_sys_10ms-time_interval>50)//500ms 保存一次
  31.         {
  32.                 //FLASH_Unlock();
  33.                 FLASH_OB_Unlock();
  34.                 while(n--)
  35.                 {
  36.                         FLASH_ProgramOptionByteData(_USER_DATA0_ADDR, g_move_status);
  37.                 }
  38.                 //FLASH_OB_Launch();
  39.                 FLASH_OB_Lock();
  40.                 //FLASH_Lock();
  41.                 time_interval= g_sys_10ms ;
  42.         }
  43. }
加油吧小鱼儿 发表于 2015-11-23 14:07 | 显示全部楼层
我这里也有个疑问,就是用Segger烧录的时候出现两个选项 ,有的后面有allow opt. bytes,后面同样多出来16Bytes+。。。,这16Bytes不知道是什么意思?
QQ图片20151123140334.png
siwuxia 发表于 2016-1-1 11:06 | 显示全部楼层
16Bytes option bytes
zhang00956 发表于 2018-9-20 15:31 | 显示全部楼层
本帖最后由 zhang00956 于 2018-9-20 15:33 编辑
RolingStone 发表于 2015-7-6 16:42
贴主,不知你还记得关于用户选项字节使用吗?
希望帮忙解答一下!我的也读取不出来,串口输出总是0xFF 0XFF ...

好多年过去了,楼上两位也不知道解决没有,我解决了,问题在于keil的debug选项。
首先代码如下
u16 OptionByte_Read1(void)      //两个8字节合成1个16字节使用
{
                u8 high=(*(vu16*)(0x1FFFF804))&0x00ff;//读0x1FFFF804
                u8 low =(*(vu16*)(0x1FFFF806))&0x00ff;//读0x1FFFF806
                return (   (high<<8)+low  );
}
void OptionByte_Write1(u16 data)//两个8字节合成1个16字节使用
{
                FLASH_Unlock();
                FLASH_OB_Unlock();//解锁
                FLASH_EraseOptionBytes();//flash为ff时候才能写入,所以先擦除,网上很多不成功就是没擦除
                FLASH_ProgramOptionByteData(0x1FFFF804,data>>8);    //写0x1FFFF804
                FLASH_ProgramOptionByteData(0x1FFFF806,data&0x00ff);//写0x1FFFF806
                FLASH_OB_Lock();  //上锁
                FLASH_Lock();
   
}

int main()
{
    Init_UART2();
                        //简单记录复位次数
   
     OptionByte_Write1(0xa5a5);
    OptionByte=OptionByte_Read1();   
    printf("OptionByte=0x%4x\r\n",OptionByte);

然后再keil烧写器配置中,要把16B的Flash打勾选上,不能只选64KB的那个ROM
156035ba34d0a47eaf.png
11.png
zzfei90 发表于 2018-12-12 12:57 | 显示全部楼层
本帖最后由 zzfei90 于 2018-12-12 12:59 编辑
zhang00956 发表于 2018-9-20 15:31
好多年过去了,楼上两位也不知道解决没有,我解决了,问题在于keil的debug选项。
首先代码如下
u16 Option ...

厉害了,这个都被你找到原因了,谢谢!我现在主要是在调试的时候经常发现WDG那个被改写,也就是被改成硬件看门狗,然后在引导程序里面就一直复位(因为我引导程序里面没有使用看门狗,所以没有喂狗),这个的原因现在也不知道在哪,不知道是不是程序运行到哪个关键地方的时候,突然开始下载程序导致的
lpzxxsp 发表于 2019-4-8 18:21 | 显示全部楼层
zhang00956 发表于 2018-9-20 15:31
好多年过去了,楼上两位也不知道解决没有,我解决了,问题在于keil的debug选项。
首先代码如下
u16 Option ...

层主神人,解决了我的重大问题,非常感谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:近来爱上STM32了 http://www.daxia.com/stm32/

7

主题

53

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部