嵌入式系统与单片机|技术阅读
登录|注册

您现在的位置是:嵌入式系统与单片机 > 技术阅读 > S9KEAZ MCU FTMRH_FSEC[SEC] 加密位设置

S9KEAZ MCU FTMRH_FSEC[SEC] 加密位设置

    从KEA参考手册中所知,在上电复位期间,FTMRH_FSEC[SEC]从 Flash配置字段的Security字节中进行加载。因此,如果Flash配置字段没有安全加密设置,FTMRH_FSEC[SEC]也不会修改。

    使用开发环境 CodeWarrior IDE 11.0, 配置 MCU S9KEAZ128,检查flash配置字段的值。通过检查Flash,SEC的内容并没有按预期写入,它总是10b,这是未加密的。设置SEC位的代码由Processor Expert生成。SEC位通过代码写入为00b,这是处理器专家生成的代码。

/* Flash configuration field constants */

#define CPU_FLASH_CONFIG_FIELD \
/* NV_BACKKEY0: KEY=0xFF */ \
0xFFU, \
/* NV_BACKKEY1: KEY=0xFF */ \
0xFFU, \
/* NV_BACKKEY2: KEY=0xFF */ \
0xFFU, \
/* NV_BACKKEY3: KEY=0xFF */ \
0xFFU, \
/* NV_BACKKEY4: KEY=0xFF */ \
0xFFU, \
/* NV_BACKKEY5: KEY=0xFF */ \
0xFFU, \
/* NV_BACKKEY6: KEY=0xFF */ \
0xFFU, \
/* NV_BACKKEY7: KEY=0xFF */ \
0xFFU, \
/* Reserved */ \
0xFFU, \
/* Reserved */ \
0xFFU, \
/* Reserved */ \
0xFFU, \
/* Reserved */ \
0xFFU, \
/* Reserved */ \
0xFFU, \
/* NV_FPROT: FPOPEN=1,??=1,FPHDIS=1,FPHS=0,FPLDIS=1,FPLS=0 */ \
0xE4U, \
/* NV_FSEC: KEYEN=3,??=1,??=1,??=1,??=1,SEC=0 */ \
0xFCU, \
/* NV_FOPT: ??=1,??=1,??=1,??=1,??=1,??=1,??=1,??=1 */ \
0xFFU 

__attribute__ ((section (".cfmconfig"))) const uint8_t _cfm[0x10] = {CPU_FLASH_CONFIG_FIELD};

但是 _cfm[14] 内容是 0xFC, 而不是 0xFE!

    怀疑 IDE或调试工具不允许使用加密设置更新FSEC。在MCUXpresso IDE使用Segger J-Link固件的LPC Link 2测试MKE04Z MCU,遇到了同样的问题,无法更新 FSEC。

-> 解决办法:设法按照期望的数值更新了加密位FSEC,请参阅下面的程序。

1. 在 Flash配置结构中将FSEC设置为11(安全模式),在MCUXpresso中,该结构位于启动文件中. 

2.  之后,生成了一个十六进制文件来验证 IDE是否在生成期望的FSEC设置 0b11。使用Hexedit来验证正在生成的固件设置。

(包含FSEC的Flash 安全加密位位于程序存储区地址0x40C)

3. 然后,对应用程序进行了编程,并使用调试器检查了FSEC的值;希望它是0b11,但它是0b10(没有安全加密的默认模式)和CW开发环境里面实验测试的现象一样。

4. 然后,将 J-Link调试配置中的MCU更改为允许加密的软件版本。

5. 重新编译了这个项目,又调试了一次。可以看到FSEC现在变成了期望的数值0b11。

    这就是为什么说调试器可能不允许更新FSEC,还可以验证Code Warrior开发环境里面是否生成带有 FSEC加密固件,然后检查固件的配置。注意:在使用J-Link对MCU进行编程后,在调试会话中检查 FSEC,但不建议这样做,例如,最好是使用代码读取FSEC的值,然后使用串行终端显示该数值。