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.

[参考译文] TMS320F280039C:由 memcpy () 在每次引导时读取损坏的闪存扇区引起的连续 NMI 复位循环

Guru**** 2988470 points

Other Parts Discussed in Thread: UNIFLASH

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1649838/tms320f280039c-continuous-nmi-reset-loop-caused-by-memcpy-reading-corrupted-flash-sector-on-every-boot

器件型号: TMS320F280039C
Thread 中讨论的其他器件: UNIFLASH

问题:  
MCU 在每次引导时卡在连续 NMI 复位循环中。

调试后的结果:  
memcpy() 注释掉从闪存读取的调用后、MCU 会启动并正常运行、不会进行任何复位。 这强烈建议正在读取的闪存扇区已损坏、并在每次 memcpy() 访问时触发不可纠正的 ECC 错误。 另外、如果我通过使用 CCS/Uniflash / C2prog Tools 擦除整个闪存来再次刷写代码、损坏的扇区也可以正常使用 memcpy ()

使用的代码行如下所示:

1. void app_meta_data_flash_init(); 每次启动时调用一次、  
2. mcal_flash_init();
mcal_flash_sector_erase (0x000AF000);
mcal_flash_program_autoecc_SECTOR (0x000AF000、(uint32_t *) 缓冲器、sizeof(结构 mdata_t));
 
所有这些函数都是闪存 API 示例中给出的一个函数、仅更改了函数名称
3. void app_meta_data_flash_write(结构 mdata_t *buffer ) 是根据应用的要求使用的

我已经了解使用闪存 API 所需的所有文档/数据表。  
这是在我们使用的应用程序上随机发生的、未找到发生顺序。 目前我无法重新创建闪存损坏。  请帮助重新创建闪存损坏
struct mdata_t{
    uint16_t image_present;                                          
    uint16_t reset_cause;                                            
    uint32_t battery_unique_key;                                      
};

void app_meta_data_flash_write(struct mdata_t *buffer)
{
    mcal_flash_sector_erase(0x000AF000);
    mcal_flash_program_autoecc_sector(0x000AF000, (uint32_t *)buffer, sizeof(struct mdata_t));  // size is 8 words
}

void app_meta_data_flash_read()
{
    memcpy(&mdata, (uint16_t *)0xAF000, sizeof(struct mdata_t));
}

void app_meta_data_flash_init()
{
mcal_flash_init();    
app_meta_data_flash_read(); 
}

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

    您好、Tanmay、

    让我看看这个问题、很快就会回来。

    谢谢

    Aswin

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

    创建闪存损坏的选项是使用电源中断仿真、在写入过程中复位 MCU 以使扇区处于损坏状态。

    请确保以下检查正确无误-  

    根据数据表验证闪存等待状态是否正确。

    我的理解是、在 mcal_flash_program_autoecc_sector() 创建的损坏 ECC 代码期间自动写入 ECC。 完全擦除(不仅仅是扇区擦除)会清除导致损坏的残留位模式。

    我建议在每次加载新程序之前进行完整的闪存擦除(不是扇区擦除)

    谢谢

    Aswin

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

    尊敬的 Aswin:  

    要使用电源中断仿真来创建闪存损坏、请在写入过程中复位 MCU 以使扇区处于损坏状态

    下面代码中的哪个函数应该执行电源中断仿真? 电源中断模拟也意味着关闭电源或其他什么?   此外、我确实只能访问闪存库的 API、而不能访问 enitre 函数  

    ]我建议在每次加载新的程序之前进行完整的闪存擦除(不是扇区擦除)

    因此、我的应用从组 0 运行、我正在使用组 2 (0xAF000) 在运行时的特定触发点存储一些数据、因此只需要擦除扇区。  

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

    e2e.ti.com/.../1526.Code.txt

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

    尊敬的 Aswin:  

    信号  

    您能帮忙吗?
    1. 为什么闪存损坏、FlashAPI 中是否存在任何导致该问题的问题? (RCA)
    2. 我们如何避免闪存损坏? (操作项目)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Tanmay、在流程中有一些建议-  

    • 在发出 PROGRAM 命令之前清除 FSM 状态。
    • 为此示例位于 PROGRAM 命令之前的选定扇区启用编程/擦除保护

    另外、我看到您正在对所有的错误返回语句进行注释、如果发生错误、则无法跟踪是否已进行注释。 请取消注释并检查是否返回任何错误。

    谢谢

    Aswin

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

    您好、Tanmay、

    我还有几个问题:

    1.这种闪存损坏是否多次发生,即使它不能直接重现?

    2.如果您再次看到它,您是否能够捕捉到 ECC 错误寄存器的值?

    3.设备有多旧? 它有多少个读取/写入周期?

    通过将参数(读取/写入周期等)保持在器件数据表给出的范围内、可以管理错误的闪存编程。

    在编程期间、如果闪存未成功编程、Fapi_getFsmStatus 将在编程命令之后报告失败。  在您的代码中、由于 fmstat_fail() 被注释掉、因此不会捕获此失败。

    此外、您可以针对 ECC 错误添加中断处理程序以避免完全复位器件。

    此致、

    Alex

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这种闪存损坏是否多次发生、即使它不能直接重现?

    是、这已发生多次、发生情况无法预测

    如果您再次看到它、您是否能够捕获 ECC 错误寄存器的值?

    瓶颈是 MCU 安装在 PCB 上、我们在 PCB 中没有调试器、因为这是在我们初始化所有外设之前在代码初始化时发生的。 所以,没有办法得到 ECC 错误寄存器与任何生产 PCB 是..  
    我的目的是在有调试器的 Launchpad 上重新创建

    器件的版本是多少? 它有多少个读/写周期?

     在发生此情况的任何设备上、读/写计数不超过 50 个周期 


    你们能帮助娱乐吗? 这个问题仍然没有得到解答? 重新创建后... 我可以管理解决方案的工作

    下面代码中的哪个函数应该执行电源中断仿真? 电源中断模拟也意味着关闭电源或其他什么?   此外、我确实只能访问闪存库的 API、而不能访问 enitre 函数
     


    谢谢、
    Tanmay

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

    您好、Tanmay、

    如果错误是间歇性的、则很难重现导致错误的确切条件。 损坏闪存的替代方法是循环对闪存进行编程/擦除、然后在器件运行时将其断电。 不过、时间安排可能很棘手--你需要在其运行过程中中断闪存泵。

    此致、

    Alex

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

    您好 Alex、  

    我能够重新创建问题多次:

    我做了什么:  
    1.尝试每 100ms 擦除和编程一个特定扇区
    2.以 100 毫秒的频率闪烁 LED
    3.尝试进行多次电源重置,并能够在其中一个实例中重新创建

    我怎么知道:  
    1.每次电源重置后使用以下函数一次(在代码初始化中)

    void app_meta_data_flash_read()
    {
        memcpy(&mdata, (uint16_t *)0xAF000, sizeof(struct mdata_t));
    }

    2.闪烁损坏后, LED 指示灯停止闪烁。 表示没有执行连续循环
    3.如果我在损坏事件的基础上注释上述功能,则 LED 将再次开始闪烁。 指示 memcpy 是问题

    深入探究:
    1. Using debugger I was able to identify the it was stuck in NMI Interrupt Handler 
    2. 

    [quote userid=“618001“ url=“~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1649838/tms320f280039c-continuous-nmi-reset-loop-caused-by-memcpy-reading-corrupted-flash-sector-on-every-boot/6364304 通过编程、如果未成功对闪存进行编程、Fapi_getFsmStatus 将在编程命令之后报告失败。  在您的代码中、由于 fmstat_fail() 被注释掉、因此不会捕获此失败。


    Your suggestion of using FSM Status to identify the Flash error wont be applicable here, as this function is used after issuing programming command and check if programming is okay or not .. but the failure here is mid of flash operation and we are able to know the failure in next power reset cycle where the programming command was never performed (just reading the flash using memcpy)

    What are your further suggestions in this ? 

    Thanks,
    Tanmay

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

    此外,还有一种方法可以使用任何函数或方法来识别特定的闪存地址是否已损坏。 考虑到我从未在整个代码中使用闪存 API 的擦除或写入操作。

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

    您好、Tanmay、

    对延迟的回复表示歉意、让我们看看您之前的回复、我们会尽快回复您。

    谢谢

    Aswin

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

    Tanmay、

    请查找所附的处理闪存 ECC 不可纠正错误 NMI 的示例

    此致、

    Alex

    e2e.ti.com/.../2063.flashapi_5F00_ex1_5F00_programming.c