打印
[应用方案]

G32A1445芯片解锁偏方

[复制链接]
649|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lengrudie|  楼主 | 2024-8-23 09:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 lengrudie 于 2024-8-23 09:23 编辑

       我们在使用芯片做产品的时候,都希望能够保护自己的代码不被人恶意读取和更改,这就需要使能芯片的安全模式。0x400-0x40F地址区域是一个专门的16字节配置区域用来存储安全、保护及MCU启动的一些配置信息,但是如果使能安全模式下不小心操作JLINK连接导致禁用了大规模擦除功能,就等于是禁用了调试仿真功能。(使用非正版工具出现的几率是有的!!!)
       芯片处于安全模式,大规模擦除也被禁止,芯片里面的程序还正常在运行(串口打印在继续)。这种情况应该是客户程序操作解锁程序里JLINK异常导致的。这时候,不能用JLINK等烧录工具连接芯片,也就不能在J-LINK commander工具中通过输入命令unlock Kinetis执行mass erase指令来解密MCU,只能执行FLASH指令,用芯片内部指令Erase All Blocks command指令0x44擦除程序。这个指令只能在程序里执行,也只能通过这样的方式恢复芯片再次可烧录程序。
       此时,需要在代码上增加一个功能,要在程序里有一个隐藏的串口或其它通信接口指令可以执行Erase All Blocks command指令0x44擦除程序,这样既可以保护芯片不被恶意读取程序,也可以在需要程序更新的情况下恢复芯片,解除安全状态。下面是关键代码:
//关键函数
STATUS_T FLASH_EraseAllBlock(constFLASH_SSD_CONFIG_T * ssdCfg)
{
   STATUS_T returnValue;

   /* Check OCI** to verify the previous command is completed */
   if(0U != (FLASH->STS.reg & 0x80U)>>7U)
    {
       /* Clear COLE** & ACCE** & PROV** flag in flash statusregister. Write 1 to clear */
       FLASH->STS.reg = (uint8_t)0x70U;

       FLASH->CCMDDATA0.reg = FTFx_ERASE_ALL_BLOCK;//擦除指令

        /* Execute the command */
       returnValue = FLASH_CommandSequence(ssdCfg);
    }
   else
    {
       returnValue = STATUS_BUSY;
    }

   return returnValue;
}
//相关函数
FUNCTION_DEFINITION_AT_RAMSECTION_START
static STATUS_T FLASH_CommandSequence(constFLASH_SSD_CONFIG_T * ssdCfg)
{
   STATUS_T returnValue = STATUS_SUCCESS;
   /* Clear OCI** to launch command */
   FLASH->STS.reg = (uint8_t)(0x80U);

   while (((FLASH->STS.reg >> 7U) & 0x01U) == 0)
    {
       /* Wait till OCI** bit is set
        * Serve callback function as often as possible
        */
       if(ssdCfg->callBack != CALLBACK_IS_NULL)
       {
           /* Temporarily disable compiler's check for ROM access call from withina ram function.
            * The use of a function pointer type makes this check irrelevant.
            * Nevertheless, it is imperative that the user-provided callback bedefined in RAMSECTION */
           FUNCTION_CALL_AT_RAMSECTION_CHECK_DISABLE
           (ssdCfg->callBack)();
           FUNCTION_CALL_AT_RAMSECTION_CHECK_ENABLE
       }
    }
   /* Check for protection violation error */
   if ((FLASH->STS.reg & (0x01U | 0x10U |0x20U | 0x40U)) != 0U)
    {
       returnValue = STATUS_ERROR;
    }

   return returnValue;
}
FUNCTION_DEFINITION_AT_RAMSECTION_END

如果你们有更好的方法,欢迎大家一起讨论!

使用特权

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

本版积分规则

15

主题

50

帖子

1

粉丝