主题中讨论的其他器件:HALCOGEN
我正在执行从 self_test.c 获取的以下代码、它始终达到失败条件、即未检测到单个位错误。
在调用此函数之前、已在 CPU 和闪存模块中启用 ECC 逻辑。
flashBadECC 设置为0x20000000
有什么想法、为什么这不起作用?
/*@fn void checkFlashECC (void)
*
*此函数检查闪存 ECC 错误检测逻辑。
* checkFlashECC 函数使用闪存接口模块的诊断模式7
*在 CPU 对闪存的访问中创建单位和双位错误。 一个双位
读取闪存时出错会导致数据中止异常。
*编写数据中止处理程序是为了查找故意引起的异常和
*将代码执行返回到已中止的指令之后的指令。
*
静态空 checkFlashECC (空)
{
/*例程、用于检查 CPU 内 ECC 逻辑的运行情况、以便访问程序闪存*/
易失性 UINT32闪存读取= 0U;
/*闪存模块 ECC 响应被启用*/
flashWREG->FEDACCTRL1 = 0x000A060AU;
/*启用诊断模式并选择诊断模式7 */
flashWREG->FDIAGCTRL = 0x00050007U;
/*选择 ECC 诊断模式,单位损坏*/
flashWREG->FPAROVR = 0x00005A01U;
/*为诊断模式设置触发器*/
flashWREG->FDIAGCTRL |= 0x01000000U;
/*从镜像内存映射读取闪存位置*/
flashread = flashBadECC;
/*禁用诊断模式*/
flashWREG->FDIAGCTRL = 0x000A0007U;
/*这将导致一个单位错误由 CPU 生成和纠正*/
/*在闪存模块中未捕捉到单位错误*/
if ((flashWREG->FEDASTATUS & 0x2U)== 0U)
{
自测故障通知(CHECKFLASHECC_FAIL1);
}
其他
{
/*清除单位错误标志*/
flashWREG->FEDASTATUS = 0x2U;
/*清除 ESM 标志*/
esmREG->SR1 = 0x40U;