本帖最后由 KC_CEC 于 2015-5-5 08:21 编辑
应用环境:
MCU:stm32f407IGT6(库版本:V1.0.0)
IDE:MDK5.10
根据库文件说明可以知道f4在加入读保护的步骤如下:
1.选项字节解锁
2.写入读保护等级
3.等待写入完毕
4.选项字节加锁
于是我在main函数中,初始化完串口后就加入下面这段代码:static void ReadProtect(void)
{
#if 1
if(SET != FLASH_OB_GetRDP())
{
printf("Flash read protection not set, protection.....\r\n");
FLASH_OB_Unlock();
FLASH_OB_RDPConfig(OB_RDP_Level_1);
printf("protection done\r\n");
FLASH_OB_Launch();
printf("Launch end\r\n");
FLASH_OB_Lock();
}
else
{
printf("have readprotect!\n");
}
#endif
}
理论上来说,单片机只会运行一次加读保护代码,以后的每次开机中均不会再次运行。
那么问题来了:
当下载代码后,发现串口输出表明读保护加上了,但是单片机卡住了。用JLINK并不能进入调试模式了,猜测可能是读保护加成功了。
于是我复位单片机,依然不能正常运行。最后网上说是需要将单片机测底断电一次才能正常运行.
于是我将单片机彻底断电,然后上电果然就好了。用J-Flash测试确实不能读出代码了,也不能烧写了,那么确信加密成功。
这就有疑问了:
1.在加入读保护时,真的是必须要在加密后再测底断电一次吗?
如果真是这样,对于内置电池,整体性较强的产品,出厂时就需要:接上电池->下载程序->拔下电池->接上电池,
这个过程太过麻烦,有没有便捷的解决方案?
2.对于上述产品,需要远程升级的话,也需要用户这样做:接上下载线->升级程序->拆机->拔下电池->接上电池->装机。
这样用户体验就很差,是否有更好的解决办法?
@香水城
|