STM32单片机在线IAP升级技术实现详解

1. 项目概述

1.1 IAP技术背景

在线应用编程(IAP)技术允许微控制器在运行过程中通过通信接口接收新固件并完成自我更新,无需专用编程器。这种技术在远程设备维护、产品功能升级等场景中具有重要应用价值。

1.2 系统架构

本方案基于STM32F103RB芯片实现,采用三区Flash存储结构:

  • BootLoader区:负责启动管理和固件更新
  • App1区:主应用程序存储区
  • App2区:升级固件暂存区

2. 硬件设计

2.1 芯片选型

采用STM32F103RB作为主控芯片,主要特性:

  • ARM Cortex-M3内核
  • 128KB Flash存储器
  • 20KB SRAM
  • 丰富的外设接口

2.2 Flash分区设计

STM32F103RB的Flash共128页,每页1KB,分区方案如下:

分区名称 起始地址 结束地址 大小 功能描述
BootLoader 0x08000000 0x08004FFF 20KB 引导程序区
App1 0x08005000 0x0800EFFF 40KB 主应用区
App2 0x0800F000 0x0801FFFF 44KB 升级备份区

2.3 通信接口

系统使用USART接口实现固件传输:

  • USART1:调试信息输出
  • USART2:YModem协议固件传输

3. 软件实现

3.1 BootLoader设计

3.1.1 启动流程
  1. 检查App2区标志位(0x0801FFFC)
  2. 若存在有效固件,将其拷贝至App1区
  3. 跳转至App1区执行
3.1.2 关键代码实现
/* 程序跳转函数 */
typedef void (*Jump_Fun)(void);
void IAP_ExecuteApp(uint32_t App_Addr)
{
    Jump_Fun JumpToApp;
    
    if(((*(__IO uint32_t*)App_Addr) & 0x2FFE0000) == 0x20000000) //检查栈顶地址
    {
        JumpToApp = (Jump_Fun)*(__IO uint32_t*)(App_Addr + 4);
        MSR_MSP(*(__IO uint32_t*)App_Addr);
        JumpToApp();
    }
}

3.2 应用程序设计

3.2.1 向量表重定位

由于应用程序由BootLoader跳转执行,需在启动时重设向量表:

SCB->VTOR = FLASH_BASE | 0x5000; // App1区起始地址
3.2.2 YModem协议实现

采用YModem协议实现固件传输,主要流程:

  1. 发送CCC字符启动传输
  2. 接收文件头信息
  3. 分块接收固件数据
  4. 校验并写入App2区
  5. 接收结束标志

关键处理逻辑:

void ymodem_fun(void)
{
    if(Get_state() == TO_START) {
        send_command(CCC);
        HAL_Delay(1000);
    }
    
    if(Rx_Flag) {
        Rx_Flag = 0;
        // 数据处理逻辑...
        
        switch(temp_buf[0]) {
            case SOH: // 数据包处理
                if(Check_CRC(temp_buf, temp_len) == 1) {
                    if(Get_state() == TO_START) {
                        // 初始化接收
                        Erase_page(Application_2_Addr, 40);
                    }
                    else if(Get_state() == TO_RECEIVE_DATA) {
                        // 写入Flash
                        WriteFlash((Application_2_Addr + (data_state-1)*128), 
                                  (uint32_t*)(&temp_buf[3]), 32);
                    }
                }
                break;
            case EOT: // 传输结束处理
                if(Get_state() == TO_RECEIVE_DATA) {
                    Set_state(TO_RECEIVE_EOT2);
                }
                break;
        }
    }
}

4. 系统测试

4.1 开发环境配置

  1. Keil MDK开发环境
  2. STM32CubeMX配置工具
  3. Xshell终端工具(用于YModem传输)

4.2 BootLoader烧录配置

  1. 设置擦除方式为"Erase Sectors"
  2. 限制代码大小为0x5000(20KB)
  3. 正常烧录后通过USART1输出启动信息

4.3 应用程序烧录配置

  1. 修改代码起始地址为0x08005000
  2. 设置擦除方式为"Erase Sectors"
  3. 生成.bin文件用于升级

4.4 升级测试流程

  1. 通过Xshell连接USART2
  2. 使用YModem协议发送新版本.bin文件
  3. 观察USART1输出确认升级状态
  4. 重启设备完成固件更新

5. 工程实现要点

5.1 Flash操作注意事项

  1. 擦除操作必须以页为单位
  2. 写入前必须确保目标区域已擦除
  3. 注意Flash写入对齐要求
  4. 操作期间禁止中断

5.2 协议实现优化

  1. 增加传输超时检测
  2. 实现断点续传功能
  3. 添加数据校验机制
  4. 支持压缩传输减少数据量

5.3 安全增强措施

  1. 固件签名验证
  2. 版本兼容性检查
  3. 回滚机制实现
  4. 传输加密保护
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐