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] [参考译文] [常见问题解答]如何使用闪存镜像模式

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/853620/faq-how-to-use-flash-mirror-mode

器件型号:MSP432E401Y
主题中讨论的其他器件:MMWAVEPOEEVM

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

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

  • 这种类型的现场升级解决方案是否有任何示例?
  • 是否有源代码示例说明如何解析由 armhex.exe 创建的程序映像? 我们不想使用.out Elf 文件、因为这些文件的文件大小要大得多。

我们使用的是 TI ARM 编译器 v18.12.3.LTS

提前感谢。

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

    您好!

    很抱歉耽误你的时间。 我们将对此进行研究、并尽快返回给您。

    谢谢、

    Alexis

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

    您好、rperezti、

    查看 MSP432E4 SimpleLink Academy 实验 MSP432E4引导加载程序。 本实验中有一节将引导您完成运行 BSL 脚本程序以下载用于 TFTP 数据传输的引导加载程序所需的步骤。  

    我将查看您的第二个查询、并尽快返回给您。

    BR、

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

    以下是一些有关如何使用基于 TI-RTOS 的项目利用 MSP432E4闪存镜像模式的说明。

    •  此处 TRM 的第7.2.3.3节介绍了 MSP432E4闪存镜像模式
    • 此模式允许 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()函数:

    void my_reset (void)
    {
    
    int32_t x;
    
    //在 PN1上使用 Beagle GPIO 检查 SW2 */
    
    SysCtlPeripheralEnable (sysctl_Periph_GPION);
    
    GPIODirModeSet (GPIO_PORTN_BASE、GPIO_PIN_1、GPIO_DIR_MODE_IN);
    
    GPIOPINTYPE_INPORTN_BASE (GPIOPORTN_PHIN) GPIO_PIN_1);
    
    if (!(GPIOPinRead (GPIO_PORTN_BASE、GPIO_PIN_1)& GPIO_PIN_1)
    ){
    
    /* Button SW2 pressed、SO 让我们运行镜像模式*/
    
    x = HWREG (FLASH_CONF);
    
    x |= FLASH_CONF_FMME;
    
    HWREG (FLASH_CONF);
    
    
    
    
    
    x = nop (");asm (")
    
    else //禁用镜像模式*/
    {
    
    x = HWREG (FLASH_CONF);
    
    x &&=~FLASH_CONF_FMME;
    
    HWREG (FLASH_CONF)= x;
    
    asm (" nop");
    
    asm (" nop");
    
    }
    
    }
    

    • 将此挂钩函数的地址链接到两个程序映像的相同偏移量。 为此、您必须修复 boot.asm 中_c_int00函数的地址以及上面的 XDC 函数"XDC_runtime_Startup_reset_i"和复位挂钩函数。 之所以需要这样做、是因为当 TI-RTOS 程序启动时、_c_int00函数会调用 XDC_RUNTIME_Startup_RESET__I、然后该函数会调用复位挂钩函数。 转换到镜像模式后、CPU 返回到代码中的正确位置至关重要。 您可以在 此处的 XDC CDOC 的"运行时"部分中阅读有关此内容的更多信息。 修复这些地址的链接器语法如下所示:
    部分
    {
    
    特殊用途:{
    *(.text:xdc_runtime_Startup_reset__i)/*修复 XDC_runtime_Startup_reset__i 的地址*/
    my_reset.obj (.text)/*修复 my_reset ()的 addr *
    TI/targets/arm/rtsarm/lib/boot.aem4f (.text)/*修复_c_int00的 addr *}
    > 0x00006000 //任意选择的偏移量*/
    } 
    • 在闪存偏移量0x0处对主程序映像进行编程、并在闪存偏移量0x80000处对备用版本进行编程。 请记住将备用映像链接起来、就像它从闪存的偏移量0x0运行一样、但在将其编程到闪存存储器时使用偏移量0x80000。

    就是这样、您将能够通过在上电复位后将 GPIOPN1驱动为低电平或高电平来在两个映像之间切换。