打印

STM32F0 的读保护编程问题.

[复制链接]
11116|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
airwill|  楼主 | 2013-9-9 15:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
查阅了库函数的说明. 这三条应该能够进入读保护一级

        sysrdp = OB_RDP_Level_1;
        FLASH_OB_Unlock();
        FlashStatus = FLASH_OB_RDPConfig(sysrdp);                        // FLASH_COMPLETE
        FLASH_OB_Lock();

跟踪到 FlashStatus 为 FLASH_COMPLETE.
奇怪的是重新启动, 还是能够调试, 没有成功设置读保护. 不知道为什么?

沙发
guet_new_man| | 2013-9-9 20:19 | 只看该作者
对照数据手册,看是否是指定的flash区域

使用特权

评论回复
板凳
airwill|  楼主 | 2013-9-10 10:36 | 只看该作者
数据手册也没有说得太多, 以为很简单的操作

使用特权

评论回复
地板
IJK| | 2013-9-10 10:39 | 只看该作者
连续运行看看

使用特权

评论回复
5
acgean| | 2013-9-10 13:35 | 只看该作者
从最新的数据手册看:

Option byte programming
The option bytes are programmed differently from normal user addresses. The number of
option bytes is limited to 6 (2 for write protection, 1 for read protection, 1 for hardware
configuration and 2 free bytes for user data). After unlocking the Flash access, the user has
to authorize the programming of the option bytes by writing the same set of KEYS (KEY1
and KEY2) to the FLASH_OPTKEYR register to set the OPTWRE bit in the FLASH_CR
register (refer to Unlocking the Flash memory for key values). Then the user has to set the
OPTPG bit in the FLASH_CR register and perform a half-word write operation at the desired
Flash address.

前面应该还有个 unlocking the Flash access 的操作. 请楼主再分析一下

使用特权

评论回复
6
airwill|  楼主 | 2013-9-11 08:53 | 只看该作者
谢谢楼上的提醒, 确实是资料还看得不够仔细. 这 5 个单词很重要, 却被忽略了.
库函数里只提到要 FLASH_OB_Unlock()

使用特权

评论回复
7
aozima| | 2014-8-27 12:30 | 只看该作者
我也遇到问题了,使用
#if 1
    if(SET != FLASH_OB_GetRDP())
    {
        printf("Flash read protection not set, protection.....\n");
        FLASH_Unlock();
        FLASH_OB_Unlock();
        FLASH_OB_RDPConfig(OB_RDP_Level_2);
        FLASH_OB_Lock();
        FLASH_Lock();
        printf("protection done\n");
        FLASH_OB_Launch();
        printf("FLASH_OB_Launch\n");
    }
#endif /* Flash read protection */
这段代码加密以后,JTAG还是可以读出所有内容。
但用J-Flash中的加密后就不能读了,要解锁会自动擦除全部。
求指教

使用特权

评论回复
8
aozima| | 2014-8-27 12:34 | 只看该作者
我用的是205,执行 FLASH_OB_Launch(); 后芯片也没有复位。
多断电重启几次有时还会进  SET != FLASH_OB_GetRDP()

使用特权

评论回复
9
aozima| | 2014-8-27 12:57 | 只看该作者
直接在调试器的memory观察窗口中观察发现:
FLASH_OB_RDPConfig(OB_RDP_Level_1);确实把值写进去了。
但复位后,值又变回来了。

使用特权

评论回复
10
aozima| | 2014-8-27 13:31 | 只看该作者
问题解决了。

stm32f2xx_flash.c 中有说明
   Any operation of erase or program should follow these steps:
   1. Call the FLASH_OB_Unlock() function to enable the FLASH option control register access

   2. Call one or several functions to program the desired Option Bytes:
      - void FLASH_OB_WRPConfig(uint32_t OB_WRP, FunctionalState NewState) => to Enable/Disable
        the desired sector write protection
      - void FLASH_OB_RDPConfig(uint8_t OB_RDP) => to set the desired read Protection Level
      - void FLASH_OB_UserConfig(uint8_t OB_IWDG, uint8_t OB_STOP, uint8_t OB_STDBY) => to configure
        the user Option Bytes.
      - void FLASH_OB_BORConfig(uint8_t OB_BOR) => to set the BOR Level                          

   3. Once all needed Option Bytes to be programmed are correctly written, call the
      FLASH_OB_Launch() function to launch the Option Bytes programming process.
     
     @NOTE When changing the IWDG mode from HW to SW or from SW to HW, a system
           reset is needed to make the change effective.  

   4. Call the FLASH_OB_Lock() function to disable the FLASH option control register
      access (recommended to protect the Option Bytes against possible unwanted operations)

所以正确的顺序应该是:
#if 1
    if(SET != FLASH_OB_GetRDP())
    {
        printf("Flash read protection not set, protection.....\n");
        FLASH_Unlock();
        FLASH_OB_Unlock();

        //FLASH_OB_WRPConfig();
        FLASH_OB_RDPConfig(OB_RDP_Level_1);
        //FLASH_OB_UserConfig();
        //FLASH_OB_BORConfig();

        printf("protection done\n");
        FLASH_OB_Launch();
        FLASH_OB_Lock();
        FLASH_Lock();
    }
#endif /* Flash read protection */
然后系统重新上电,保护生效。


使用特权

评论回复
11
搞IT的| | 2014-8-28 12:20 | 只看该作者
好热闹啊,我也来看看。。

使用特权

评论回复
12
hunyuanqi| | 2014-9-24 16:06 | 只看该作者
air网友您好,请问怎么使用您的stm32isp进行读保护操作,以及去除读保护的操作?如果读保护后,怎么使用您的软件进行去除读保护的操作?

使用特权

评论回复
13
nyszx| | 2014-9-24 16:28 | 只看该作者
FLASH_Unlock();   //Flash解锁
FLASH_ReadOutProtection(DISABLE);  //Flash读保护禁止  
FLASH_ReadOutProtection(ENABLE);   //Flash读保护允许

使用特权

评论回复
14
nyszx| | 2014-9-24 16:29 | 只看该作者
hunyuanqi 发表于 2014-9-24 16:06
air网友您好,请问怎么使用您的stm32isp进行读保护操作,以及去除读保护的操作?如果读保护后,怎么使用您 ...

FLASH_Unlock();   //Flash解锁
FLASH_ReadOutProtection(DISABLE);  //Flash读保护禁止  
FLASH_ReadOutProtection(ENABLE);   //Flash读保护允许

使用特权

评论回复
15
airwill|  楼主 | 2014-9-24 16:57 | 只看该作者
hunyuanqi 发表于 2014-9-24 16:06
air网友您好,请问怎么使用您的stm32isp进行读保护操作,以及去除读保护的操作?如果读保护后,怎么使用您 ...

我的 STM32ISP 软件,在连接正常后,点击 “编程控制”里的 “T 保护”按钮。会弹出窗口处理保护。

使用特权

评论回复
16
hunyuanqi| | 2014-9-24 19:48 | 只看该作者
airwill 发表于 2014-9-24 16:57
我的 STM32ISP 软件,在连接正常后,点击 “编程控制”里的 “T 保护”按钮。会弹出窗口处理保护。 ...

请问如果我烧写STM32F303VCT6,是不是只要把boot0管脚置高就行了,是不是里面的boot1缺省值是1.

多谢!!!!!!!!!!!!!!!

使用特权

评论回复
17
上官梦舞| | 2019-6-28 17:43 | 只看该作者
aozima 发表于 2014-8-27 13:31
问题解决了。

stm32f2xx_flash.c 中有说明

正解,实测可用。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:欢迎进入 TI 模拟技术论坛!

556

主题

17724

帖子

884

粉丝