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.

[参考译文] TM4C129ENCPDT:闪存的起始地址将更改、软件将不再工作。

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1367836/tm4c129encpdt-the-starting-address-of-the-flash-memory-will-change-and-the-software-will-no-longer-work

器件型号:TM4C129ENCPDT

工具与软件:

使用 TM4C129ENCPDT 调试产品时、我的代码完全停止工作。

我检查了闪存内容、发现起始地址设置为0x4000、但更改为0x84000。

这很难重现、并且只会偶尔发生。 您认为是什么原因造成了这种情况?

或者、CPU 中是否存在某种行为、即写入起始地址0x4000的任何内容作为 CPU 的函数移动到0x84000区域?

通常、您会在0x4000之后将引导加载程序和备份程序写入该区域、并在0x80000之后将正常程序写入该区域。 然后、在引导时、使用镜像模式在0x80000之后的区域中执行程序。

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

    您好!

    这很难重现、并且只会偶尔发生。 您认为是什么原因造成了这种情况?

    [/报价]

    AER 您说代码大部分时间运行正常吗?

    或者、CPU 中是否存在某种行为、即写入起始地址0x4000的任何内容作为 CPU 的函数移动到0x84000区域?

    通常、您会在0x4000之后将引导加载程序和备份程序写入该区域、并在0x80000之后将正常程序写入该区域。 然后、在引导时、使用镜像模式在0x80000之后的区域中执行程序。

    [/报价]

    引导加载程序将位于0x0。 复位后、它将检查地址0x0和0x4处的有效堆栈指针和复位向量。 如果它们有效、处理器将跳转至应用。 如果您的正常应用程序位于0x80000处、则应跳转至0x80000、因为0x4处的复位矢量将指向您的正常应用程序。 除非复位矢量如此说明、或者要求您的正常应用程序或自定义引导加载程序在您设计的情况下跳转到备份应用程序、否则处理器没有理由跳转到0x4000以运行备份固件。  

    您可能还需要检查写入到 NVIC_VTABLE 寄存器中的内容。  

    系统复位时、向量表固定在地址0x0000.0000。 特权软件可以写入
    向量表偏移量(VTABLE)寄存器、用于将向量表的起始地址重新定位为不同的
    存储器位置、在0x0000.0400到0x3FFF.FC00范围内(见119页的"向量表")。 注意
    在配置 VTABLE 寄存器时、偏移量必须在1024字节的边界对齐。

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

    将引导加载程序放在0x4000是不正确的。
    引导加载程序正确放置在0x0处、备份程序正确放置在0x4000处、正常程序正确放置在0x84000处。 向量表的偏移量设置为0x4000、并且在备份程序首次启动后、使用镜像函数来使用0x84000中的程序。 但是、此 CPU 出现的问题是软件突然停止引导、并且删除了所有0x0~0x84000引导加载程序+备份程序区域。
    这不会在每次打开电源时发生、但很少发生、从而使问题很难重现和解决。
    我想知道是什么原因导致了这个问题。
    或者是否有一个 CPU 函数可以一次删除从0x0到0x80000的所有区域?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    说引导加载程序放在0x4000是不正确的。
    [/报价]

    我是什么时候说引导加载程序从04000启动的? 我始终说引导加载程序从0x0开始。  

    备份程序地址为0x4000,正常程序地址为0x84000[/报价]

    返回到原始文章、我引用"通常、您会在0x4000之后将引导加载程序和备份程序写入该区域、并在0x80000之后将正常程序写入该区域。 然后、在引导时、使用镜像模式从0x80000之后的区域执行程序。  你说的正常程序从0x80000之后的区域开始。 现在、您说过普通程序从0x84000开始。 这非常令人困惑。 保  

    备份程序首先启动后,使用0x84000中的程序时使用镜像函数
    [/quote]

    镜像函数是如何工作的? 确切地说、如何从0x4000跳转到0x84000?

    然而,此 CPU 出现的问题是软件突然停止引导,并且删除了所有0x0~0x84000引导加载程序+备份程序区域。

    "那你打算怎么办?" 如果您使用调试器查看0x0-0x84000范围内的存储器、您会看到什么? 您说该区域已删除。 您是否看到所有 F 都被视为闪存被擦除或一些随机值?

    这并不是每次打开电源时都发生,但很少发生,因此很难重现和解决问题。

    您的意思是、在上电后、闪存会恢复至先前会话中您观察到闪存以某种方式被删除的正确内容?

    [/quote][/quote]