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.

[参考译文] TMS570LC4357:软件或看门狗触发复位后的数据中止

Guru**** 2481465 points
Other Parts Discussed in Thread: TMS570LC4357, HALCOGEN, RM57L843

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/693755/tms570lc4357-data-abort-after-software--or-watchdog-triggered-reset

器件型号:TMS570LC4357
主题中讨论的其他器件: HALCOGENRM57L843

您好!

我正在使用 HALCoGen 和 CCS 评估 HDK 上的 TMS570LC4357模块、这些模块具有小型测试应用、无需任何操作系统和中断。 在软件或看门狗触发的复位之后、我在 HALCoGen 生成的初始化模块中的一个中获得数据中止、直到硬上电复位。 发生数据中止的命令因我添加或删除模块而异、因此我认为这不能是特定于模块的问题、而是更"一般"的问题。

您有什么想法吗、为什么即使在看门狗触发的复位之后处理器也不会进行"干净"启动?

谢谢、此致、

Jens

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

    MCU 上有几个逻辑块只能通过上电复位来复位、这些逻辑块主要与调试逻辑和一些关键异常状态寄存器相关。 如果不实际识别导致数据中止的访问、就很难解释您的观察结果。 您能否为其中一个数据中止实例粘贴数据故障状态和地址寄存器(在 CPU 的 cp15寄存器中)的内容?

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

    您好、Sunil、

    感谢您的支持。 以下是 cp15数据故障状态和地址寄存器:

    对于此测试、我将我的测试项目的代码减至最低:

    int main (void)
    {
    /*用户代码 begin (3)*/
    gioInit();
    
    /*按钮 GIO A7 */
    gioREG->INTDET ||(1U <<7); /*两个边沿上的中断(不能使用 HALCOGEN 进行设置)*/*
    
    永久运行*/
    while (1)
    {
    unsigned char debug_reset_test = 0;
    
    如果(DEBUG_RESET_TEST)
    {
    systemREG1->SYSECR = 0x8000U;//触发器软件复位*/
    }
    }/*
    用户代码结束*/
    
    返回0;
    } 

    在这种情况下、在访问 gioREG 时发生了异常、但是、如果我添加了其他初始化函数、则会在其他函数之一中发生。

    此致、

    Jens

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

    我已经在工作台上检查了行为、没有看到您报告的问题。 您能否从 sys_startup.c 文件中粘贴_c_int00()函数的内容? 在您的设置中发生软件复位或看门狗复位时、复位处理程序可能会跳过一些初始化步骤。

    HALCoGen 生成的复位处理程序序列确实需要更新才能单独解决每个复位原因、但它确实会执行初始化步骤、以防止出现您所观察到的问题。

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

    您好、Sunil、

    这是 HALCoGen 04.07.00生成的 hL_sys_startup.c 中的_c_int00例程。

    此致、

    Jens

    /*启动例程*/
    void _c_int00 (void);
    //*用户代码开始(4)*/
    *用户代码结束*/
    
    #pragma CODE_STATE (_c_int00、32)
    #pragma INTERRUPT (_c_int00、RESET)
    #sourcema weak (_c_int00)
    
    //* ceId:startup_3001_DesignId*
    
    /*要求 HL_CONQ_STARTUP_SR1 */
    void _c_int00 (void)
    {
    
    //用户代码开始(5)*/
    */*用户代码结束*
    
    /*初始化内核寄存器以避免 CCM 错误*/
    _coreInitRegisters_();
    
    /*初始化堆栈指针*/
    _coreInitStackPointer_();
    
    /*复位处理程序:以下指令从系统异常状态寄存器中读取
    *以确定 CPU 复位的原因。
    *
    switch (getResetSource())
    {
    案例 POWERON_RESET:
    调试复位情况:
    案例 EXT_RESET:
    
    //*用户代码开始(6)*/
    *用户代码结束*/
    
    /*初始化 L2RAM 以避免在上电后立即出现 ECC 错误*/
    _memInit_();
    
    /*用户代码开始(7)*/
    /*用户代码结束*/
    
    *用户代码开始(8)*/
    //*用户代码结束*/
    
    
    *用户代码开始(9)*/
    */*用户代码结束*
    
    /*启用 CPU 事件导出*/
    /*这允许 CPU 发出检测到的任何单位或双位错误的信号
    *通过其 ECC 逻辑访问程序闪存或数据 RAM。
    *
    _coreEnableEventBusExport_();
    
    //用户代码开始(10)*/*
    用户代码结束*/
    
    /*检查加电期间是否存在 ESM 组3错误。
    *这些可能发生在电子保险丝自动加载期间或从闪存 OTP 读取期间
    *在加电期间。 器件运行不可靠、不建议这样做
    *。 *
    if ((esmREG->SR1[2])!= 0U)
    {
    esmGroup3Notification (esmREG、esmREG->SR1[2]);
    }
    
    /*初始化系统-时钟、闪存设置、带 Efuse 自检*/
    systemInit();
    
    /*用户代码开始(11)*/*
    用户代码结束*/
    
    /*通过 Vic 控制器启用 IRQ 偏移*/
    _coreEnableIrqVicOffset_();
    
    /*初始化 VIM 表*/
    vimInit();
    
    /*用户代码开始(12)*/
    /*用户代码结束*/
    /*配置系统对发送给 ESM 组1的错误条件的响应*/
    /*可以从 HALCoGen 的"ESM"选项卡配置此函数*/
    esmInit();
    
    /*用户代码开始(13)*/
    /*用户代码结束*/
    
    中断;
    
    案例 OSC_failure_reset:
    /*用户代码开始(14)*/
    /*用户代码结束*/
    中断;
    
    案例安全装置复位:
    案例 WATCHDOG2_RESET:
    /*用户代码开始(15)*/
    /*用户代码结束*/
    中断;
    
    案例 CPU0_RESET:
    //*用户代码开始(16)*/
    //*用户代码结束*/
    
    *用户代码开始(17)*/
    //*用户代码结束*/
    
    *用户代码开始(18)*/
    */*用户代码结束*/
    
    /*启用 CPU 事件导出*/
    /*这允许 CPU 发出检测到的任何单位或双位错误的信号
    *通过其 ECC 逻辑访问程序闪存或数据 RAM。
    *
    _coreEnableEventBusExport_();
    
    //用户代码开始(19)*/*
    用户代码结束*/
    中断;
    
    案例 SW_RESET:
    //用户代码开始(20)*/
    //用户代码结束*/
    中断;
    
    默认值:
    //用户代码开始(21)*/
    //*用户代码结束*/
    中断;
    }
    
    /*用户代码开始(22)*/
    /*用户代码结束*/
    
    _mpuInit_();
    
    /*用户代码开始(23)*/
    /*用户代码结束*/
    
    _cacheEnable_();
    
    //用户代码开始(24)*/
    //*用户代码结束*/
    
    
    //*用户代码开始(25)*/
    //*用户代码结束*/
    
    /*初始化全局变量和构造函数*/
    __TI_auto_init();
    //用户代码开始(26)*/
    //用户代码结束*/
    
    /*调用应用程序*/*SAFETYMCUSW
    296 S MR:8.6 "启动代码(块范围内的库函数)"*/
    /* SAFETYMCUSW 326 S MR:8.2 "startup code (Declaration for main in library)"*/
    /* SAFETYMCUSW 60 D MR:8.8 "启动代码(库中 main 的声明;仅为相同操作 extern)"*/
    main();
    /*用户代码开始(27)*/*
    用户代码结束*/*
    SAFETYMCUSW 122 S MR:20.11 "启动代码(需要存在 EXIT 和 ABORT)"*/
    EXIT (0);
    
    
    /*用户代码开始(28)*/
    /*用户代码结束*/
    
    } 

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

    这与我运行的代码相匹配。 您能否在第28行"switch(getResetSource())"语句上设置断点? 然后、您可以从断点单步执行代码、以确保执行所有系统初始化步骤。 c_int00例程中的错误是 getResetSource()函数将除上电复位以外的所有内容返回为"外部复位"。 它基本上不区分复位的许多其他原因、并且遵循相同的初始化过程。 这已经作为 HALCoGen 生成的代码中的错误进行归档、并在下一次更新中进行了解决。

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

    getResetSource()正确检测并返回 SW_RESET,但在_c_int00中,仅针对 SW_RESET 情况减少了初始化。 当将 SW_RESET 情况添加到_memInit_()之前的第一个块时、要像在 power_reset 之后那样运行完全初始化、我不再获得中止。
    这是处理软件复位(和看门狗复位)的正确方法、还是与 power_reset 相比、在软件复位后必须排除一些初始化?

    顺便说一下、是否有适用于 HALCoGen 的"已知错误列表"或"勘误表"?

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

    这与我的观察结果不同。 在我的情况下、EXT RST 位始终为系统复位的任何原因(预期行为)置位。 实现 Get ResetSource 时、如果它不是上电复位、它将始终报告 EXT RST。 您是否看到 EXT RST 位(SYSESR 中的位3)完全被置位?

    要回答您的另一个问题:不、这不是处理由看门狗或软件复位引起的系统复位的正确方法。 大多数 MCU 会复位(为调试逻辑保存)、并且需要在这两种情况下再次初始化。

    这也是以前报告过的、我将与 HALCoGen 团队核实他们的更新计划是什么。

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

    你(们)好,Sunil

    我们有完全相同的问题! 但在 RM57L843 CPU 上。

    我发现这一点在 HalCoGen 中还没有被修复、这一点很重要吗?

    您是否有针对 RM57L843 CPU 可使用的所有复位原因进行正确修复的示例代码?

    请注意,上面提到的 HalCoGen 软件版本 help->About 不会更新到安装的版本。

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

    您好!

    此错误已标记为严重、并将在下一次更新中进行更正。 但是、我还没有计划的更新发布日期。

    至于处理复位的正确方法:

    • 必须首先进行上电复位检查、因为这可用于清除每个复位标志
    • 一旦确定复位不是由上电复位引起的、就可以按顺序检查其他复位原因、最后检查 EXTRST (位3)
    • CPUST (位5)需要特殊处理、因为这实际上只表示 CPU 复位、所以只需要 CPU 初始化作为复位处理程序的一部分来完成
    • ICSTRST (位7)也需要特别处理、这是因为这表示一个由一个互连自检导致的复位、这也将 CPU 复位。 因此、您确实需要在此复位后重新初始化 CPU 配置。

    希望这对您有所帮助。

    此致、

    Sunil

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

    您好、Sunil、

    很抱歉、我的回答很晚;我忙于其他一些模块...

    这是我的 getResetSource 函数、由 HALCoGen 生成:

    /* sourceId:system_sourceId_008 */*
    DesignId:system_DesignId_008 */*
    要求:hl_conq_system_SR9 */
    resetSource_t getResetSource (void)
    {
    寄存器 resetSource_t rst_source;
    
    if ((SYS_EXception &(UINT32) powerON_RESET)!= 0U)
    {
    /*上电复位条件*/
    RST_SOURCE = POWERON_RESET;
    
    /*清除所有异常状态标志并在通电后继续进行*/
    SYS_EXception = 0x0000FFFFU;
    }
    否则(((SYS_EXception &(UINT32) EXT_RESET)!= 0U)
    {
    /*由于外部复位导致的复位。 *
    RST_SOURCE = EXT_RESET;
    SYS_EXception =(UINT32) EXT_RESET;
    }
    如果((SYS_EXCE异常 和(UINT32) DEBUG_RESET)!=0U)则为其他
    {
    /*由于调试复位请求导致的复位*/
    RST_SOURCE = DEBUG_RESET;
    SYS_EXception =(UINT32) debug_reset;
    }
    如果((SYS_EXception &(UINT32) OSC_failure_reset)!= 0U)则为其他值
    {
    /*由于振荡器故障导致的复位。
    在此处添加用户代码以处理振荡器故障*/
    RST_SOURCE = OSC_FAILY_RESET;
    SYS_EXception =(uint32) OSC_failure_reset;
    }
    如果((SYS_EXCE异常 和(UINT32)安全装置复位)!=0U)则为其他
    {
    /*由于违反看门狗而导致的复位*/
    RST_SOURCE =安全装置复位;
    SYS_EXception =(uint32) watchdog_reset;
    }
    如果((SYS_EXCE异常&(UINT32) WATCHDOG2_RESET)!=0U)则为其他
    {
    /*由于违反看门狗而导致的复位*/
    RST_SOURCE = WATCHDOG2_RESET;
    SYS_EXception =(UINT32) WATCHDOG2_RESET;
    }
    否则(((SYS_EXCE异常&(UINT32) CPU0_RESET)!=0U)
    {
    /*由于 CPU0复位导致的复位。
    CPU 复位可能由 CPU 自检完成、或引起
    通过切换 CPU 复位控制寄存器的"CPU RESET"位。 *
    RST_SOURCE = CPU0_RESET;
    SYS_EXception =(UINT32) CPU0_RESET;
    }
    否则(((SYS_EXception &(UINT32) SW_RESET)!= 0U)
    {
    /*由于软件复位导致的复位。 *
    RST_SOURCE = SW_RESET;
    SYS_EXception =(UINT32) SW_RESET;
    }
    其他
    {
    /*发生了 No_reset。 *
    RST_SOURCE = NO_RESET;
    }
    
    返回 rst_source;
    } 

    复位会导致 SW_RESET (0x0010)、Watchdog_RESET (0x2000)和 EXT_RESET (0x0008)被检测并由 getResetSource 正确返回。 但是、如果是 SW_RESET 和 Watchdog_reset、_c_int00中的开关似乎会执行错误的初始化。

    如果我将 SW_RESET 和 Watchdog_reset 放置在_c_int00开关顶部 、它似乎起作用:

    案例 POWERON_RESET:
    调试复位情况:
    案例 EXT_RESET:
    
    /*用户代码开始(6)*/
    案例 SW_RESET:仅//测试
    case watchdog_reset://test only
    //用户代码结束*/ 

    因此、我只会问一个问题、_c_int00的正确代码是什么。

    此致、

    Jens

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

    需要更正 getResetSource()函数。 EXTRST 的检查:

    否则(((SYS_EXception &(UINT32) EXT_RESET)!= 0U)

    /*由于外部复位导致的复位。 *
    RST_SOURCE = EXT_RESET;
    SYS_EXception =(UINT32) EXT_RESET;


    必须是要检查的最后一个复位条件、恰好高于"未发生复位"条件。

    问题是、EXTRST 位在系统复位的每一个原因中都被置位。 这将防止原始 getResetSource()能够正确识别实际复位原因,因为如果实际复位不是上电复位,它将始终返回 EXTRST。

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

    您好、Sunil、

    我想我们讨论的是两个不同的问题。 我按照您所述更改了 getResetSource 函数、但当函数被输入时、EXT_RESET 位永远不会被置位。 该函数始终返回正确的复位源。 它并不总是像您假定的那样返回 EXT_RESET。

    因此、当我执行软件复位时、getResetSource 正确返回 SW_RESET。 然后在_c_int00中、针对 SW_RESET 情况跳过开关中的所有初始化、并且我的应用崩溃。 当我将案例 SW_RESET 放置在开关顶部时、似乎可以正常工作、但我不确定这是不是正确的方法。

    此致、

    Jens

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

    我同意,我们所讨论的是两个不同的问题,但却是相关的问题。 系统中的 nRST 引脚连接了什么? 每当您引起软件复位或看门狗复位时、您是否会看到 nRST 引脚被驱动为低电平? nRST 端子的功能是、不管它们是在内部生成的还是 nRST 是在外部驱动为低电平、它都会被驱动为低电平以指示片上系统复位的所有原因。 这使得(应该) EXTRST 位在系统复位的每个原因上都被置位。

    现在、为了解决您的特定问题-对于系统复位的所有原因、需要使用相同的系统初始化序列。 因此、您应该将其他系统复位原因(OSC_failure_reset、Watch_reset、WATCHDOG2_RESET、SW_RESET)也放在 EXT_RESET 的顶部。

    我将处理一个"建议的重置处理程序"、并在它准备就绪时(可能是下周)发布它。

    此致、
    Sunil
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Sunil、
    我目前正在使用 HDK、但未对复位电路进行任何修改。 我使用示波器检查了 nRST 引脚;当我引起一个软件或安全装置复位时、不被驱动为低电平。 仅当按下 S3按钮(信号 WARM_RSTn)时、nRST 被驱动为低电平。 由 S3按钮触发的复位被检测为 EXT_RESET (0x0008)。
    因此、我将在短期内修补初始化序列、并在建议的复位处理程序准备就绪时再次对其进行仔细检查。
    谢谢、此致、
    Jens
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Jens:

    建议的复位处理程序将是计划于2018年7月进行的 HALCoGen 更新的一部分。

    我将把这个帖子标记为已解决并关闭它。 请随时发表您可能遇到的任何问题。

    此致、
    Sunil