ZHCAE28 May 2024 TMS320F2800132 , TMS320F2800133 , TMS320F2800135 , TMS320F2800137 , TMS320F2800152-Q1 , TMS320F2800153-Q1 , TMS320F2800154-Q1 , TMS320F2800155 , TMS320F2800155-Q1 , TMS320F2800156-Q1 , TMS320F2800157 , TMS320F2800157-Q1 , TMS320F28P650DH , TMS320F28P650DK , TMS320F28P650SH , TMS320F28P650SK , TMS320F28P659DH-Q1 , TMS320F28P659DK-Q1 , TMS320F28P659SH-Q1
闪存验证的主要目的是检查闪存中的代码和数据是否与初始内容一致。过去,闪存验证通过 CRC 实现。闪存块按顺序进行 CRC 计算,计算出的 CRC 存储为黄金 CRC 数组。在上电和周期性循环验证期间,再次按顺序计算闪存块的 CRC,并将结果与相应的黄金 CRC 进行比较。如果结果匹配,则验证通过。这种验证方法的问题在于,在闪存验证期间仍然需要禁用全局中断,因此单次检测的每个存储块的大小不能太大,以免影响系统功能中断的执行。随着电器功能的增加以及 MCU 闪存的逐渐增大,一轮闪存自检所需的时间可能会变得过长,无法满足认证组织的安全要求。因此,当使用 CRC 来验证闪存时,有必要平衡单次检测中每个存储块的大小与一轮自检所需的时间。图 4-7 显示了闪存 CRC 测试结构。闪存 CRC 测试位于名为 STA_FLASH_CRC 的 test_application 工程中,源代码位于 f280013x\source\stl_crc.c。
在 TI 推荐用于电器应用的第三代 C2000 MCU 中,闪存附带 ECC 验证功能,这大大减少了闪存验证所需的时间。对闪存进行编程时,ECC 代码会生成并存储在相应的存储器位置。当读取闪存时,ECC 模块再次执行 ECC 计算,并将结果与编程期间生成的 ECC 进行比较。这样就可以检测一位错误和双位错误,其中一位错误是可校正的。
片上闪存可以进行单错校正双错检测 (SECDED) 错误校正码 (ECC) 诊断。在该 SECDED 机制中,会使用一个 8 位代码字来存储 64 位数据的 ECC 和相应的地址。闪存组输出的 ECC 解码逻辑检查存储器内容的正确性。对读取的每个数据和程序都进行 ECC 评估。连接 CPU 和闪存的数据和程序互连不受 ECC 保护。根据是否启用校正功能,可以校正或不校正检测到的可校正错误。一位地址 ECC 错误被标记为不可校正的错误。无法校正的错误会生成 NMI 并使 ERRORSTS 引脚置为有效。闪存包装程序会监测已校正错误(一位数据错误)的计数,一旦计数超过编程阈值,就会生成中断。最后一个错误位置的损坏存储器地址也记录在闪存包装程序中。
可通过以下方式测试 ECC 的功能:在测试模式下注入一位错误和双位错误,对存在 ECC 错误的位置执行读取,并检查是否存在错误响应。借助 ECC 测试寄存器(FECC_CTRL、FADDR_TEST、FECC_TEST、FDATAH_TEST、FDATAL_TEST)即可检查闪存 ECC 逻辑。也可以使用这项技术来验证与一位错误相关的错误计数器和阈值中断是否能够正常运行。图 4-8 显示了闪存 ECC 测试结构。闪存 ECC 测试位于 example\sdl_ex_flash_ecc_test 工程中,源代码位于 f280013x\examples\sdl_ex_flash_ecc_test\sdl_ex_flash_ecc_test.c。