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.

[参考译文] MSPM0L1306:SysTick 访问造成的硬故障

Guru**** 2393725 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1427156/mspm0l1306-hard-fault-from-systick-access

器件型号:MSPM0L1306
主题中讨论的其他器件:SysConfig

工具与软件:

您好!

我们使用 MSPM0L1306SDGS20成功运行项目大约一年。 我们必须 更改为更大的版本、然后切换到 MSPM0L1306SDGS28、因此从20引脚切换到28引脚。 在20引脚上运行正常的同一代码会在28引脚微控制器中生成一个硬故障。 一些测试表明、该硬故障链接到 SysTick -> VAL 寄存器的读取访问。

另一个症状 是、发生硬故障的时间是可变的、但大多数时间都在150-200ms 之间、这意味着在发生故障之前、有许多有效的 SysTick 访问。 这也意味着  SysTick -> VAL 的值在每次崩溃后都不同。

我们假设 IC 封装的唯一差异是、但所有其他方面都是相同的。 是否有其他任何差异也可能是此处的问题?

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

    尊敬的 Jose:

    这很奇怪。  在 TRM 中确实说过访问 SysTick 寄存器必须按32位字对齐、但 我同意仅仅切换到具有更大引脚数的器件是没有意义的。  

    您能介绍一下构建环境、编译器、使用 SysConfig 等方面吗?

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

    尊敬的 Dennis:

    我们使用我们自己的构建环境和 IAR 编译器、不使用 SysConfig。

    我们实际上已经通过手动初始化整个存储器区域以及本应执行该操作的 IAR 服务来"修复"此问题。 知道这一点后、硬故障可能是由内存 ECC 错误引起的。 MSPM0系列的不同版本似乎具有不同的 ECC 校验、奇偶校验或什么组合、这两个器件在该方面是否有差异?

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

    尊敬的 Jose:

    有意思。  在 MSPM0L11xx/MSPM013xx 中、存储器配置是相同的。  为了更好地理解您所做的除了 IAR 服务之外、您手动初始化存储器的什么/方式?

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

    尊敬的 Dennis:

    它只是创建一个指向 RAM 起始地址(0x20000000)的指针,写入一个零 到指针位置,并向前推进指针,直到到达 RAM 结束地址(0x20000FFF)。

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

    我相信堆栈的顶部默认设置为0x2000.0100、并且在起始地址0x0000.0000中定义。  这意味着在执行初始化时要覆盖堆栈。

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

    该描述似乎是准确的。 堆栈从0x2000.0C00链接到 0x20000.FFF、并且在0x0000.0000中分配了顶部地址  

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

    尊敬的 Jose:

    [quote userid="594452" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1427156/mspm0l1306-hard-fault-from-systick-access 一些测试表明硬故障链接到 SysTick -> VAL 寄存器的读访问。

    好的、您如何访问该寄存器? 直接、指针等?

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

    指向 SysTick -> VAL 的指针的内容被复制到32位变量中

    0x8AE8 =包含32位变量地址的位置

    0x8AD8 =包含  SysTick 地址的位置->VAL (由于某些原因、4个字节、该偏移在下一次 LDR 操作中得到补偿)

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

    尊敬的 Jose:

    从您展示的内容中可以看出、SysTick 基地址可能首先加载到 r7中、然后在已索引 LDR 指令中使用 SysTick -> VAL 寄存器的偏移量、但通过观察 ARM 结构(TIClang)、可以发现其偏移量为8、而不是4。

    嗯...

    让我继续挖掘。  利用您的变通办法、您现在是否能够继续推进您的项目?

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

    Dennis、您好、我不认为这样做的目的是获取 SysTick 基地址、而只是通过某种寻址方法或使用字节顺序的某种情况。 我再次捕获了数据(使用不同的地址-抱歉)。 在结束地址处、0xC6B4正确指向 E000E018、即  SysTick -> VAL 地址

    要回答您的问题、请使用我们能够 推进 该项目的解决方法。