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.

[参考译文] TM4C1230H6PM:用于固件更新的自定义引导加载程序。

Guru**** 2527790 points
Other Parts Discussed in Thread: TM4C1230H6PM

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/941829/tm4c1230h6pm-custom-bootloader-for-firmware-update

器件型号:TM4C1230H6PM
主题中讨论的其他器件: TM4C123

您好!

我正在尝试为 TM4C1230H6PM 创建一个定制的闪存引导加载程序、该引导加载程序需要通过 CAN 总线更新我的应用固件。 到目前为止、我已经完成了以下事项-  

1)使用 "driverlib/flash.h"中的函数将数据擦除并写入闪存

2)通过将 MSP 值设置为相应应用的起始地址并调用位于 (起始地址+ 4)的复位处理程序、在位于0x00000000地址的引导加载程序应用程序和位于0x00004000的另一个应用程序之间切换执行

3) 3)我不会在切换执行时更改矢量表偏移寄存器中的偏移值、但我的中断仍然正常、这让我感到困惑。

现在、我将向下列出我的查询-

1) 1)我浏览了 Tivaware 中提供的引导加载程序演示应用程序、发现引导加载程序内容首先复制到 SRAM、然后从 SRAM 执行。 我想知道为什么这样做、以及何时可以从闪存本身执行引导加载程序。

2)为什么我的中断处理程序运行正常,即使我没有在 VTOR 中设置任何偏移值。

希望快速响应。

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

    您好!  

    我注意到一个关键因素、如下所示-

    当我使用 IntRegister()函数并将处理程序函数作为参数传递给该函数时,我的中断会起作用,但当我在启动脚本中断中使用 IntEnable()函数和外部处理程序时,中断不起作用,在闪存中没有分区的应用程序中也会起类似作用。

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

    [引用 user="Pradeep Choudhary]1)我浏览了 Tivaware 中提供的引导加载程序演示应用程序,发现引导加载程序内容首先复制到 SRAM,然后从 SRAM 执行。 我想知道为什么这样做、当引导加载程序可以从闪存本身执行时。

    将代码复制到 RAM 可更新引导加载程序本身。  

    [引用 user="Pradeep Choudhary"]2)为什么我的中断处理程序运行正常,即使我没有在 VTOR 中设置任何偏移值。

    当你第一次调用函数 IntRegister()时,它将把所有基于闪存的向量复制到 RAM 中,更新你正在更改的一个向量,并将向量表偏移寄存器更改为指向 RAM。

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

    尊敬的 Bob:

    感谢您的回复。 正如您已经完美地描述了当 IntRegister()发生什么时,现在我想知道当调用 Int Enable()时会发生什么,以下哪一个选项是处理此类应用程序中中断的理想方法:

    1)使用 IntRegister()而不用担心偏移寄存器或

    2)在向量表偏移寄存器中设置偏移值后使用 IntEnable()。

    此致、

    Pradeep Choudhary

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

    选择由你决定。 如果我使用动态矢量(复制到 RAM 的矢量),我使用 IntRegister()函数。 我知道它可以正常工作、它降低了我设置矢量表偏移寄存器时出错的几率。

    我实际上处于发布应用手册的最后阶段、该手册讨论了 TM4C123的 CAN 引导加载程序实现。 如果您向我发送了一个朋友请求、向我提供了您的电子邮件地址、并且同意不分发草稿、我可以向您发送草稿副本。

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

    尊敬的 Bob:

    我想阅读该应用手册。 请通过电子邮件发送给我。 我将发送一个朋友请求。

    谢谢、此致、

    Pradeep Choudhary

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

    完成

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

    尊敬的 Bob:

    我开发了一个定制的闪存引导加载程序、并且能够使用 CAN 更新应用。 我正在使用 IntRegister()在应用程序和引导加载程序中注册中断处理程序,它运行正常。 因此,现在我想知道,如果我计划将来在我的应用程序中使用某些 RTOS,使用 IntRegister()是否会有任何负面影响。

    希望快速响应。

    此致、

    Pradeep Choudhary

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

    虽然我认为总的来说是正确的、但我不能说所有 RTOS 实现。 对于 TI RTOS、如果您在 RAM 中配置运行时矢量表地址与0处的复位矢量表地址不同、 然后、当代码到达 main()时、矢量表偏移量将设置为 RAM 地址、所有 RTOS 矢量将复制到 RAM。 如果在调用 BIOS_Start()之前调用 main()中的 IntRegister(),IntRegister()将只替换一个矢量,在本例中为 CAN 矢量。  

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

    尊敬的 Bob:

    因此、您建议使用 TI-RTOS 不会造成任何损害、只需将运行时矢量表地址更改为 RAM 即可正常运行。 如果我误解了某个内容、请告诉我。 如果我不想使用 IntRegister()来使用动态矢量,那么如何使用矢量表来实现它?

    感谢您耐心等待我。

    此致、

    Pradeep Choudhary

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

    更具体地说,我建议如果您开发了使用 CAN 中断的 CAN 引导加载程序,则可以使用 IntRegister()用中断函数替换 TI-RTOS 系统中的 CAN 中断。 您可以执行此操作、因为目前没有适用于 Tiva 器件的 TI-RTOS CAN 驱动程序。 您将绕过 RTOS 中断调度程序。 这意味着您的 CAN 中断例程不能感知操作系统。 它不能使用信标、邮箱、POST 事件或软件中断。 它不会被 TI-RTOS 中断或任务切换中断。  

    以下是有关 TI-RTOS 中 TM4C 器件上如何处理中断的更多信息

    https://processors.wiki.ti.com/index.php/SYS/BIOS_for_Stellaris_Devices#SYS.2FBIOS_M4_Hardware_Interrupt_.28Hwi.29_Handling

    社区成员发布了 TI-RTOS CAN 驱动程序实施。 我尚未对其进行评估、但您可能有兴趣:

    https://e2e.ti.com/support/tools/ccs/f/81/t/942614