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.

[参考译文] TMS320F280025:TMS320f28002x UL60730自检库

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1013041/tms320f280025-tms320f28002x-ul60730-self-test-library

器件型号:TMS320F280025
主题中讨论的其他部件:C2000WAREAFE031CCStudio、SFRA

你(们)好

我将针对具有 TMS320F28002x MCU 的应用应用应用 UL60730。 但是、我找不到 MCU 系列的任何库。 请建议如何获取库和文档。

BR

HK Woo

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

    如果您尚未看到器件安全手册 、请访问此处:https://www.ti.com/lit/pdf/spruit5

    C2000Ware 中有一个用于 F28002x 的诊断库。 在 libraries/diagnostic/f28002x 下查找它。

    惠特尼

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

    我按照您的信息下载文档"安全手册"并进行检查。 这似乎是一个仅介绍 MCU 功能的文档。 它不会向我们展示如何实施自检。

    我下载 C2000Ware/libraries/diagnostic/f28002x/docs 下的"DIAG_Lib_TMS320F28002x_Users_Guide"并导入一个示例"SDL_Ex_ram_parity_test"。

    TI 是否有文档来解释该示例? 这是因为我找不到函数说明、例如 MemCfg_setTestMode...

    BR

    HK Woo

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

    安全手册对不同的诊断和机制进行了很好的总结、但在技术参考手册中查找这些信息仍然很有帮助、以了解更多详细信息。

    诊断库有用户指南、尽管它是从工程中主.c 文件顶部的注释生成的、因此您可以直接读取这些注释。 示例中调用的大多数函数(如 MemCfg_setTestMode)来自 Driverlib。 您可以在此处或 C2000Ware 中的 device_support/f28002x/docs/html/index.html 下找到 Driverlib API 参考指南。

    惠特尼

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

    惠特尼

    我仍然不了解 MCU 的自检过程。 我在香港找到。 是否有机会与 TI 支持人员进行缩放通话以进行讨论。 我们的项目正在运行。 需要 TI 支持。

    BR

    HK Woo

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

    该流程的哪些方面给您带来了麻烦? 您是否在确定需要运行哪些测试时遇到问题? 或者了解如何配置器件以运行它们? 还是其他东西?

    惠特尼

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

    您好、Whitney

    我正在占用@ 2个区域。 IEC60730要求中的 RAM 和闪存测试。

    我正在使用 TI PLC IC AEF031及其由 TI 提供的编译库 FSK_corr_detect_lib_eabi.lib。

    RAM 测试。

    根据 IEC60730、有必要执行与库相关的 RAM DC 故障。 但是、我不知道库使用的变量的实际地址。

    如果我们要查看库的源代码。 我们自己修改代码的风险太大。

    闪存测试。

    1.找不到任何文档/示例代码来读取闪存内容以进行校验和检查

    2.如何将闪存的一小部分保留为 EEPORM

    3.如果闪存在固件刻录过程中模拟 EEPORM、如何将校验和值刻录到项目2。 例如、 将校验和数据存储到.out 或.hex、这样就无需编写通信函数即可将校验和发送到 MCU、然后将其写入仿真 EEPORM。

    BR

    HK Woo

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

    您好、Whitney

    我从安全机构那里获得了信息。 IEC60730应用的一些要求、需要按 如下所示检查寄存器

    1、ACC、P、XT、XAR3-XAR7、PC、 RPC、ST0、ST1、DP、SP、 IER、IFR、DBGIER。 如果是55H、测试算法可以写入55H、而如果是55H、可以读出;如果是 AAH、可以写入 AAH 和读出  

    2.需要检查所有 RAM 是否存在直流故障

    对于项目1、我找到了演示代码 f28002x_test_application。 似乎一个 API 调用 STL_CPU_REG_checkCPURegisters ()将检查所有这些 CPU 寄存器。

    我有一个问题、如下所示

    A. API 是否会影响更多程序流。 这是因为有一个运行@ 300KHz 的 ISR 来对来自 TI PLC 芯片 AFE031的 PLC 信号进行采样。

    B. API 的总执行时间是多少? 这样做的原因是为了防止由于演示代码 sta_tests.c 中的项目 a 而导致的溢出

               Dint;
    #if STA_UTIL_profile
               STA_Util_startProfiler (CPUTIME1_BASE);
    #endif

               uint16_t returnVal =
                       STL_CPU_REG_checkCPURegisters (STA_Tests _注入错误);

    #if STA_UTIL_profile
               uint32_t cycleCount = STA_Util_stopProfiler (CPUTIME1_base);
               STA_Tests_cycleCounts[STA_CPU_REG]= cycleCount;

    来自 CCStudio 表达式窗口的 STA_Tests 和 cycleCounts[STA_CPU_REG]为686。 它意味着它需要6.86us

    此外、如果我删除上述红色代码、则会出现任何问题。 它似乎仅用于确定执行时间、对吗?

    c.能否向我解释 API 的输入参数为何是 bool True 或 False。 我不理解文档"DIAG_Lib_TMS320F28002x"中的解释

    对于第2项、我正在研究演示代码 SDL_Ex_ram_ecc_parit_test、它是否正确?

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


    您是否能够请求访问 FSK_corr_detect_lib_eabi.lib 源代码?

    对于 RAM 测试、SRAM 在硬件复位时已经启用 ECC 或奇偶校验(安全手册中的 SRAM1和 SRAM2)。 SDL_ex_ram_ecc_parity 测试演示了如何执行 ECC/奇偶校验功能(SRAM13/SRAM14)的软件测试。 要对 SRAM 执行更主动的测试、您可以查看库中的 STL_March 模块、该模块会经过给定的存储器范围并将模式写入 RAM 以检查是否存在卡住的位。

    闪存与之类似、它具有可执行诊断测试的硬件 ECC (SDL_ex_flash_ecc_test 示例)。 对于执行 CRC 校验、您可以使用库中的 STL_CRC 函数。 f28002x_test_application 通过检查 OTP 的一小部分来演示如何使用这些函数、但您可以在其他存储器上使用它们。 这里有一个文档、介绍了如何让链接器为您生成 CRC 表:
    software-dl.ti.com/.../appnote-perform_crc_check.html

    正确的是 STL_CPU_REG 可以检查 CPU 寄存器。 该参数用于将错误注入测试、使其在目的上失败、以便您可以测试您的应用是否对错误做出了正确的反应。

    您对分析功能的理解是正确的。 它返回的值以时钟周期为单位、因此假设 SYSCLK 为100MHz、6.68us 是正确的。 您不必在代码中保留分析函数。 它们只是为了方便对功能进行一些基准测试。

    惠特尼

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

    您好、Whitney

    对于 API STL_CPU_REG_checkCPURegisters ()、我仍然不理解。 如果我想检查 CPU 寄存器、它是否正常。 应使用什么参数"设置"或"错误"? 这是我的理解、如下所示

    情况1.

    X = STL_CPU_REG_checkCPURegisters (false);

    如果寄存器没有问题、X 应该为 CPU_REG_PASS、否则为 RESUE_REG_FAIL;

    情况2.

    X = STL_CPU_REG_checkCPURegisters (真);

    如果寄存器没有问题,X 应该是 CPU_REG_FAIL,否则返回 CPU_REG_PASS;

    对于自检设置、必须具有以下代码

       EALLOW;
       HWREGH (NMI_BASE + NMI_O_FLGCLR)= 0xFFFF;
       HWREGH (NMI_BASE + NMI_O_CFG)|= NMI_CFG_NMIE;
       EDIS;

    我有疑问、是否有必要将其重新配置为正常模式、或者仅保留一段时间、例如

    MAIN ()

       EALLOW;
       HWREGH (NMI_BASE + NMI_O_FLGCLR)= 0xFFFF;
       HWREGH (NMI_BASE + NMI_O_CFG)|= NMI_CFG_NMIE;
       EDIS;

      for (;;)

      {

           …

            我的应用程序代码;

           …

           if (需要执行 CPU 寄存器测试)

          {

                Dint;

    /*或在此处将上面的代码置于红色位置????????? *

                X = STL_CPU_REG_checkCPURegisters (真);

               如果(x = CPU_REG_FAIL)

              {

                   我的代码;

              }

    /*我们是否需要将 NMI_BASE 重新配置为其他模式,在此处显示我的应用程序以正常操作运行,如果需要,代码是什么。*/

              EINT;

         }

    ISR (Vode)

         我的代码;

    -.对于 RAM/Flash 检查、我仍在检查代码。

    -.for FSK_corr_detect_lib_eabi.lib。 我通过 TI 网站收到了消息来源。 我不知道 TI 是否向我发送了正确的版本。 这是因为 TI 在网站中发布库不是 EABI 格式。

    BR

    HK Woo

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

    对于正常运行、您将错误注入参数保留为 false (情况1)。 注入错误的选项仅供您测试系统在检测到错误时如何处理。

    您不需要对 NMI 执行任何操作即可运行 STL_CPU_REG 测试。 即使检测到故障、STL_CPU_REG 测试也不会生成 NMI。 您可能根本不需要该行来写入应用程序中的 NMIE。 独立运行时、引导 ROM 启用 NMI、并且在调试模式下运行时、GEL 文件会执行该操作、假设您使用的是 CCS 默认值。

    我将研究是否对 FSK_corr_detect_lib_eabi.lib 源代码进行了任何代码更改、以允许为 EABI 构建该源代码。

    惠特尼

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

    您好、Whitney

    感谢您的信息。 我在 CPU 寄存器上完成了一个代码。 我将启动一个 RAM 代码。 根据安全机构的说法、需要检查 RAM 的整个部分。 我无法从 RAM 的起始地址和结束地址中获取。 请帮帮我。

    我想使用 STL_March 测试 RAMCopy 和 STL_March 检查错误状态来解决 RAM DC DC 故障

    下面是我对编码的看法

    Dint;    

    STL_March testRAMCopy (STL_March pattern_1、 0x0000、7、 0xFFFFFFF);

    EINT;
    uint16 returnVal STL_March _checkErrorStatus ();

    if (returnVal!= STL_March _pass) ErrorFound

    它是正确的、您能解释什么是 STL_March pattern_one、STL_March pattern_tw....

    非常感谢

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

    数据表中有一个表格、显示了所有不同 RAM 的地址和大小。 在最新版本的数据表中、它位于第8.3.1节: https://www.ti.com/lit/pdf/sprsp45

    这些功能将起作用。 如果您能够在调用_c_int00在 RAM 中初始化变量之前运行测试、则可以使用 STL_March testRAM、因为它不会保存和恢复到存储器、因此可以更快地运行测试。 我已经看到其他客户在这种方法上取得了成功、但是如果执行时间不是问题、或者您计划一次在小部分中定期运行测试、那么您所拥有的一切都是可以的。

    这里有一个文档、它对模式的用途进行了更详细的解释: https://www.ti.com/lit/pdf/spracb9

    如果可以提高诊断覆盖率、建议循环执行、但严格意义上没有必要。

    惠特尼

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

    惠特尼

    IEC 要求定期运行 RAM 测试、因此我需要使用 STL_MarchRAMCopy。我有疑问、在运行代码之前是否需要执行任何初始化函数。

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

    您能详细说明吗? 在运行 STL_March 测试 RAMCopy 之前、您的具体意思是什么? 如果这是您所说的、不是、STL_March _testRAMCopy 没有 init 函数。 只要它对被测试的 RAM 具有读/写访问权限、它就应该可以运行了。

    惠特尼

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

    您好、Whitney

    我查看了项目 f28002x_test_application sta_tests.c 中的代码

           案例 STA_March 复制:
           {
               uint32_t originalValue;
               uint16_t 索引;

               //
               //填充 STA_User_marchTestData 以使复制更容易
               //观察。
               //
               for (索引= 0;索引< STA_USER_March _DATA_SIZE;index++)
               {
                   STA_User_marchTestData[index]=索引;
               }

               //
               //清除 RAM 错误状态标志。
               //
               MemCfg_clearUncorrErrorStatus (MEMCFG_UCERR_CPUREAD |
                                             MEMCFG_UCERR_DMAREAD);
               MemCfg_clearCORErrorStatus (MEMCFG_CERR_CPUEAD);

               //
               //初始化 stl_March 的注入错误句柄。
               //
               STA_User_initMarch ();

               //
               //在内存中注入错误。
               //
               if (STA_Tests _注入错误)
               {
                   //
                   //在 M0中导致单一位错误(ECC、可纠正)
                   //
                   originalValue = HWREG (STA_User_marchErrorObj.address);
                   STA_User_marchErrorObj.TESTMODE = MEMCFG_TEST_WRITE_DATA;
                   STA_User_marchErrorObj.xorMask = 0x00000001U;
                   STL_March 注入错误(STA_User_marchErrorHandle);
               }

    #if STA_UTIL_profile
               STA_Util_startProfiler (CPUTIME1_BASE);
    #endif

               STL_March testRAMCopy (STL_March pattern_1、
                                     (uint32_t) STA_User_marchTestData、
                                     (STA_USER_March 数据_SIZE / 2U)- 1U、
                                     (uint32_t) STA_User_marchTestDataCopy);

    #if STA_UTIL_profile
               uint32_t cycleCount = STA_Util_stopProfiler (CPUTIME1_base);
               STA_Tests_cycleCounts[STA_March _copy]= cycleCount;
    #endif

    有一条指令 STA_User_initMarch ()、我不知道是否需要使用它。 在指令           STL_March 测试 RAMCopy (STL_March pattern_1、
                                     (uint32_t) STA_User_marchTestData
                                     (STA_USER_March 数据_SIZE / 2U)- 1U、
                                     (uint32_t) STA_User_marchTestDataCopy);

    为什么起始地址和复制地址是带有数组索引的变量的名称? 它应该是 RAM 的地址、例如0x0000、与此类似。

    实际上、正如您所说的、我将在小部分中检查整个 RAM。

    我的代码喜欢并以 M0为例

    uint32 strat_address = 0x000000;

    MAIN ()

        IF (ramCheck)

       {        

             Dint;    

             STL_March testRAMCopy (STL_March pattern_one、 start_address、7、 0xFFFFF);// 7被表示需要检查8个 RAM 地址
             uint16 returnVal STL_March _checkErrorStatus ();

             if (returnVal!= STL_March _pass) ErrorFound;

             start_address = start_address + 8;

            如果(START_ADDRESS = 0x3FF) START_ADDRESS = 0x0000;

             ramCheck = false;

       }

       我的主循环程序代码....

    定时器_ISR ()

       ramCheck = true;

    此外、我计划为复制地址保留 RAM  、该复制地址用作 STL_March testRAMCopy 的临时存储。 如何在链接文件或任何其他方法中执行此操作?

    实际上、该代码用于检查整个 RAM 部分。 它是正确的代码吗?

    在 https://www.ti.com/lit/pdf/sprsp45文档 的第8.3.1节中、我仍然有疑问

    以 M0为例、从0x000到0x3FF、1K x 16。 16的含义。  它是16位。 如果我的代码 STL_March testRAMCopy (STL_March _pattern_one、 0x0000、7、 0xFFFFF);是指 API 将检查地址从0x0000到0x0007的总长度8。

    如果我的某些程序在 RAM 中运行、是否存在运行 RAM 测试的问题。

    此外、请在下面的链接文件中找到使用 TMS320F280025的项目。 地址似乎与第8.3.1节中提到的文档不同

    存储器

      开始             :origin = 0x080000,length = 0x000002
      BOOT_RSVD      :origin = 0x00000002,length = 0x00000126
      RAMM0             :origin = 0x00000128,length = 0x000002D8
      RAMM1           :origin = 0x00000400,length = 0x000003F8    //片上 RAM 块 M1 *
    // RAMM1_RSVD      :origin = 0x000007F8,length = 0x00000008 //根据勘误咨询“Memory:Prepetching Beyond valid Memory”(内存:超过有效内存的预取),保留并不用于代码*/

    /* RAMLS4          :origin = 0x0000A000,length = 0x00000800
      RAMLS5          :origin = 0x0000A800,length = 0x00000800
      RAMLS6          :origin = 0x0000B000、length = 0x00000800
      RAMLS7          :origin = 0x0000B800,length = 0x00000800*/

      /*合并所有 LS RAM */
      RAMLS4567       :origin = 0x0000A000,length = 0x00002000
      RAMGS0          :origin = 0x0000C000,length = 0x000007F8
    // RAMGS0_RSVD     :origin = 0x0000C7F8,length = 0x00000008 //保留并不用于根据勘误咨询“内存:预取超出有效内存”的代码*/


    // FLASHBANK1      :origin = 0x00080000,length = 0x0000FFF0
    // flash_bank1_RSVD:origin = 0x0008FFF0,length = 0x00000010 //保留并不用于根据勘误咨询“Memory:pretching Beyond valid Memory”(内存:有效内存之外的预取)*/的代码
      BootROM         :origin = 0x003F0000,length = 0x00008000
      BootROM_EXT     :origin = 0x003F8000,length = 0x00007FC0
      复位           :origin = 0x003FFFC0,length = 0x00000002
      /*闪存扇区*/
      /*组0 */
      FLASH_BANK0_SEC0 :origin = 0x080002、length = 0x000FFE   //片上闪存*
      FLASH_BANK0_SEC1 :origin = 0x081000、length = 0x001000   //片上闪存*
      FLASH_BANK0_sec2 :origin = 0x082000、length = 0x001000   //片上闪存*
      FLASH_BANK0_SEC3 :origin = 0x083000、length = 0x001000   //片上闪存*
      FLASH_BANK0_SEC4 :origin = 0x084000、length = 0x001000   //片上闪存*
      FLASH_BANK0_SEC5 :origin = 0x085000、length = 0x001000   //片上闪存*
      FLASH_BANK0_SEC6 :origin = 0x086000、length = 0x001000   //片上闪存*
      FLASH_BANK0_SEC7 :origin = 0x087000、length = 0x001000   //片上闪存*
      FLASH_BANK0_SEC8_9_10 :origin = 0x088000、length = 0x003000   //片上闪存*
      //FLASH_BANK0_SEC8 :origin = 0x088000、length = 0x001000   //片上闪存*
      //flash_BANK0_SEC9 :origin = 0x089000,length = 0x001000   //片上闪存*
      //FLASH_BANK0_SEC8_9:origin = 0x088000、length = 0x002000   //片上闪存*
      //flash_BANK0_SEC10:origin = 0x08A000、length = 0x001000   //片上闪存*
      FLASH_BANK0_SEC11:origin = 0x08B000、length = 0x001000   //片上闪存*
      FLASH_BANK0_SEC12:origin = 0x08C000、length = 0x001000   //片上闪存*
      FLASH_BANK0_SEC13:origin = 0x08D000、length = 0x001000   //片上闪存*
      FLASH_BANK0_SEC14:origin = 0x08E000、length = 0x001000   //片上闪存*
      FLASH_BANK0_SEC15:origin = 0x08F000、length = 0x000FF0   //片上闪存*
    // flash_BANK0_SEC15_RSVD    :origin = 0x08FFF0,length = 0x000010 //根据勘误咨询“Memory: prepetching Beyond valid Memory”(内存:超出有效内存的预取),保留代码且不用于代码*/




    部分

      codestart       :>开始,align (8)
      .text           :>> flash_BANK0_sec2 | flash_BANK0_SEC3 | flash_BANK0_SEC4 | flash_BANK0_SEC5、  align (8)
      .cinit          :> flash_BANK0_SEC1, align (8)
      .switch         :> FLASH_BANK0_SEC1, ALIGN (8)
      .reset          :> reset,                 type = DSECT /* not used,*/

      .stack          :> RAMM1

      init_array     :> flash_BANK0_SEC1, align (8)
      .bss            :> RAMLS4567
      .bss:输出     :> RAMLS4567
      .bss:CIO        :>RAMGS0
      .const          :> FLASH_BANK0_SEC1、 ALIGN (8)
      .data           :> RAMLS4567
      .sysmem         :> RAMLS4567

       RAMS0:> RAMGS0

      /* 分配 IQ 数学区域:*/
      IQMath          :> RAMLS4567
      IQmathTables    :> RAMLS4567

      FSK_corr_lib_data:> RAMLS4567

      组
      {
          .TI.ramfunc
          {
              l sfra_F32_TMU_eabi.lib
          }
          ramfuncs

      }LOAD = FLASH_BANK0_SEC6、
            运行= RAMLS4567、
            Load_start (RamfuncsLoadStart)、
            load_size (RamfuncsLoadSize)、
            Load_End (RamfuncsLoadEnd)、
            RUN_START (RamfuncsRunStart)、
            run_size (RamfuncsRunSize)、
            RUN_END (RamfuncsRunEnd)、
            对齐(4)

    /*
     .TI.ramfunc     :load = flash_BANK0_SEC1,
                     运行= RAMGS0、
                     Load_start (RamfuncsLoadStart)、
                     load_size (RamfuncsLoadSize)、
                     Load_End (RamfuncsLoadEnd)、
                     RUN_START (RamfuncsRunStart)、
                     run_size (RamfuncsRunSize)、
                     RUN_END (RamfuncsRunEnd)、
                     对齐(8)
    *
       SFRA_F32_Data   :> RAMLS4567,ALIGN = 64

       FPUmathTables   :> FLASH_BANK0_SEC11


       //.scratchpad     :> RAMLS4567
       //controlVariables:> RAMLS4567

       组
       {
           isrcodefuncs
           Dclfuncs
       }   LOAD = FLASH_BANK0_SEC8_9_10、
            运行= RAMLS4567、
            load_start (isrcodefuncsLoadStart)、
            load_size (isrcodestfuncsLoadSize)、
            load_end (isrcodefuncsLoadEnd)、
            run_start (isrcodefuncsRunStart)、
            run_size (isrcodefuncsRunSize)、
            run_end (isrcodefuncsRunEnd)、
            对齐(4)


    BR

    HK Woo

              

    hk

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

    尊敬的 

    该领域的领域专家目前不在办公室,将于7月21日返回。  您的详细回答将延迟。  

    关于您的以下问题:

    [引用 userid="46959" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1013041/tms320f280025-tms320f28002x-ul60730-self-test-library/3758478 #3758478"]

    有一条指令 STA_User_initMarch ()、我不知道是否需要使用它。 在指令           STL_March 测试 RAMCopy (STL_March pattern_1、
                                     (uint32_t) STA_User_marchTestData
                                     (STA_USER_March 数据_SIZE / 2U)- 1U、
                                     (uint32_t) STA_User_marchTestDataCopy);

    为什么起始地址和复制地址是带有数组索引的变量的名称? 它应该是 RAM 的地址、例如0x0000、与此类似。

    [/报价]

    STL_March testRAMCopy 在 C28x 汇编语言中实现。  请 查看文件 stl_March s.asm 来查看所有相关详细信息。  简而言之、 STA_User_marchTestData 和  STA_User_marchTestDataCopy 是各具有16个元素的数组。

    关于以下问题、  

    [引用 userid="46959" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1013041/tms320f280025-tms320f28002x-ul60730-self-test-library/3758478 #3758478]m0为例,从0x000到0x3FF 为1K x 16。 16的含义。  它是16位。 如果我的代码 STL_March testRAMCopy (STL_March _pattern_one、 0x0000、7、 0xFFFFF);这是否意味着 API 将检查0x0000到0x0007的地址、总长度为8。

    是的、1Kx16中的16意味着16位。  1K 块中的每个位置为16位宽。  请按照您喜欢的方式配置 C2000Ware 中提供的示例、并使用调试器逐步完成操作、以了解 API 执行的操作。

    谢谢、

    Krishna  

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

    您好、HK、

    我回到办公室。 您对3月测试的所有问题是否都已解决、或者您是否需要其他帮助?

    惠特尼

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

    您好、Whitney

    我与安全机构进行了讨论。 目前、在我分享 TI 文档后、他们不接受使用 TI 诊断库来实现 IEC60730。  原因如下

    TI 文档中没有显示 API 执行 RAM 测试如何符合 IEC60730的 sudo 代码。 这是该标准非常重要的要求。

    2.如果我们不知道机制,如何测试演示。

    我为 RAM 测试编写了自己的代码、如下所示

    void IEC_RamTesting (void)//代码中使用的大多数变量都是全局专用变量

       uint32_t x = 0;
       Dint;

       //ram_address_pr =(volatile uint32_t *) start_address;
       对于(x = 0;x < 597;x++)
       {
           Dummy1++;
           RAM_tempCopy =* ram_address_pr;//起始地址为0x00128,它基于链接命令文件
           //ram_tempNextCopy = * ram_address Next_pr;
           对于(pattern_index = 0;pattern_index < 12;pattern_index++)
           {

               /*
                *    uint32_t pattern_array[12]={pattern_00000000、pattern_555555、pattern_333333、pattern_0F0F0F0F0F0F0F、
                                     pattern_00FF00FF、pattern_0000FFFF、pattern_FFFF0000、pattern_FF00FF00、
                                     pattern_F0F0F0、pattern_CCCCCC、pattern_AAAAAAAA、pattern_FFFFFFFF};
                *
               * ram_address_pr = pattern_array[ pattern_index];
               if (* ram_address_pr!= pattern_array[pattern_index])
               {
                   mcuFault_Status = mcuFault_Status | 0x02;
               }

           }
           * ram_address_pr = ram_tempCopy;

           RAM_ADDRESS_pr++;
           如果(ram_address_pr =(uint32_t *) 0x000007FA)//指针必须为偶数,因为指针增加2
           {
               RAM_ADDRESS_pr =(uint32_t *) 0x0000A000;
               //ram_address Next_pr =(uint32_t *) 0x0000A000;
           }
           if (ram_address_pr =(uint32_t *) 0x0000C7D4)
           {
               RAM_ADDRESS_pr =(uint32_t *) 0x00000128;
               Dummy1 = 0;
               X = 1000;
           }
       }
       EINT;

    上述机制基于建议执行 RAM 测试的安全机构。 它基本上可以工作、但我发现了一个问题、这对我来说非常有力。

    基于我的链接文件的存储器部分

    存储器

      开始             :origin = 0x080000,length = 0x000002
      BOOT_RSVD      :origin = 0x00000002,length = 0x00000126
      RAMM0             :origin = 0x00000128,length = 0x000002D8
      RAMM1           :origin = 0x00000400,length = 0x000003F8    //片上 RAM 块 M1 *
    // RAMM1_RSVD      :origin = 0x000007F8,length = 0x00000008 //根据勘误咨询“Memory:Prepetching Beyond valid Memory”(内存:超过有效内存的预取),保留并不用于代码*/

    /* RAMLS4          :origin = 0x0000A000,length = 0x00000800
      RAMLS5          :origin = 0x0000A800,length = 0x00000800
      RAMLS6          :origin = 0x0000B000、length = 0x00000800
      RAMLS7          :origin = 0x0000B800,length = 0x00000800*/

      /*合并所有 LS RAM */
      RAMLS4567       :origin = 0x0000A000,length = 0x00002000
      //RAMGS0          :origin = 0x0000C000,length = 0x000007F8
      RAMGS0          :origin = 0x0000C000,length = 0x000007D4
      RAMGS0_TEMPSCOPY :origin = 0x0000C7D4,length = 0x00000024
    // RAMGS0_RSVD     :origin = 0x0000C7F8,length = 0x00000008 //保留并不用于根据勘误咨询“内存:预取超出有效内存”的代码*/


    // FLASHBANK1      :origin = 0x00080000,length = 0x0000FFF0
    // flash_bank1_RSVD:origin = 0x0008FFF0,length = 0x00000010 //保留并不用于根据勘误咨询“Memory:pretching Beyond valid Memory”(内存:有效内存之外的预取)*/的代码
      BootROM         :origin = 0x003F0000,length = 0x00008000
      BootROM_EXT     :origin = 0x003F8000,length = 0x00007FC0
      复位           :origin = 0x003FFFC0,length = 0x00000002
      /*闪存扇区*/
      /*组0 */
      FLASH_BANK0_SEC0 :origin = 0x080002、length = 0x000FFE   //片上闪存*
      FLASH_BANK0_SEC1 :origin = 0x081000、length = 0x001000   //片上闪存*
      FLASH_BANK0_sec2 :origin = 0x082000、length = 0x001000   //片上闪存*
      FLASH_BANK0_SEC3 :origin = 0x083000、length = 0x001000   //片上闪存*
      FLASH_BANK0_SEC4 :origin = 0x084000、length = 0x001000   //片上闪存*
      FLASH_BANK0_SEC5 :origin = 0x085000、length = 0x001000   //片上闪存*
      FLASH_BANK0_SEC6 :origin = 0x086000、length = 0x001000   //片上闪存*
      FLASH_BANK0_SEC7 :origin = 0x087000、length = 0x001000   //片上闪存*
      FLASH_BANK0_SEC8_9_10 :origin = 0x088000、length = 0x003000   //片上闪存*
      //FLASH_BANK0_SEC8 :origin = 0x088000、length = 0x001000   //片上闪存*
      //flash_BANK0_SEC9 :origin = 0x089000,length = 0x001000   //片上闪存*
      //FLASH_BANK0_SEC8_9:origin = 0x088000、length = 0x002000   //片上闪存*
      //flash_BANK0_SEC10:origin = 0x08A000、length = 0x001000   //片上闪存*
      FLASH_BANK0_SEC11:origin = 0x08B000、length = 0x001000   //片上闪存*
      FLASH_BANK0_SEC12:origin = 0x08C000、length = 0x001000   //片上闪存*
      FLASH_BANK0_SEC13:origin = 0x08D000、length = 0x001000   //片上闪存*
      FLASH_BANK0_SEC14:origin = 0x08E000、length = 0x001000   //片上闪存*
      FLASH_BANK0_SEC15:origin = 0x08F000、length = 0x000FF0   //片上闪存*
    // flash_BANK0_SEC15_RSVD    :origin = 0x08FFF0,length = 0x000010 //根据勘误咨询“Memory: prepetching Beyond valid Memory”(内存:超出有效内存的预取),保留代码且不用于代码*/

    RAM 的总数为5970、结束地址为0x0000C7D2。 在我的代码中、如果它运行10次、然后它完成5970 RAM 位置检查、并在红色代码中将指针重置为0x000128。 发现 ram_address_pr 的内容为0x00C7D2、但它仍然进入循环、执行次数为11次。

    我不知道为什么。 这是因为、如果指针的内容是0x00C7D2、而不是0x00C7D4。 程序不应进入循环。

    是否有提示或评论?

    BR

    HK Woo

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

    我将在以后的版本中做一个注释、在用户指南中添加一些伪代码。 这是一个非常简单的测试、但我知道组装很难遵循。

    您是否说它过早地重置指针一个循环? 您能否共享该代码段的反汇编?

    惠特尼

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

    惠特尼

    很抱歉耽误你的回答。 请查找屏幕截图供您参考

    ram_address_pr 的内容为0xC702、但我的检查是" if (ram_address_pr =(uint32_t *) 0x0000C7D4)"。 进入 IF 循环的原因

    请参阅以下反汇编内容。 注:断点是@ dummy1 = 0;基于汇编代码。 比较值为0xC7D4、"ram_address_pr"的内容为0xC7D2。

    083537:  6003       SB          $C$L81、NEQ
    793                ram_address_pr =(uint32_t *) 0x0000A000;
    083538:  8F40A000   MOVL        XAR5、#0x00a000
    797            if (ram_address_pr =(uint32_t *) 0x0000C7D4)
           $C$L81:
    08353a:  8F00C7D4   MOVL        XAR4、#0x00c7d4
    796            dummy4 = ram_address_pr;
    08353c:  A0AB       MOVL        @P、XAR5
    797            if (ram_address_pr =(uint32_t *) 0x0000C7D4)
    08353d:  A8A9       MOVL        @ACC、XAR4
    08353E:  0FAB       Cmpl        ACC、@P
    08353f:  600C       SB          $C$L82、NEQ
    800                dummy2 = 1000;
    083540:  8F0003E8   MOVL        XAR4、#0x0003e8
    083542:  761F028C   MOVW        DP、#0x28c
    799                dummy1 = 0;
    083544:  0200       MOVB        ACC、#0
    801                ram_address_pr =(uint32_t *) 0x00000128;
    083545:  8F400128   MOVL        XAR5、#0x000128
    083547:  A83C       MOVL        @0x3c、XAR4
    083548:  761F028D   MOVW        DP、#0x28d
    799                dummy1 = 0;
    08354a:  1E0E       MOVL        @0xe、ACC
    768        表示(dummy2 = 0;dummy2 < 597;dummy2++)
           $C$L82:
    08354b:  0201       MOVB        ACC、#1
    08354c:  761F028C   MOVW        DP、#0x28c
    08354e:  073C       附加        ACC、@0x3c
    08354f:  1EA7       MOVL        @XAR7、ACC
    083550:  8F000255   MOVL        XAR4、#0x000255
    083552:  1E3C       MOVL        @0x3c、ACC
    083553:  A8A9       MOVL        @ACC、XAR4
    083554:  0FA7       cmpl        ACC、@XAR7
    083555:  66C1       SB          $C$L79、HI
    083556:  A93E       MOVL        @0x3E、P
    083557:  761F031F   MOVW        DP、#0x31f
    083559:  A016       MOVL        @0x16、XAR5
    08355a:  2910       CLRC        INTM
    08355b:  FF69       SPM         #0
    08355c:  0006       LRETR        
           FSK_corr_Detecter_run ():
    08355d:  E20304BD   MOV32       * SP++,R4H
    08355f:  E20305BD   MOV32       * SP++,R5H
    083561:  E20306BD   MOV32       * SP++,R6H
    083563:  E20307BD   MOV32       * SP++,R7H
    083565:  761F02AC   MOVW        DP、#0x2ac
    083567:  0622       MOVL        ACC、@0x22
    083568:  071E       附加        ACC、@0x1E
    083569:  18A87FFF   和         @AH、#0x7fff
    08356b:  1E22       MOVL        @0x22、ACC
    08356c:  0624       MOVL        ACC、@0x24

    正如我提到的、根据我的计算、ROM 的总块数为5970。 我使用2个变量 dummy1和 dummy3来监视5970个块的 RAM 已检查和已执行函数的总数块的值。 假设 dummy1和 dummy 3分别为5970和10。 但是、它是5971和11。 我找不到这个问题。

    请查看以下链接文件中的存储器部分

    存储器

      开始             :origin = 0x080000,length = 0x000002
      BOOT_RSVD      :origin = 0x00000002,length = 0x00000126
      RAMM0             :origin = 0x00000128,length = 0x000002D8
      RAMM1           :origin = 0x00000400,length = 0x000003F8    //片上 RAM 块 M1 *
    // RAMM1_RSVD      :origin = 0x000007F8,length = 0x00000008 //根据勘误咨询“Memory:Prepetching Beyond valid Memory”(内存:超过有效内存的预取),保留并不用于代码*/

    /* RAMLS4          :origin = 0x0000A000,length = 0x00000800
      RAMLS5          :origin = 0x0000A800,length = 0x00000800
      RAMLS6          :origin = 0x0000B000、length = 0x00000800
      RAMLS7          :origin = 0x0000B800,length = 0x00000800*/

      /*合并所有 LS RAM */
      RAMLS4567       :origin = 0x0000A000,length = 0x00002000
      //RAMGS0          :origin = 0x0000C000,length = 0x000007F8
      RAMGS0          :origin = 0x0000C000,length = 0x000007D4
      RAMGS0_TEMPSCOPY :origin = 0x0000C7D4,length = 0x00000024

    其中 RAMGS0_TEMPSCOPY 保留供我自己使用。 它不会进行检查。

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

    您是否在编译器中启用了优化?

    那么、所讨论的比较似乎是"cmpl  acc、@P"、对吧? 如果您单步执行代码、而不是查看"Expressions"窗口、请查看 XAR4、XAR5、ACC 和 P (在"CCS Registers"视图中的"Core Registers"下)、这些值是否看起来正常? 在 Dissassembly 中、我无法看到 XAR5之前的更新位置、但我想知道它是否与 ram_address_pr 的表达式窗口显示的内容不同。

    惠特尼

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

    您好、Whitney

    1.是的,通过选项4启用优化,速度与尺寸之间的折衷为5

    2.我对装配不是很熟悉,因此不理解你的意思。 抱歉。 您能解释得更多吗?

    3.我查看这些寄存器的内容 ACC=0xC7D4、P=0xC7D4、XAR4=0x03E8、XAR5=0xC7D4。  在查看具有优化级别4的寄存器内容期间、我创建一个断点@代码"dummy1 = 0"。

    4.我做一些测试。 我将优化级别配置为0。 CCS 表达式视图显示了正确的指针值。

    根据#3和#4的结果、我是否可以说问题仅与 CCS 编译器显示问题有关? 对固件的功能没有影响。

    此外、我仍然不能确定函数执行次数的问题。

    BR

    HK Woo

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

    "Expressions"窗口专门查看 ram_address_pr 在 RAM 中的存储位置、因此它不会显示代码已优化了对该 RAM 位置的一些访问、而是使用 XAR5来保存要检查的当前地址。 通过查看内核寄存器和反汇编、我可以知道 XAR5 = ACC = ram_address_pr = 0xC7D4和 P = 0xC7D4、因此检查 P = ACC 是否会导致执行 IF 语句的指令。

    直到后面几条指令之后、内存中的实际变量才会更新(与上面所示的0x083559处的指令类似)。 在我看来、代码做得不错、但从表达式窗口的角度来看、高级别的优化会掩盖它。

    惠特尼

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

    惠特尼

    感谢您的更新。 函数执行的次数。 完成 RAM 部分预计需要5970次。 请在链接查找中找到以下部分的信息

    存储器

      开始             :origin = 0x080000,length = 0x000002
      BOOT_RSVD      :origin = 0x00000002,length = 0x00000126
      RAMM0             :origin = 0x00000128,length = 0x000002D8
      RAMM1           :origin = 0x00000400,length = 0x000003F8    //片上 RAM 块 M1 *
    // RAMM1_RSVD      :origin = 0x000007F8,length = 0x00000008 //根据勘误咨询“Memory:Prepetching Beyond valid Memory”(内存:超过有效内存的预取),保留并不用于代码*/

    /* RAMLS4          :origin = 0x0000A000,length = 0x00000800
      RAMLS5          :origin = 0x0000A800,length = 0x00000800
      RAMLS6          :origin = 0x0000B000、length = 0x00000800
      RAMLS7          :origin = 0x0000B800,length = 0x00000800*/

      /*合并所有 LS RAM */
      RAMLS4567       :origin = 0x0000A000,length = 0x00002000
      //RAMGS0          :origin = 0x0000C000,length = 0x000007F8
      RAMGS0          :origin = 0x0000C000,length = 0x000007D4
      RAMGS0_TEMPSCOPY :origin = 0x0000C7D4,length = 0x00000024
    // RAMGS0_RSVD     :origin = 0x0000C7F8,length = 0x00000008 //保留并不用于根据勘误咨询“内存:预取超出有效内存”的代码*/

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

    你在 RAMM1中走得太远了吗? M1的长度为0x3F8、但当地址为0x7FA 时将停止、但 GS0结束时、长度为0x7D4、您将在0xC7D4处停止

    惠特尼

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

    惠特尼

    感谢您的发现。 问题已修复。 我认为 IEC 60730 RAM 测试应该可以。 但是、我仍然有一个问题 TI STL_CPU_REG_checkCPURegisters ()。 如果您与我共享该函数的伪代码、以便我可以在与安全机构共同测试期间向他们演示。

    BR

    HK Woo

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

    查看随附的是否对您有所帮助。 我将其另存为.c 文件、以便在 文本编辑器中突出显示语法、但它显然不是可执行的 C 代码。

    e2e.ti.com/.../cpu_5F00_reg_5F00_test_5F00_pseudocode.c

    惠特尼

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

    您好、Whitney

    我向安全机构展示了伪代码、他们说正在审核。 除此之外、他们还问了一个问题、如何测试函数。 我告诉他们、我们可以在函数中包含 true 参数以生成错误、但他们说这不是一个好主意、他们希望在调试模式下的测试期间手动更改寄存器的值。 您能建议如何操作?

    HK Woo

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

    是的、在调试模式下、您肯定可以这样做。 CPU 寄存器位于 CCS Registers 窗口中的"Core Registers"下。 对于任何寄存器、您都可以在测试模式写入寄存器后、但在比较完成之前、在"Registers"窗口中的该寄存器中翻转一个位、然后运行应用程序以确保返回故障。

    例如、在下面、我在 MOVL XT、@ACC 之后的第51行上放置一个断点(将存储在 ACC 寄存器中的模式移动到 XT 寄存器中)、并翻转了寄存器窗口中 XT 寄存器中的一个位(将0x55555555更改为0x5555555545)。 然后、当我单步执行它时、我可以看到它将该分支转到 failCPURegTest、其中设置了返回值以指示故障。

    惠特尼