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

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

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

回复评论 (11)

                                 支持白菜,我有你的开发板
点赞  2010-7-27 13:27
                                 我倒~~~
点赞  2010-7-27 13:32
                                 这个ID有些眼晕…
点赞  2010-7-27 13:53
                                 咋都成水贴了~难道还真是没人用过这两个选项字?不用白不用哇~
点赞  2010-7-27 14:13
从库函数的源码中,没有看到有解锁的操作呀?你看的是哪个版本,是不是看错了?

  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. }
复制代码
点赞  2010-7-27 15:01
                                 这个问题有点意思,什么时候有空我试试看。
点赞  2010-7-27 16:51
FLASH->OPTKEYR = FLASH_KEY1;
FLASH->OPTKEYR = FLASH_KEY2;

这个还不是解锁?难道还有别的锁?
我倒是知道还有设置写保护的功能,但那是对FLASH空间的页保护,似乎没说选项字也要保护,而且默认是没写保护的~
点赞  2010-7-27 17:58
难道还要这个?
FLASH->KEYR = FLASH_KEY1;
FLASH->KEYR = FLASH_KEY2;

晕了,我被OPTKEYR 给忽悠了哈哈~~原来是不一样的寄存器~~
点赞  2010-7-27 18:01
看楼主的帖子,以为你知道呢:

void FLASH_Lock  ( void  );
void FLASH_Unlock  ( void  );
点赞  2010-7-27 18:15
                                 高速一瞄,还真以为是同一回事~~~,细细看,原来是被忽悠了
点赞  2010-7-27 18:20
                                 顶一下
点赞  2010-7-28 08:13
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复