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.

[参考译文] TM4C1290NCPDT:TM4C 地址跳转

Guru**** 2551310 points
Other Parts Discussed in Thread: UNIFLASH, EK-TM4C1294XL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/835785/tm4c1290ncpdt-tm4c-address-jump

器件型号:TM4C1290NCPDT
主题中讨论的其他器件:UNIFLASHEK-TM4C1294XL

大家好、

我实现了一个逻辑、该逻辑在0x80000处成功写入 TM4C ROM、长度~69632字节、我通过使用 Uniflash 工具读取 TM4C ROM 来验证该逻辑。

但是、当我使用以下语句跳转时、控制不会转移到特定地址。

//将矢量表设置为闪存中应用程序的开头。
 HWREG (NVIC_vtable)= 0x80000;

//从应用程序的矢量表加载栈指针。

 _asm (" LDR R1、[r0]\n"
 " mov sp、r1");

 //从应用程序的矢量表加载初始 PC 并分支到
 //应用程序的入口点。
 
 _asm (" LDR r0、[r0、#4]\n"
 " bx r0\n");

建议我遗漏任何内容。

谢谢、此致、

Yasar Arafath

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

    您好 Yasar、

     乍一看、我看不到您为跳转到应用程序起始地址而编写的代码有问题。 在你执行 BX 指令后、PC (程序计数器)的位置是什么?

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

    您好、Charles、

    执行 BX 指令后、PC 显示值0x8FB3C。

    谢谢、此致、

    Yasar Arafath

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

    您好 Yasar、

     在0x80000和0x80004处是否有正确的 SP 和复位矢量? r0加载了什么值? 尽管它不应具有不同的行为、但我想知道如果您更改为小地址(即0x4000)而不是0x80000、您会得到什么结果。 您可以尝试吗?

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

    您好、Charles、

    同时,我也尝试了你刚才所建议的方法。 我尝试从0x50000启动、然后同样出现同样的问题。

    写入 TM4C ROM 后、我们将强制重新启动器件。 此外、我们实施了引导加载程序代码、该代码将查找特定地址中的数据、并引导二进制文件。

    这种方法运作良好,而不是直接分支。

    谢谢、此致、

    Yasar Arafath

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

    您好 Yasar、

     很高兴您的问题得到解决。 我没有意识到您正在尝试实现引导加载程序。 我们有几个引导加载程序示例、它们的功能完全相同。 您可以查看一对示例、例如 boot_serial (这是驻留在0x0的 UART 引导加载程序)和 boot_dem1 (这是驻留在0x4000的应用程序、将跳转到引导加载程序)。 您可以在中找到它们 /examples/boards/ek-tm4c1294xl

     将应用程序编程到地址(即0x80000)后、您需要重置器件。 复位后、引导加载程序将使用正确的堆栈指针和复位矢量检查0x80000处是否存在应用程序。 如果0x80000处没有任何内容、则引导加载程序将启动引导加载过程。 如果在0x80000已有应用程序、则引导加载程序将跳转到应用程序以开始执行。 如果收到更新新 FW 映像的命令、则应用程序可以添加代码以跳回到引导加载程序。 我认为这是您当前为使其正常工作所做的工作、这也是 TivaWare 引导加载程序示例处理新应用程序更新的方式。