This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F280049:ECC 闪存测试

Guru**** 2382480 points
Other Parts Discussed in Thread: TMDSCNCD280049C, TMDSHSECDOCK
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/920953/tms320f280049-ecc-flash-test

器件型号:TMS320F280049
主题中讨论的其他器件:TMDSCNCD280049CTMDSHSECDOCK

我们从链接器文件中激活 ECC 功能。

之后、我们激活 ECC 寄存器、以便在每次 ECC 发现单一位错误时触发中断。

我们在命令行中注入了三个错误--ecc:data_error 在代码的不同部分。

问题:中断仅触发一次。 当代码再次运行相同的错误时、ECC 计数会递增、但不会触发中断。

注意:中断代码清除中断标志和 ECC 状态。

软件工具集:
Code Composer Studio 10.0.0.00010
C2800编译器工具20.2.1 com.ti.cgt.c2000.19.win32.feature.group 德州仪器(TI)
 
硬件工具集:
TMDSCNCD280049C 评估板 + TMDSHSECDOCK
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    约旦

    只需清除: 您可以确认链接器按预期在映像中插入了所有错误-正确吗?  除了第一个错误位置之外、不触发中断-正确吗?  请确认。

    您使用的误差阈值是多少?   

    谢谢、此致、
    Vamsi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Vamsi、
     
    非常感谢您的快速响应。  
     
    要回答您的问题:
    • "您可以确认链接器按预期插入了所有错误?" /"除了第一个错误之外、是否只是没有触发中断?"  是的。 当遇到第一个错误时、中断标志被置位并且中断例程被调用。 中断标志被清除。 一直调试代码到第二个错误、我们看到中断标志再次设置、但不调用中断例程。 由于设置了中断标志、因此错误会按预期插入
    我们最初将阈值设置为0。 以便我们能够识别发现的第一个错误。 我们还尝试将阈值设置为3、观察到相同的行为(中断仅触发一次)。
     
    我们使用 Code Composer 中 C2000链接器选项中的"-ECC:DATA_ERROR"选项在三个不同的代码位置配置 single-bit 错误(0x40)。 无论错误的位置如何、只有执行的第一个错误才会触发中断。 我们使用函数名称+偏移量来设置它们(例如、SPRU513T、第8.4.12节、其中它们使用的是 main+2)。
     
    如果您需要任何其他详细信息、请告知我们。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    约旦

    感谢您提供信息。  0的阈值是正确的、因为您希望每次都获得一个中断。   

    您能否共享您的 ISR 代码(您可以删除任何专有代码)?

    谢谢、此致、

    Vamsi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是 ISR 代码: 

    _interrupt void eccFlashSingleErrISR (void)
    {
    静态 U16 eccSingleErrCount = 0U;
    eccSingleErrCount++;
    if (number_failure <= eccSingleErrCount)
    {
    while (1)
    {
    //在此循环,直到 WDT 超时/重置,此时将报告异常。
    }
    }
    //清除中断
    EALLOW;
    flash0EccRegs->ERR_INTCLR.bit.single_ERR_INTCLR = 1U;
    flash0EccRegs->ERR_STATUS_CLR.all = 0x00030003U;
    EDIS;
    //确认此中断以接收来自组11的更多中断
    压电式 REG->PIE_O_ACK = INTERRUPT_ACK_group11;
    }// eccFlashSingleErrISR 结束 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    约旦

    谢谢你。 请给我一两天时间。  我将进行审核/尝试、并告知您。

    谢谢、此致、

    Vamsi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    约旦

    1) 1) 根据 TRM 中的闪存单位错误的文档(请参阅下文)、当 ERR_CNT 等于阈值+1后再发生一个错误时、会发生中断。  您是否在第一次读取错误时或在第二次读取错误时看到中断设置? 请确认。   

    当 ERR_CNT 值等于阈值+1值且发生单个位错误时、设置 SINGLE_ERR_INT 标志、并触发中断(如果需要、必须启用 C28x PIE 上的 FLASH_RE更正_ERR 以进行中断)。

    2) 2)您能否通过执行这些指令后查看存储器窗口来检查以下两个写入是否完成?

    flash0EccRegs->ERR_INTCLR.bit.single_ERR_INTCLR = 1U;

    压电式 REG->PIE_O_ACK = INTERRUPT_ACK_GROU11;

    谢谢、此致、

    Vamsi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Vamsi、

    问题在于:

    压电式 REG->PIE_O_ACK = INTERRUPT_ACK_GROU11; 

    ECC 闪存中断的组为12而不是11。

    谢谢、此致、

    约旦

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    约旦

    很高兴这是个问题。  我查看了您的代码、它对我来说看起来是自定义的、因此要求检查这些陈述。

    谢谢、此致、
    Vamsi