[STM32F4] 加入读保护的步骤疑问?

[复制链接]
2012|11
 楼主| KC_CEC 发表于 2015-5-4 12:06 | 显示全部楼层 |阅读模式
本帖最后由 KC_CEC 于 2015-5-5 08:21 编辑

应用环境:
MCU:stm32f407IGT6(库版本:V1.0.0)
IDE:MDK5.10

根据库文件说明可以知道f4在加入读保护的步骤如下:
1.选项字节解锁
2.写入读保护等级
3.等待写入完毕
4.选项字节加锁
于是我在main函数中,初始化完串口后就加入下面这段代码:
  1. static void ReadProtect(void)
  2. {
  3.         #if 1
  4.         if(SET != FLASH_OB_GetRDP())
  5.         {
  6.                 printf("Flash read protection not set, protection.....\r\n");
  7.                 FLASH_OB_Unlock();
  8.                 FLASH_OB_RDPConfig(OB_RDP_Level_1);
  9.                 printf("protection done\r\n");
  10.                 FLASH_OB_Launch();
  11.                 printf("Launch end\r\n");
  12.                 FLASH_OB_Lock();
  13.         }
  14.         else
  15.         {
  16.                  printf("have readprotect!\n");
  17.         }
  18.         #endif
  19. }

理论上来说,单片机只会运行一次加读保护代码,以后的每次开机中均不会再次运行。
那么问题来了:
当下载代码后,发现串口输出表明读保护加上了,但是单片机卡住了。用JLINK并不能进入调试模式了,猜测可能是读保护加成功了。
于是我复位单片机,依然不能正常运行。最后网上说是需要将单片机测底断电一次才能正常运行.
于是我将单片机彻底断电,然后上电果然就好了。用J-Flash测试确实不能读出代码了,也不能烧写了,那么确信加密成功。


这就有疑问了:
1.在加入读保护时,真的是必须要在加密后再测底断电一次吗?
如果真是这样,对于内置电池,整体性较强的产品,出厂时就需要:接上电池->下载程序->拔下电池->接上电池,
这个过程太过麻烦,有没有便捷的解决方案?
2.对于上述产品,需要远程升级的话,也需要用户这样做:接上下载线->升级程序->拆机->拔下电池->接上电池->装机。
这样用户体验就很差,是否有更好的解决办法?

@香水城

mmuuss586 发表于 2015-5-4 12:12 | 显示全部楼层
加上软件复位程序看看;
 楼主| KC_CEC 发表于 2015-5-4 12:24 | 显示全部楼层
mmuuss586 发表于 2015-5-4 12:12
加上软件复位程序看看;

试过在加入读保护后就主动复位系统,依然不能运行。
网上明确说了需要完全断电才行。
 楼主| KC_CEC 发表于 2015-5-4 14:31 | 显示全部楼层
通过查看BOOT的启动代码协议,发现里面是有解除和加入读保护命令的。
所以远程升级可以先解除读保护再写入代码,然后加入读保护即可。

但是,仍然会有必须全部断电才能正常工作的问题
@香水城
 楼主| KC_CEC 发表于 2015-5-4 14:39 | 显示全部楼层
连ST官方的IAP远程升级方案都不支持读保护
泰山特曲123 发表于 2015-5-4 18:37 来自手机 | 显示全部楼层
为什么再烧写芯片时使能读保护呢,而要通过iap来实现
 楼主| KC_CEC 发表于 2015-5-4 21:38 | 显示全部楼层
泰山特曲123 发表于 2015-5-4 18:37
为什么再烧写芯片时使能读保护呢,而要通过iap来实现

使能读保护就是为了保护flash程序不被读出啊。
程序每次运行前都会检查有没有加读保护,如果没有就加入读保护啊。

以后通过IAP升级也是可以清除读保护的,这些都没有问题。

唯一的问题是,启动读保护后需要完全断电后再上电才能正常运行。
泰山特曲123 发表于 2015-5-4 23:13 来自手机 | 显示全部楼层
你可以在烧写hex文件的时候就通过st-link把读保护使能,没有必要在代码中来实现。在代码中使能读保护,是要断电重启的。你想在代码中把读保护清除,是不行的,因为清除读保护后,将会执行全片擦除。
 楼主| KC_CEC 发表于 2015-5-5 08:17 | 显示全部楼层
本帖最后由 KC_CEC 于 2015-5-5 08:18 编辑
泰山特曲123 发表于 2015-5-4 23:13
你可以在烧写hex文件的时候就通过st-link把读保护使能,没有必要在代码中来实现。在代码中使能读保护,是要 ...

效果一样的哦,用过STLINK和JLINK,加入读保护以后依然要完全断电才行。
而且用它们清除读保护,还是会全片擦除。这个是ST硬件决定的,跟用什么方法无关。
 楼主| KC_CEC 发表于 2015-5-6 19:18 | 显示全部楼层
想了想,其实远程升级不需要那么麻烦,自己写个IAP程序就可以了。
出厂的时候也就是通断一下电而已,整个过程还是可以接受的。

那么,结贴了
zh113214 发表于 2015-5-6 22:24 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

169

帖子

1

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