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:STC 自检

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/591785/tms570lc4357-stc-self-test

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

您好!

我正在尝试在启动阶段对 CortexR5F 运行 STC 自检。 因此、我在"HL_SYS_STARTUP.c"模块中调用了函数"sl_SelfTest_STC (STC1_run、true、&stcSelfTestConfig)"。

但每次我运行或调试程序时,该函数都无法开始返回'False ',这表示函数 sl_SafeTest_STC()失败。  

如果我运行 STC 自检诊断、它也会失败。 函数"sl_SelfTest_STC (STC1_COMPARE_SELFCHECK、TRUE、&stcSelfTestConfig)" 返回'False。  

有人能不能告诉我为什么会发生这种情况?

此致

Rabie

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

    我已将您的帖子转发给我们的一个 SW 销售线索、以查看他们是否能够提供帮助。 您应该很快就能听到他们的声音。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您能否向我们发送完整的启动文件、以便我们了解初始化器件是如何完成的?

    谢谢、此致、

    Veena

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

    好的。 实际上、我尝试启动了两个自检函数、但这两个函数都无法启动并返回 false。
    1) sl_SelfTest_PBIST ()。 2) sl_SelfTest_STC ()。

    在下面、您将找到我尝试在 TMS570LC4357上调试的代码。

    谢谢、此致
    /******** /
    /**@文件 hL_sys_startup.c
    *@简要启动源文件
    *@日期:2016年10月5日
    *@版本04.06.00
    *
    *此文件包含:
    *-包含文件
    *-类型定义
    *-外部功能
    *- VIM RAM 设置
    *-启动例程
    *。
    与启动相关的*。
    *

    /*用户代码开始(0)*/
    /*用户代码结束*/


    /*包含文件*/

    #include "hL_sys_common.h"
    #include "hL_system.h"
    #include "hL_sys_vim.h"
    #include "hL_sys_core.h"
    #include "HL_ESM.h"
    #include "HL_SYS_MPU.h"
    #include "HL_REG_STC.h"

    /*用户代码开始(1)*/
    #include "../../TILibs/SafeTIDiag/2.3.1/safety_library/include/sl_types.h

    /*用户代码结束*/

    /*用户代码开始(2)*/
    #define STC_ENABLE1U
    #define PBIST_ROM_ENABLE1U

    /*用户代码结束*/

    /*外部功能*/

    /*SAFETYMCUSW 218 S MR :20.2. "库中的函数"*/
    extern void __TI_auto_init (void);
    /*SAFETYMCUSW 354 S MR:NA "启动代码(主代码应由用户声明)"*/
    extern int main (void);
    /*SAFETYMCUSW 122 S MR:20.11 "启动代码(需要存在 EXIT 和 ABORT)"*/
    /*SAFETYMCUSW 354 S MR:NA "启动代码(库中存在示例声明)"*/
    extern void exit (int _status);

    /*用户代码开始(3)*/
    /********* 外部功能 /
    extern 布尔 SL_SelfTest_STC (寄存器 SL_SelfTestType testType、寄存器布尔 BMODE、寄存器 SL_STC_Config*配置);
    extern 布尔 SL_SelfTest_PBIST (寄存器 SL_SelfTestType testType、寄存器 uint64 ramGroup、寄存器 UINT32 algoInfo);
    extern 布尔 SL_SelfTest_Status_PBIST (SL_PBIST_FailInfo* param1);
    extern 布尔 SL_SelfTest_PBIST_StopExec (void);
    extern void errata_PBIST_4 (void);
    / /
    /*用户代码结束*/

    /*启动例程*/
    void _c_int00 (void);
    /*用户代码开始(4)*/
    /*用户代码结束*/

    #pragma CODE_STATE (_c_int00、32)
    #pragma INTERRUPT (_c_int00、复位)
    #pragma weak (_c_int00)

    void _c_int00 (void)


    /*用户代码开始(5)*/
    /*用户代码结束*/

    /*初始化内核寄存器以避免 CCM 错误*/
    _coreInitRegisters_();

    /*初始化堆栈指针*/
    _coreInitStackPointer_();

    /*复位处理程序:以下指令从系统异常状态寄存器中读取
    *以确定 CPU 复位的原因。
    *
    switch (getResetSource())

    案例 POWERON_RESET:
    调试复位情况:
    案例 EXT_RESET:

    /*用户代码开始(6)*/
    情况 NO_RESET:
    /*用户代码结束*/

    /*初始化 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)*/
    _enable_interrupt_();

    #if PBIST_ROM_ENABLE = 1U
    /* CPU 将配置 PBIST 控制器以测试 PBIST ROM 和 STC ROM*/
    errata_PBIST_4 ();


    布尔 RetVal;
    SL_PBIST_FailInfo PbistStatus;

    /*在 STC 和 PBIST ROM*/上启动 PBIST
    RetVal = sl_SelfTest_PBIST (PBIST_EXECUTE、
    PBIST_RAMGROUP_01_PBIST_ROM |
    PBIST_RAMGROUP_02_STC1_ROM_R5 |
    PBIST_RAMGROUP_03_STC1_2_ROM_R5 |
    PBIST_RAMGROUP_04_STC2_ROM_NHET、
    PBISTALGO_TRIPLE_READ_FAST_READ |
    PBISTALGO_TRIPLE_READ_SLOW_READ);
    if (RetVal == false)

    /*无法启动 PBIST */
    while (1);


    /*等待 ROM 上的 PBIST 完成*/
    while (sl_SelfTest_Status_PBIST (&pbistStatus)=false);
    SL_SelfTest_PBIST_StopExec();

    if (pbistStatus.stResult!= ST_PASS)

    /* PBIST 失败*/
    while (1);


    /*清除 VIM 挂起中断请求(通道85 - PBIST 完成)*/
    vimREG->INTREQ2 = 0x00200000;

    #endif
    /*用户代码结束*/

    /*通过 Vic 控制器启用 IRQ 偏移*/
    _coreEnableIrqVicOffset_();

    /*初始化 VIM 表*/
    vimInit();

    /*用户代码开始(12)*/
    /*用户代码结束*/
    /*配置系统对发送给 ESM 组1的错误条件的响应*/
    /*可以从 HALCoGen 的"ESM"选项卡配置此函数*/
    esmInit();

    /*用户代码开始(13)*/
    /*启动 CPU 自检*/
    #if STC_ENABLE = 1U

    volatile boolean RetVal;
    SL_STC_Config stcSelfTestConfig;

    stcSelfTestConfig.stcClockDiv = 2;
    stcSelfTestConfig.intervalCount = 1;
    stcSelfTestConfig.restartInterval0 = true;
    stcSelfTestConfig.timeoutCounter = 0xFFFFFFFF;

    RetVal=sl_SelfTest_STC (STC1_COMPARE_SELFCHECK、true、&stcSelfTestConfig);

    if (!RetVal)

    /*无法启动 STC 自检*/
    while (1);


    #endif
    /*用户代码结束*/

    中断;

    案例 OSC_failure_reset:
    /*用户代码开始(14)*/
    /*用户代码结束*/
    中断;

    案例安全装置复位:
    案例 WATCHDOG2_RESET:
    /*用户代码开始(15)*/
    /*用户代码结束*/
    中断;

    案例 CPU0_RESET:
    /*用户代码开始(16)*/
    /*用户代码结束*/

    /*用户代码开始(17)*/
    /*用户代码结束*/

    /*用户代码开始(18)*/
    /*用户代码结束*/

    /*启用 CPU 事件导出*/
    /*这允许 CPU 发出检测到的任何单位或双位错误的信号
    *通过其 ECC 逻辑访问程序闪存或数据 RAM。
    *
    _coreEnableEventBusExport_();

    /*用户代码开始(19)*/
    #if STC_ENABLE = 1U

    if ((stcREG1->STCSCSCR & 0xFU)== 0xAU)

    /*检查自检失败位是否已设置*/
    if ((stcREG1->STCGSTAT & 0x3U)!= 0x3U)

    /* STC 自检失败*/
    while (1);

    /* STC 自检已通过*/
    其他

    /*清除自检模式*/
    stcREG1->STCSCSCR = 0x05U;
    /*清除 STC 全局状态标志*/
    stcREG1->STCGSTAT = 0x3U;
    /*清除 ESM 组1通道27状态标志*/
    esmREG->SR1[0U]= 0x08000000U;

    SL_STC_Config stcSelfTestConfig;
    stcSelfTestConfig.stcClockDiv = 0; /* STC 时钟分频器= 1 */
    stcSelfTestConfig.intervalCount = 1; /*仅一个间隔*/
    stcSelfTestConfig.restartInterval0 = true; /*从间隔0开始*/
    stcSelfTestConfig.timeoutCounter = 0xFFFFFFFF; /*超时计数器*/
    SL_SelfTest_STC (STC1_run、true、&stcSelfTestConfig);
    while (1);/* STC 无法启动*/



    /* CPU 自检完成导致的 CPU 复位*/
    否则、如果((stcREG1->STCGSTAT & 0x1U)== 0x1U)

    /*设置自检失败标志*/
    if ((stcREG1->STCGSTAT & 0x2U)== 0x2U)

    /*调用 CPU 自检故障处理程序*/
    while (1);

    /*成功完成 CPU 自检*/
    其他

    /*清除 STC 全局状态标志*/
    stcREG1->STCGSTAT = 0x1U;
    /*在 CPU STC 完成后继续启动序列*/


    /*软件写入 CPU 复位位引起的 CPU 复位*/
    其他

    /*在此处添加自定义例程以处理软件导致 CPU 复位的情况*/



    #endif
    /*用户代码结束*/
    中断;

    案例 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. "启动代码(库中 main 的声明)"*/
    /*SAFETYMCUSW 60 D MR:8.8 "启动代码(库中 main 的声明;仅为相同操作 extern)"*/
    main();
    /*用户代码开始(27)*/
    /*用户代码结束*/
    /*SAFETYMCUSW 122 S MR:20.11 "启动代码(需要存在 EXIT 和 ABORT)"*/
    EXIT (0);


    /*用户代码开始(28)*/
    /*用户代码结束*/



    /*用户代码开始(29)*/
    /*用户代码结束*/



    /*用户代码开始(30)*/
    /*用户代码结束*/
    /********* /
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Rabie、

    SL_SelfTest_STC 永远不会返回一个状态。 该函数启动 STC 自检并在测试完成后引起 CPU 复位。 状态可作为 CPU 复位处理程序的一部分进行检查。
    尽管函数原型显示它返回状态、但它是一个不返回的函数。 也不建议在函数内执行单步执行。
    HALCoGen 中提供了一个示例启动文件、其中显示了如何使用 SafeTI 诊断库运行自检。 您可以在此处找到 STC 测试的实际状态检查是作为 CPU_RESET 情况的一部分完成的。

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

    感谢您的回答、但我不同意您对此问题的看法。 我要讨论的两个函数 和 来自布尔类型,因此它们返回某些内容(true 或 false)。 每次我在代码中调用它们时、它们都会返回 false、这意味着直观地、它们无法启动。
    按照我使用的示例代码的方式、来自 HALCoGen 帮助主题、该主题检查自检函数的返回值、如果返回值为 false、则进入 while (1)循环。

    那么、我的问题是、为什么自检函数返回 false? 以及如何确保它们正常工作?
    我完全使用了 HALCoGen 中解释的示例代码、但这不起作用。 请为我提供示例代码、说明如何使用适用于 TMS570LC4357的 SafeTI 诊断库运行自检。

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

    SL_SelfTest_PBIST 是一个返回真/假状态的函数。 我将研究为什么它返回 false 并返回给您。
    函数 sl_SelfTest_STC、即使它是一个 true/false 返回函数、如果它以所需的方式执行、它也不应返回。 它执行 CPU STC 测试并立即生成 CPU 复位。 需要在 CPU 复位处理程序中检查测试的状态。
    如果函数 sl_SelfTest_STC eturns 到下一条语句、则表示未正确触发测试。 我也会研究这个问题。

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

    您好!

    我无法重新创建方案。 我用您发送的文件替换了我的启动文件、PBIST 和 STC 测试似乎可以毫无问题地执行。

    STC 自检函数创建了一个 CPU 复位、并且没有返回到已检查 RetVal 的下一条语句。

    RetVal=sl_SelfTest_STC (STC1_COMPARE_SELFCHECK、true、&stcSelfTestConfig);

    if (!RetVal)

    /*无法启动 STC 自检*/
    while (1);

    当 ESM 错误被置位时、这两个测试可能返回失败。 如果 ESM 错误引脚被置位、它不会继续进行测试。 在执行测试之前、请检查 ESM 错误状态是否已设置。

    谢谢、此致、

    Veena

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

    您好、Veena、

    我发送给您的代码示例正在工作、这真是一个好消息。

    但遗憾的是、在执行 STC 自检时、仍然存在相同的问题。

    我的第一个问题是:

    当显示"ESM ERROR/ESM ERROR PIN/ESM ERROR STATUS"时、您的意思是什么寄存器?

    我在调用"sl_SelfTest_STC (STC1_COMPARE_SELFCHECK、true、&stcSelfTestConfig)"之前执行了以下操作

    #if STC_ENABLE = 1

    布尔 RetVal;
    SL_STC_Config stcSelfTestConfig;

    esmClearStatus (esmGROUP1、esmCHANNEL52);

    esmActivateNormalOperation();

    esmREG->EEPAPR1 = 0x00000000;

    stcSelfTestConfig.stcClockDiv = 2;                     /* STC 时钟分频器= 1 */

    stcSelfTestConfig.intervalCount = 1;                   /*仅一个间隔*/

    stcSelfTestConfig.restartInterval0 = true;             /*从间隔0开始*/

    stcSelfTestConfig.timeoutCounter = 0xFFFFFFFF;      /*超时计数器*/

    RetVal=sl_SelfTest_STC (STC1_COMPARE_SELFCHECK、true、&stcSelfTestConfig);

    if (!RetVal)

    while (1);/* STC 无法启动*/

    #endif

    我查看了可能对我的情况很重要的寄存器、我发现了以下内容:

    在调用 sl_SelfTest_STC()之前,寄存器 ErrPinStat = 0x00000001和 ErrKey=0x00000000

    调用 sl_SelfTest_STC ()后、寄存器 STC1_GStat = 0x00000A03且 STC1_fstat=0x00000003

    函数 sl_SelfTest_STC()没有返回任何内容,这是正确的, 但无论我等待多长时间,它都不会复位 CPU。

    在调用 STC 自检之前、您能否确切地告诉我应该设置哪些寄存器?我需要多长时间来重置 CPU?

    谢谢、致以诚挚的问候

    Rabie

     

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

    您好 Rabie、

    我指的是 ESM 错误引脚状态。 该值反映在寄存器 ErrPinStat 中。 在运行 STC 自检之前、寄存器的值应该为1。 您的案例中似乎没有 ESM 错误。

    如果自检既未返回、也未生成 CPU 复位、 则代码执行在哪里? 您如何检查 CPU 复位从未发生?

    我检查这一点的方法是、我在 CPU 复位处理程序中保留一个与自身循环的指令。

    一旦 PC 到达指令 "B"、除非您强制 PC 移动到下一条语句、否则它不会继续执行下一条语句。 通过这种方式、我知道发生了 CPU 复位。

    谢谢、此致、

    Veena

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

    您好、Veena、

    感谢您的回答。  

    在过去2天中、成功地跳转了函数 SL_SelfTest_STC (STC1_COMPARE_SELFCHECK、TRUE、&stcSelfTestConfig)、并通过查看上面左侧的"Debug"窗口来验证该函数是否生成 CPU 复位。  

    但是、现在我的一个非常大的问题是寄存器"ErrPinStat"始终为零、这意味着已经发生了一个错误。 我写"ErrPinStat = 0x01"来清除该寄存器、但这不起作用、也没有更改寄存器的值。 然后、我在"ESM"模块中使用了所有可能的函数、但仍然无法正常工作。 我还尝试减小"Ltcnt"寄存器的值并写入"ErrKey = 0x5"、但这也没有影响。

    如您所知、如果"ErrPinStat"等于零、自检函数将永远不会被启动。 那么我如何将这个寄存器"ErrPinStat"复位回"1"呢?

    如何知道该值在寄存器中背后的原因?

    感谢您的帮助

    此致  

    Rabie

     

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

    您能否查看 ESM 状态寄存器来识别标记了哪个 ESM 通道? 您可以在 CCS 的寄存器浏览器中访问这些寄存器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Chuck、

    在下图中、您可以看到寄存器。 "ErrPinStat"始终为零、因此无法启用自检功能。 根据文档(spnz180d)器件#56、这是一个已知问题。 我尝试使用描述的变通办法解决它、但这不起作用。 我还在不使用 JTAG 的情况下运行程序、但这也不起作用。  

    谢谢大家、此致

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

    我在上面的列表中看到 ErrorKey = 0x00000005。 您可以尝试写入为0吗? 写为0应将 nERROR 引脚行为返回到正常模式并将其取消置位。