打印

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

[复制链接]
19630|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
也就是STM32选项字中,可以被用户使用的两个字节:
位于:0x1FFFF804,0x1FFFF806.这个理论上用STM32的库函数FLASH_ProgramOptionByteData是可以写入的.但我试了,写入后,无论是读FLASH->OBR,还是直接从地址读,都读不出我之前写入的字~
ProgramOptionByteData函数我看了内容,已经包含了FLASH的解锁了,为什么还是写不入呢?奇怪啊奇怪~

这两个选项字,我是打算用来做软加密用的,密文就放这两个选项字里了.比放FLASH里要安全,因为如果选项字中设置了读保护(也就是加密了),那么要在保存当前FLASH内容下,改变这两个用户选项字,基本是不可能的了~因为选项字是一同刷除的,而读保护被刷,FLASH也就被刷了~
评论
xczhaony 2023-2-9 12:24 回复TA
做了试验,使用ST-link utility,STM32F103VC芯片,在执行擦除OPTION BYTES之后,USER DATA的数据还是保持的。所以靠这2个字节放密钥=直接把密钥告诉PJ者。 
沙发
happya1| | 2010-7-27 13:27 | 只看该作者
支持白菜,我有你的开发板

使用特权

评论回复
板凳
电子白菜|  楼主 | 2010-7-27 13:32 | 只看该作者
我倒~~~:L

使用特权

评论回复
地板
hotpower| | 2010-7-27 13:53 | 只看该作者
这个ID有些眼晕…

使用特权

评论回复
5
电子白菜|  楼主 | 2010-7-27 14:13 | 只看该作者
:L咋都成水贴了~难道还真是没人用过这两个选项字?不用白不用哇~

使用特权

评论回复
6
香水城| | 2010-7-27 15:01 | 只看该作者
从库函数的源码中,没有看到有解锁的操作呀?你看的是哪个版本,是不是看错了?

 
FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data)
{
  FLASH_Status status = FLASH_COMPLETE;
  /* Check the parameters */
  assert_param(IS_OB_DATA_ADDRESS(Address));
  status = FLASH_WaitForLastOperation(ProgramTimeout);
  if(status == FLASH_COMPLETE)
  {
    /* Authorize the small information block programming */
    FLASH->OPTKEYR = FLASH_KEY1;
    FLASH->OPTKEYR = FLASH_KEY2;
    /* Enables the Option Bytes Programming operation */
    FLASH->CR |= CR_OPTPG_Set;
    *(__IO uint16_t*)Address = Data;
   
    /* Wait for last operation to be completed */
    status = FLASH_WaitForLastOperation(ProgramTimeout);
    if(status != FLASH_TIMEOUT)
    {
      /* if the program operation is completed, disable the OPTPG Bit */
      FLASH->CR &= CR_OPTPG_Reset;
    }
  }
  /* Return the Option Byte Data Program Status */
  return status;
}

使用特权

评论回复
7
IJK| | 2010-7-27 16:51 | 只看该作者
这个问题有点意思,什么时候有空我试试看。

使用特权

评论回复
8
电子白菜|  楼主 | 2010-7-27 17:58 | 只看该作者
FLASH->OPTKEYR = FLASH_KEY1;
FLASH->OPTKEYR = FLASH_KEY2;

这个还不是解锁?难道还有别的锁?
我倒是知道还有设置写保护的功能,但那是对FLASH空间的页保护,似乎没说选项字也要保护,而且默认是没写保护的~

使用特权

评论回复
9
电子白菜|  楼主 | 2010-7-27 18:01 | 只看该作者
难道还要这个?
FLASH->KEYR = FLASH_KEY1;
FLASH->KEYR = FLASH_KEY2;

晕了,我被OPTKEYR 给忽悠了哈哈~~原来是不一样的寄存器~~

使用特权

评论回复
10
香水城| | 2010-7-27 18:15 | 只看该作者
看楼主的帖子,以为你知道呢:;P

void FLASH_Lock  ( void  );
void FLASH_Unlock  ( void  );

使用特权

评论回复
11
电子白菜|  楼主 | 2010-7-27 18:20 | 只看该作者
高速一瞄,还真以为是同一回事~~~,细细看,原来是被忽悠了:L

使用特权

评论回复
12
初入江湖| | 2010-7-28 08:13 | 只看该作者
顶一下

使用特权

评论回复
13
jungle1989| | 2013-12-30 15:10 | 只看该作者
贴上程序吧,学习下。。

使用特权

评论回复
14
zhyntu| | 2014-7-18 18:31 | 只看该作者
调用FLASH_ProgramOptionByteData前应该用FLASH_OB_Unlock(),结束后FLASH_OB_lock(),跟用户区的flash操作不一样.
用户区FLASH_Unlock(),FLASH_lock().

使用特权

评论回复
15
RolingStone| | 2015-7-6 16:42 | 只看该作者
贴主,不知你还记得关于用户选项字节使用吗?
希望帮忙解答一下!我的也读取不出来,串口输出总是0xFF 0XFF

#define _USER_DATA0_ADDR        0x1FFFF804
#define _USER_DATA1_ADDR        0x1FFFF806
//读出上次断电前
//保存在user data option bytes中
void StatuesPop_inOB(void)
{
        u8 data1 ;
        u16 data2;
       
        //FLASH_Unlock();
        data2 = OB->RESERVED0;//*(__IO uint16_t*)_USER_DATA0_ADDR;//
       
        Usart1_SendBlock(&data2,2);
        if(data1>0 &&data1<4)
        {
                g_move_status=(enum Move_status)data1;
                Usart1_SendByte((u8) data1);
        }
        else
                g_move_status=Move_hold ;
        //FLASH_Lock();
}
//写入最新状态值
//保存在user data option bytes中
void StatuesPush_inOB(void)
{
        u8 n=3;
        static u32 time_interval;
       
        if(g_sys_10ms-time_interval>50)//500ms 保存一次
        {
                //FLASH_Unlock();
                FLASH_OB_Unlock();
                while(n--)
                {
                        FLASH_ProgramOptionByteData(_USER_DATA0_ADDR, g_move_status);
                }
                //FLASH_OB_Launch();
                FLASH_OB_Lock();
                //FLASH_Lock();
                time_interval= g_sys_10ms ;
        }
}

使用特权

评论回复
16
加油吧小鱼儿| | 2015-11-23 14:07 | 只看该作者
我这里也有个疑问,就是用Segger烧录的时候出现两个选项 ,有的后面有allow opt. bytes,后面同样多出来16Bytes+。。。,这16Bytes不知道是什么意思?

QQ图片20151123140334.png (32.7 KB )

QQ图片20151123140334.png

使用特权

评论回复
17
siwuxia| | 2016-1-1 11:06 | 只看该作者
16Bytes option bytes

使用特权

评论回复
18
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

11.png (34.81 KB )

11.png

使用特权

评论回复
19
zzfei90| | 2018-12-12 12:57 | 只看该作者
本帖最后由 zzfei90 于 2018-12-12 12:59 编辑
zhang00956 发表于 2018-9-20 15:31
好多年过去了,楼上两位也不知道解决没有,我解决了,问题在于keil的debug选项。
首先代码如下
u16 Option ...

厉害了,这个都被你找到原因了,谢谢!我现在主要是在调试的时候经常发现WDG那个被改写,也就是被改成硬件看门狗,然后在引导程序里面就一直复位(因为我引导程序里面没有使用看门狗,所以没有喂狗),这个的原因现在也不知道在哪,不知道是不是程序运行到哪个关键地方的时候,突然开始下载程序导致的

使用特权

评论回复
20
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

粉丝