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.

[参考译文] TMS570LS3137:闪存模块诊断模式7的问题

Guru**** 2482225 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/707712/tms570ls3137-problems-with-flash-module-diagnostic-mode-7

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

我正在执行从 self_test.c 获取的以下代码、它始终达到失败条件、即未检测到单个位错误。

在调用此函数之前、已在 CPU 和闪存模块中启用 ECC 逻辑。

flashBadECC 设置为0x20000000

有什么想法、为什么这不起作用?

 

/*@fn void checkFlashECC (void)
 *
 *此函数检查闪存 ECC 错误检测逻辑。
 * checkFlashECC 函数使用闪存接口模块的诊断模式7
 *在 CPU 对闪存的访问中创建单位和双位错误。 一个双位
 读取闪存时出错会导致数据中止异常。
 *编写数据中止处理程序是为了查找故意引起的异常和
 *将代码执行返回到已中止的指令之后的指令。
 *
静态空 checkFlashECC (空)

  /*例程、用于检查 CPU 内 ECC 逻辑的运行情况、以便访问程序闪存*/
  易失性 UINT32闪存读取= 0U;
  
  /*闪存模块 ECC 响应被启用*/
  flashWREG->FEDACCTRL1 = 0x000A060AU;            
  
  /*启用诊断模式并选择诊断模式7 */
  flashWREG->FDIAGCTRL = 0x00050007U;            
  
  /*选择 ECC 诊断模式,单位损坏*/
  flashWREG->FPAROVR = 0x00005A01U;            
  
  /*为诊断模式设置触发器*/
  flashWREG->FDIAGCTRL |= 0x01000000U;            
  
  /*从镜像内存映射读取闪存位置*/
  flashread = flashBadECC;    
  
  /*禁用诊断模式*/
  flashWREG->FDIAGCTRL = 0x000A0007U;            

  /*这将导致一个单位错误由 CPU 生成和纠正*/
  /*在闪存模块中未捕捉到单位错误*/
  if ((flashWREG->FEDASTATUS & 0x2U)== 0U)        
  {
      自测故障通知(CHECKFLASHECC_FAIL1);
  }
  其他
  {
     /*清除单位错误标志*/
     flashWREG->FEDASTATUS = 0x2U;                

     /*清除 ESM 标志*/
     esmREG->SR1 = 0x40U;

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

    Mark、您好!

    您是否启用了 CPU 事件导出和 CPU ECC 闪存检查? 您可以使用 HALCoGen 生成的函数来启用它们:

    _coreEnableEventBusExport_()用于启用 CPU 事件导出。 这使得 CPU 能够发出信号、指示其 ECC 逻辑检测到的任何用于程序闪存或数据 RAM 访问的单位或双位错误。

    _coreEnableFlashEcc_()用于启用 CPU EC 对闪存的检查

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

    QJ、您好、感谢您的快速响应。

    启用 CPU 事件导出和 ECC 检查。

    下面显示了这两者的代码。

    函数 checkRAMECC()在 checkFlashECC()之前被立即调用并按预期执行。

    标记。

     

       .def    _coreEnableEventBusExport_
       asmfunc

    _coreEnableEventBusExport_

           stmfd sp!、{r0}
           MRC  P15、#0x00、r0、        C9、C12、 0x00
           ORR  r0、 r0   、#0x10
           MCR  P15、#0x00、r0、        C9、C12、 0x00
           mfldd sp!、{r0}
           BX LR    

       endasmfunc

     

       全局 _enable_ecc_flash_
           asmfunc
       
    _enable_ecc_flash_:

           stmfd sp!、{R1}
           MRC P15、#0、R1、C9、C12、 0;启用事件监视器状态
           ORR R1、R1、#0x00000010
           MCR P15、#0、R1、C9、C12、 #0;LDR R3、= 0x00000010;(设置 PNC 寄存器的第4位)

           MRC P15、#0、R1、C1、c0、 第一
           ORR R1、R1、#0x1 <<25
           MCR P15、#0、R1、C1、c0、 第一
           mfldd sp!、{R1}
           BX LR    
       
           endasmfunc

     

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

    您有正确的设置。 我稍后将尝试使用 HDK。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Mark、您好!

    我在 HDK 上进行了测试、没有失败。 对于1位损坏的 ECC、flashWREG->FEDASTATUS 为0x2、esmREG->SR1[0]为0x40。

    是否要尝试我的项目?  

    e2e.ti.com/.../6232.TMS570LS3137HDK_5F00_Flash_5F00_Diagnotics.7z

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

    如果可能、请分享您为运行该示例所采取的步骤。 我之前没有在 CCS 下测试过 ECC、只能从添加了 ECC 并使用 nowFlash 加载的可执行文件中测试 ECC。

    在 CCS 下创建.out 文件后、请告知如何添加 ECC 并运行示例。

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

    Mark、您好!

    测试 CPU 中的纠错和 ECC 逻辑会破坏返回到 CPU 的 ECC 值。 通过反转 ECC 的一个或多个位、CPU 将检测所选数据或 ECC 位中的错误、或 ECC 返回的任何可能值中的错误。 附加的示例用于生成单位和双位 ECC 错误。

    序列在 TRM 中列出(SPNU499B、第259页)。

    CCS 本身可以生成 ECC 并将 ECC 编程到 ECC 空间。

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

    QJ 您好、感谢您的回答。

    我在 CCS 中看不到这些设置。

    我使用的是 CCS 版本6.1.2。

    请告知此版本的 CCS 是否提供这些选项、如果提供、如何查找这些选项。

    非常感谢、

    标记。

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

    6.1.2应该具有此选项。 要查看此选项、您需要首先连接目标。 连接后、将 CCS 窗口从"CCS Edit"切换至"CCS Debug"、然后您将看到"Tool"菜单。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 QJ、

    我运行了您的项目、它按预期工作。

    我已将项目剥离、以便两个源代码库几乎完全相同、但我的代码库仍然失败。

    您能想到项目设置中的任何内容、而不是可能导致此测试失败的实际源代码吗?

    谢谢、

    Mark、。

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

    QJ、您好、我终于找到了问题。

    在我的项目中、为闪存包装程序定义控制寄存器的结构缺少泵访问控制寄存器2、因此、所有地址高于此地址的寄存器未被正确访问。

    我相信这个代码是从旧版本的 Halcogen 生成的、所以可能有一个问题现在已经解决了。

    感谢你的帮助。

    标记。