主题中讨论的其他器件:UNIFLASH、 TMS570LS3137
大家好、
客户有问题需要您的帮助:
首先、我使用 uniflash 将.out 文件编程到芯片的闪存中。 Uniflash 具有自己的自动 ECC 生成功能、可自动对 ECC 区域进行编程。
然后、我将代码添加到了我的项目的启动代码中、
/*启用 CPU 事件导出*/
/*这允许 CPU 发出任何单个位或双位错误信号
检测到
*通过其 ECC 逻辑访问程序闪存或数据 RAM。
*/
_coreEnableEventBusExport_();
/*用户代码开始(9)*/
/*用户代码结束*/
/*启用对 CPU 指示的 ECC 错误的响应来访问闪存*/
flashWREG->FEDACCTRL1 = 0x000A060AU;
/*用户代码开始(10)*/
/*用户代码结束*/
/*为 ATCM 启用 CPU ECC 检查(闪存访问)*/
_coreEnableFlashEcc_();
这将启用芯片的闪存 ECC 验证。
我想验证芯片的闪存 ECC 校验。 我发现芯片的 Flash 有7种诊断模式。 我在 sys_selftest.c 文件中找到了 void checkFlashECC (void)函数。 此函数使用诊断模式7自动修改 CPU 读取的 ECC 值、以设置单位和双位错误、从而验证闪存 ECC 的正确性。
但我发现、在该函数中、打开诊断模式7后、访问的地址不是闪存、但选择了闪存的镜像映像。
#define flashBadECC1 (*(volatile UINT32 *)(0x20000000U))
#define flashBadECC2 (*(volatile UINT32 *)(0x20000000U))
Volatile UINT32 flashread = 0u;
/*用户代码开始(40)*/
/*用户代码结束*/
/*已启用闪存模块 ECC 响应*/
flashWREG->FEDACCTRL1 = 0x010A060AU;
/*启用诊断模式并选择诊断模式7 */
flashWREG->FDIAGCTRL = 0x00050007U;
/*选择 ECC 诊断模式,要损坏的单一位*/
flashWREG->FPAROVR = 0x00005A01U;
/*设置诊断模式的触发器*/
flashWREG->FDIAGCTRL |= 0x01000000U;
/*从镜像存储器映射中读取闪存位置*/
flashread = flashBadECC1;
/*禁用诊断模式*/
flashWREG->FDIAGCTRL = 0x000A0007U;
通过这种方式、向该函数添加一些调试代码可以发现单位错误和双位错误可以改变寄存器 flashWREG->FEDASTATUS 的值、即 CPU 检测到错误。
但是、当我将上面的 flashBadECC1 flashBadECC2更改为闪存区域时、我发现寄存器 flashWREG->FEDASTATUS 的值仍然为0、也就是说、CPU 无法检测到错误。
发生什么事了? 或者是否有任何其他方法来检查闪存 ECC 的功能。
谢谢。此致、
本
