打印
[STM32F4]

加入读保护的步骤疑问?

[复制链接]
1542|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函数中,初始化完串口后就加入下面这段代码:
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.对于上述产品,需要远程升级的话,也需要用户这样做:接上下载线->升级程序->拆机->拔下电池->接上电池->装机。
这样用户体验就很差,是否有更好的解决办法?

@香水城

沙发
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的启动代码协议,发现里面是有解除和加入读保护命令的。
所以远程升级可以先解除读保护再写入代码,然后加入读保护即可。

但是,仍然会有必须全部断电才能正常工作的问题
@香水城

使用特权

评论回复
5
KC_CEC|  楼主 | 2015-5-4 14:39 | 只看该作者
连ST官方的IAP远程升级方案都不支持读保护

使用特权

评论回复
6
泰山特曲123| | 2015-5-4 18:37 | 只看该作者
为什么再烧写芯片时使能读保护呢,而要通过iap来实现

使用特权

评论回复
7
KC_CEC|  楼主 | 2015-5-4 21:38 | 只看该作者
泰山特曲123 发表于 2015-5-4 18:37
为什么再烧写芯片时使能读保护呢,而要通过iap来实现

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

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

唯一的问题是,启动读保护后需要完全断电后再上电才能正常运行。

使用特权

评论回复
8
泰山特曲123| | 2015-5-4 23:13 | 只看该作者
你可以在烧写hex文件的时候就通过st-link把读保护使能,没有必要在代码中来实现。在代码中使能读保护,是要断电重启的。你想在代码中把读保护清除,是不行的,因为清除读保护后,将会执行全片擦除。

使用特权

评论回复
9
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硬件决定的,跟用什么方法无关。

使用特权

评论回复
10
KC_CEC|  楼主 | 2015-5-6 19:18 | 只看该作者
想了想,其实远程升级不需要那么麻烦,自己写个IAP程序就可以了。
出厂的时候也就是通断一下电而已,整个过程还是可以接受的。

那么,结贴了

使用特权

评论回复
11
zh113214| | 2015-5-6 22:24 | 只看该作者

使用特权

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

本版积分规则

20

主题

169

帖子

1

粉丝