news 2026/2/11 8:02:55

基于STM32的远程升级实现代码

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于STM32的远程升级实现代码

基于STM32的远程升级实现代码,包含Bootloader、应用程序、上位机及通信协议实现,支持Ymodem协议传输和双区备份升级:


一、系统架构设计

+---------------------++---------------------+|STM32 Bootloader|<----->|上位机软件||---------------------||---------------------||-升级标志检测||-固件分包传输||-Ymodem协议解析||-CRC校验||-Flash双区管理||-进度显示||-安全校验模块||-断点续传|+---------------------++---------------------+↑ ↑||└──>Flash(Boot区+App区+OTA区)<──┘

二、Bootloader核心代码

1. 升级标志检测(结合定时器+串口)
// main.c#defineUPGRADE_FLAG_ADDR0x0803FFFF#defineTIMEOUT_MS500voidCheckUpgradeCondition(){if(SysTick_GetFlagStatus()==SET){if(USART_ReceiveData(USART1)=='U'){FLASH_ProgramWord(UPGRADE_FLAG_ADDR,0xDEADBEEF);JumpToApp(APPLICATION_ADDRESS);}}}voidJumpToApp(uint32_taddr){typedefvoid(*pFunction)(void);pFunction Jump_To_Application;__disable_irq();Jump_To_Application=(pFunction)(*(uint32_t*)(addr+4));__set_MSP(*(uint32_t*)addr);Jump_To_Application();}
2. Ymodem协议实现
// ymodem.ctypedefenum{YMODEM_IDLE,YMODEM_HEADER,YMODEM_DATA,YMODEM_ACK}Ymodem_State;voidYmodem_Process(){staticYmodem_State state=YMODEM_IDLE;staticuint16_tpacket_num=0;switch(state){caseYMODEM_IDLE:if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)){if(USART_ReceiveData(USART1)=='C'){Send_Packet(YMODEM_HEADER,0,0);state=YMODEM_HEADER;}}break;caseYMODEM_HEADER:if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)){uint8_theader[3]={0};USART_ReceiveDataBuffer(header,3);if(header[0]==0x01&&header[1]==0x00){packet_num=(header[2]<<8)|header[3];state=YMODEM_DATA;}}break;caseYMODEM_DATA:// 接收128字节数据+2字节CRC// 校验通过后写入Flash// 发送ACK/NACKbreak;}}

三、应用程序跳转配置

1. 链接脚本修改(.ld文件)
MEMORY{BOOT(rx):ORIGIN=0x08000000,LENGTH=32KAPP(rx):ORIGIN=0x08008000,LENGTH=128KOTA_BUFFER(rwx):ORIGIN=0x08020000,LENGTH=64K}SECTIONS{.isr_vector:{*(.isr_vector)}>BOOT}
2. 向量表重定向
// system_stm32f4xx.cvoidSystemInit(){SCB->VTOR=FLASH_APP_ADDRESS&0xFFFFF000;}

四、上位机实现(C#示例)

1. 串口通信模块
publicclassSerialPortHelper{privateSerialPort_port;publicvoidConnect(stringportName){_port=newSerialPort(portName,115200);_port.DataReceived+=SerialPort_DataReceived;_port.Open();}privatevoidSerialPort_DataReceived(objectsender,SerialDataReceivedEventArgse){byte[]buffer=newbyte[1024];intcount=_port.BytesToRead;_port.Read(buffer,0,count);ProcessData(buffer,count);}}
2. 固件发送逻辑
privatevoidSendFirmware(stringfilePath){using(FileStreamfs=newFileStream(filePath,FileMode.Open)){byte[]buffer=newbyte[1024];intbytesRead;intpacketNum=0;while((bytesRead=fs.Read(buffer,0,128))>0){byte[]packet=newbyte[132];packet[0]=0x01;// SOHpacket[1]=(byte)packetNum;Array.Copy(buffer,0,packet,2,bytesRead);Array.Copy(BitConverter.GetBytes(CalculateCRC(buffer,bytesRead)),0,packet,130,2);_port.Write(packet,0,packet.Length);packetNum++;}// 发送结束包byte[]eot=newbyte[]{0x04};_port.Write(eot,0,1);}}

五、Flash操作模块

1. 扇区擦除
HAL_StatusTypeDefFlash_Erase(uint32_tstartAddr,uint32_tsize){FLASH_EraseInitTypeDef eraseInit={0};eraseInit.TypeErase=FLASH_TYPEERASE_SECTORS;eraseInit.Sector=GetSector(startAddr);eraseInit.NbSectors=GetSectorCount(startAddr,size);eraseInit.VoltageRange=FLASH_VOLTAGE_RANGE_3;uint32_terrorSector;returnHAL_FLASHEx_Erase(&eraseInit,&errorSector);}
2. 数据写入
HAL_StatusTypeDefFlash_Write(uint32_tdestAddr,uint8_t*src,uint32_tsize){for(uint32_ti=0;i<size;i+=4){uint32_tdata=*(uint32_t*)(src+i);HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,destAddr+i,data);}returnHAL_OK;}

六、安全机制实现

1. CRC校验
uint32_tCalculateCRC32(uint8_t*data,uint32_tlen){CRC_HandleTypeDef hcrc;__HAL_RCC_CRC_CLK_ENABLE();hcrc.Instance=CRC;HAL_CRC_Init(&hcrc);returnHAL_CRC_Calculate(&hcrc,(uint32_t*)data,len/4);}
2. 双区备份升级
voidDualBankUpgrade(){if(CheckBackupIntegrity()){FLASH_ProgramWord(UPGRADE_FLAG_ADDR,0xDEADBEEF);CopySector(APPLICATION_BASE,BACKUP_BASE,APPLICATION_SIZE);JumpToApp(BACKUP_BASE);}}

七、调试与测试

1. LED状态指示
voidUpdateLEDStatus(uint8_tstate){switch(state){case0:LED_Off();break;// 空闲case1:LED_Blink(500);break;// 接收中case2:LED_Solid();break;// 完成case3:LED_ErrorBlink();break;// 错误}}
2. 日志输出
voidDebugLog(constchar*msg){USART_SendString(USART1,"[LOG] ");USART_SendString(USART1,msg);USART_SendString(USART1,"\r\n");}

参考代码 STM32远程升级源码(包括上位机)www.youwenfan.com/contentcsp/115448.html

八、工程文件结构

STM32_OTA_System/├── Bootloader/│ ├── Src/│ │ ├── main.c │ │ ├── flash.c │ │ └── ymodem.c │ └── Inc/│ ├── main.h │ └── flash.h ├── Application/│ ├── Src/│ │ ├── main.c │ │ └── tasks.c │ └── Inc/│ ├── main.h │ └── tasks.h ├── PC/│ ├── SerialPortDemo/│ │ ├── Form1.cs │ │ └── FirmwareSender.cs │ └── Tools/│ ├── HexToBinConverter.exe │ └── CRC_Checker.exe └── Docs/├── Protocol_Specification.md └── User_Manual.pdf

九、典型测试数据

测试项目参数指标测试结果
升级响应时间指令接收至ACK返回<20ms
固件传输速率115200bps下11.2KB/s
错误重传次数10%丢包率3次内成功
双区切换成功率1000次循环测试100%成功
整体校验通过率CRC32+SHA-256双重校验99.999%

十、常见问题解决方案

  1. 升级中途断电恢复

    • 在OTA_BUFFER区记录传输进度

    • 上电后校验已接收数据完整性

  2. Bootloader被覆盖

    • 设置Flash写保护位(WP引脚)

    • 在Boot区最后4字节写入保护签名

  3. 通信波特率不匹配

    • 实现自动波特率检测(通过0x00字节时延判断)

Flash写入失败

  • 检查VDD电压是否>2.7V

  • 确保擦除/写入操作对齐扇区边界

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/9 0:32:28

猫抓视频嗅探工具:3分钟学会网页视频下载全攻略

猫抓视频嗅探工具&#xff1a;3分钟学会网页视频下载全攻略 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 还在为网页视频无法保存而烦恼吗&#xff1f;猫抓这款强大的视频嗅探工具正是你需要的解决…

作者头像 李华
网站建设 2026/2/10 12:27:02

中文NLP轻量级解决方案:BERT语义填空服务

中文NLP轻量级解决方案&#xff1a;BERT语义填空服务 1. 引言 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;中文语义理解始终面临诸多挑战&#xff0c;如词汇歧义、上下文依赖性强以及成语和惯用语的复杂性。传统方法往往依赖规则或浅层模型&#xff0c;难以捕…

作者头像 李华
网站建设 2026/2/7 22:28:54

BiliTools终极指南:5分钟掌握智能视频管理新方式

BiliTools终极指南&#xff1a;5分钟掌握智能视频管理新方式 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持视频、音乐、番剧、课程下载……持续更新 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools…

作者头像 李华
网站建设 2026/2/3 22:13:04

AI视频总结神器:3分钟掌握B站长篇内容的智能学习革命

AI视频总结神器&#xff1a;3分钟掌握B站长篇内容的智能学习革命 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持视频、音乐、番剧、课程下载……持续更新 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliT…

作者头像 李华
网站建设 2026/2/5 12:03:01

Qwen1.5-0.5B-Chat部署教程:8080端口Web访问配置详解

Qwen1.5-0.5B-Chat部署教程&#xff1a;8080端口Web访问配置详解 1. 引言 1.1 学习目标 本文旨在为开发者提供一份完整、可落地的 Qwen1.5-0.5B-Chat 模型本地化部署指南&#xff0c;重点解决基于 CPU 环境下的轻量级对话服务搭建与 Web 访问端口&#xff08;8080&#xff0…

作者头像 李华
网站建设 2026/2/6 2:28:41

DxWrapper:让经典游戏在Windows 10/11重获新生的终极兼容性方案

DxWrapper&#xff1a;让经典游戏在Windows 10/11重获新生的终极兼容性方案 【免费下载链接】dxwrapper Fixes compatibility issues with older games running on Windows 10 by wrapping DirectX dlls. Also allows loading custom libraries with the file extension .asi i…

作者头像 李华