ZHDA045 January   2026 MSPM0G1518 , MSPM0G1519 , MSPM0G3518 , MSPM0G3519

 

  1.   1
  2.   摘要
  3.   商标
  4. 1简介
  5. 2详细说明
    1. 2.1 概述
      1. 2.1.1 实时固件更新流程
      2. 2.1.2 内存组织
    2. 2.2 方框图
    3. 2.3 代码
      1. 2.3.1 CSC(客户安全代码,Bankswap_CSC_G3519_v2)
        1. 2.3.1.1 CSC — 主函数 (Bankswap_CSC_G3519_v2.c)
        2. 2.3.1.2 CSC — 链接器文件 (Bootloader.cmd)
      2. 2.3.2 应用 (Bankswap_G3519_gpio_output_toggle_v2_SW_Version55_CRC32)
        1. 2.3.2.1 应用程序 — 主函数 (Bankswap_G3519_gpio_output_toggle_v2_SW_Version55_CRC32.c)
        2. 2.3.2.2 应用程序 – UART ISR (Bankswap_G3519_gpio_output_toggle_v2_SW_Version55_CRC32.c)
        3. 2.3.2.3 应用程序 — 链接器文件 (device_linker.cmd)
    4. 2.4 实现
      1. 2.4.1 实现概述
      2. 2.4.2 实现流程
        1. 2.4.2.1 导入 CCS 项目文件 (TI CCS IDE)
        2. 2.4.2.2 执行 MCU 恢复出厂设置 (TI CCS IDE)
        3. 2.4.2.3 在 CCS 中构建 CSC、应用程序 (TI CCS IDE)
        4. 2.4.2.4 在 CCS 中启动调试并将映像下载到 MCU 中 (TI CCS IDE)
        5. 2.4.2.5 生成要发送的数据帧 (uart_frame_gui.exe)
        6. 2.4.2.6 在电脑上通过 UART 发送新固件 (Tera Term)
        7. 2.4.2.7 检查更新的固件 (TI CCS IDE)
  6. 3总结
  7. 4参考资料

CSC — 主函数 (Bankswap_CSC_G3519_v2.c)

#define BANK0_APP_START 0x00002000
#define BANK1_APP_START 0x00042000

uint32_t gVer_info_LB0, gVer_info_LB1;
bool gBankswap_conduct;

int main(void)
{
    SYSCFG_DL_init();

    /* Get version information */
    gVer_info_LB0 = *((uint32_t*)BANK0_APP_START);
    gVer_info_LB1 = *((uint32_t*)BANK1_APP_START);

    /* Decide bank swap */
    if (gVer_info_LB0 < gVer_info_LB1) {
        uint32_t* ptr_version_info = (uint32_t*)BANK1_APP_START + 1; // 0x00042004
        uint32_t* ptr_SP = (uint32_t*)BANK1_APP_START + 64; // 0x00042256

        gBankswap_conduct = true;

        /* Check App data format */
        for(int i=0; i<63; i++) {
            if(ptr_version_info[i] != 0xFFFFFFFF) {
                gBankswap_conduct = false;
            }
        }

        /* Check stack pointer, it depends on device */
        /* MSPM0G3519 RAM 64kB - 0x20210000 */
        if(*ptr_SP != 0x20210000)  {
            gBankswap_conduct = false;
        }
    }
    
    if (DL_SYSCTL_isINITDONEIssued())
    {
        start_app((uint32_t *)VECTOR_ADDRESS_BANK0);
    }
    else  //Init and SWAP
    {
        if (gBankswap_conduct){
            DL_SYSCTL_executeFromUpperFlashBank(); // set flash bank swap bit
            delay_cycles(160);
            DL_SYSCTL_issueINITDONE(); // Issue INITDOEN to trigger System Reset -> swap to bank1
        }else{
            DL_SYSCTL_executeFromLowerFlashBank(); // still execute program from bank0
            delay_cycles(160);
            DL_SYSCTL_issueINITDONE(); // Issue INITDOEN to trigger System Reset -> jump to bank0 app program
        }
    }
}

客户安全代码 (CSC) 会检查组 0 和组 1 中的固件版本,以确定是否需要组交换。版本信息存储在每个闪存组的应用程序区域的起始位置。具体而言,组 0 应用程序版本位于地址 0x00002000,而组 1 应用程序版本位于地址 0x00042000。

检查版本信息后,如果闪存组 1 中的固件是最新版本,CSC 会先验证固件标头,再决定是否执行组交换。如果固件的标头不正确,或者组 0 已经包含最新版本,则不会执行组交换。