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.

[FAQ] [常见问题解答] 如何使用闪存镜像模式?

Other Parts Discussed in Thread: MSP432E401Y

器件型号:MSP432E401Y

工具/软件:TI C/C++ 编译器

 

问:我们正在为 MSP432E 项目开发现场固件升级解决方案,在该解决方案中,新固件映像将通过 FTP 接收并存储在 MSP432E 可访问的本地文件系统中。然后MSP432E 将从文件系统中读取新映像并将其编程到闪存中。我们希望利用“闪存镜像模式”在器件上的两个闪存映像之间切换。在此有几个问题:

 

这种类型的现场升级解决方案是否有任何示例?

是否有源代码示例说明如何解析由 armhex.exe 创建的程序映像?我们不想使用 .out Elf 文件,因为这些文件很大。

我们使用的是 TI ARM Compiler  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 高电压或低电压在这两个映像之间切换。