本帖最后由 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
如果你们有更好的方法,欢迎大家一起讨论! |