Other Parts Discussed in Thread:MSP432E401Y
器件型号:MSP432E401Y
工具/软件:TI C/C++ 编译器
问:我们正在为 MSP432E项目开发现场固件升级解决方案,在该解决方案中,新固件映像将通过 FTP接收并存储在 MSP432E可访问的本地文件系统中。然后,MSP432E将从文件系统中读取新映像并将其编程到闪存中。我们希望利用“闪存镜像模式”在器件上的两个闪存映像之间切换。在此有几个问题:
这种类型的现场升级解决方案是否有任何示例?
是否有源代码示例说明如何解析由 armhex.exe创建的程序映像?我们不想使用 .out Elf文件,因为这些文件很大。
我们使用的是 TI ARMCompiler v18.12.3.LTS
答:下面是一些关于我们如何TI-RTOS MSP432E4 闪存镜像模式的说明。
MSP432E4 闪存镜像模式在 TRM 的第 7.2.3.3 节进行了介绍,可点击此处查看。
- 此模式允许 MSP432E4 CPU 在底部 512KB 的闪存存储器(0 至 0x7FFFF)和顶部 512KB 的闪存存储器(0x80000 至 0x100000)之间执行“热交换”。
- 当设置 FLASHCONF 寄存器的 FMME 位时,闪存地址转换会动态更改,这样 CPU 将继续执行闪存上半部分(+080000h 偏移)的代码。
- 从 CPU 的角度来看,当设置 FMME 位时,闪存上半部分的“镜像代码”被映射到闪存的下半部分,因此程序必须与下部闪存中的运行地址链接。换言之,分支地址和指针引用均在 0x000000h 至 0x07FFFFh 范围内。
- 为确保其正常工作,执行 FMME 位设置的代码必须在闪存的下半部分和上半部分(+080000h 偏移)之间完全相同。如果这两个代码位置不相同,CPU 可能会因其执行上下文错误更改而引发异常。
使用此特性的一种方法是在闪存的下半部分添加一个程序(例如引导加载程序),以便有条件地将执行切换到闪存的上半部分中的程序。以下是将其与基于 TI-RTOS 的程序配合使用的一种方法:
- 创建一个复位挂钩函数,该函数用于确定是否启用镜像模式(例如检查开关设置),并将 FMME 位置为启用闪存镜像模式。
- 修改 .CFG 文件以包括如下行:
Startup.resetFxn = "&my_reset";
- 在本示例中,我们检查连接到 MMWAVEPOEEVM 上的MSP432E4 GPIOPN1 的开关状态。使用以下代码在项目中定义 my_reset() 函数:
- 对于两个程序映像,将此挂钩函数的地址链接到相同的偏移量。为此,您必须在 boot.asm 中修复 _c_int00 函数,以及 XDC 函数“xdc_runtime_Startup_reset__I”和上述复位挂钩函数的地址。必须这么做的原因是,当 TI-RTOS 程序启动时,_c_int00 函数会调用 xdc_runtime_Startup_reset__I,后者随后调用复位挂钩函数。切换到镜像模式后,CPU 返回到代码中的正确位置至关重要。您可以点击此处,在 XDC CDOC 的“运行时”部分中阅读有关此内容的更多信息。用于修复这些地址的链接器语法如下所示:
- 在闪存偏移 0x0 处对主程序映像进行编程,并在闪存偏移 0x80000 处对备用版本进行编程。记得链接备用映像,它是从闪存偏移 0x0 运行,但在将其编程到闪存存储器时使用偏移 0x80000。
这样,在上电复位后,您将能够通过驱动 GPIOPN1 高电压或低电压在这两个映像之间切换。
Annie Liu:
我们建议您在发布新问题之前先搜索 E2E支持论坛,E2E支持论坛已经拥有数十万个已得到解答的话题。 这通常是解决问题的最快方法。