news 2026/6/20 5:33:15

基于STM32F103的BootLoader IAP 实现及上位机开发

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于STM32F103的BootLoader IAP 实现及上位机开发

BootLoader IAP 上位机使用C#语言编程,下位机以STM32F103系列MCU为例,方便移植到其他的ARM芯片,通过普通UART或485传输文件, 采用YModem协议。 实现完成一键下载,含有上位机源码及MCU源码。 企业在用的IAP。

在企业项目中,设备的程序更新是一项重要任务。基于STM32F103系列MCU构建的BootLoader结合IAP(In - Application Programming)功能,配合使用C#编写的上位机,能轻松实现程序的远程更新,并且通过普通UART或485传输文件,采用YModem协议确保数据传输的可靠性。今天就跟大家分享一下这个企业在用的IAP实现方案。

下位机:STM32F103 MCU源码

BootLoader部分

首先,BootLoader的主要任务是初始化系统时钟、串口等硬件资源,然后等待上位机发送更新指令。以初始化串口为例,代码如下:

void USART_Init(void) { USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; // 使能GPIOA和USART1时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE); // 配置PA9为复用推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置PA10为浮空输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); // USART1 配置 USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); // 使能USART1 USART_Cmd(USART1, ENABLE); }

这段代码通过RCC_APB2PeriphClockCmd函数使能了GPIOA和USART1的时钟,之后分别对PA9(TX)和PA10(RX)引脚进行了GPIO模式配置,最后配置USART1的波特率、数据位、停止位等参数并使能串口。

IAP部分

IAP部分负责接收上位机发送的文件数据,并将其写入到指定的Flash区域。关键代码片段如下:

void IAP_Write_Flash(uint32_t WriteAddr, uint8_t *pBuffer, uint32_t NumToWrite) { uint32_t PageError = 0; FLASH_Unlock(); while (NumToWrite > 0) { if (FLASH_ProgramHalfWord(WriteAddr, *(uint16_t *)pBuffer)!= FLASH_COMPLETE) { PageError = WriteAddr; break; } WriteAddr += 2; pBuffer += 2; NumToWrite -= 2; } FLASH_Lock(); if (PageError!= 0) { // 处理写入错误 } }

上述代码首先解锁Flash以便进行写入操作,然后通过FLASH_ProgramHalfWord函数将数据逐字写入指定地址,每次写入后更新地址和缓冲区指针,并减少待写入数据量。最后,操作完成后锁定Flash。如果写入过程中出现错误,会记录错误地址以便后续处理。

上位机:C# 编程实现

上位机使用C#语言编写,主要功能是通过串口与下位机通信,并按照YModem协议发送文件。以下是部分关键代码:

using System; using System.IO; using System.IO.Ports; using System.Threading; class YModemSender { private SerialPort serialPort; private FileStream fileStream; public YModemSender(string portName, int baudRate) { serialPort = new SerialPort(portName, baudRate); serialPort.Open(); } public void SendFile(string filePath) { fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read); byte[] buffer = new byte[1024]; int bytesRead; // YModem协议握手 serialPort.Write(new byte[] { 0x01 }, 0, 1); Thread.Sleep(100); while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) > 0) { // 这里简化处理YModem协议数据封装和发送 serialPort.Write(buffer, 0, bytesRead); } fileStream.Close(); // 发送结束标志 serialPort.Write(new byte[] { 0x04 }, 0, 1); } ~YModemSender() { serialPort.Close(); } }

在上述代码中,YModemSender类封装了串口通信和文件发送功能。构造函数初始化并打开串口,SendFile方法负责读取文件并通过串口发送数据。在实际应用中,YModem协议还需要更复杂的数据封装、校验等操作,但这里为了简洁展示主要逻辑进行了简化。

一键下载功能实现

结合上下位机的功能,实现一键下载功能就变得相对简单。在上位机界面中,通过一个按钮的Click事件触发文件发送操作,代码如下:

private void btnDownload_Click(object sender, EventArgs e) { string filePath = txtFilePath.Text; YModemSender sender = new YModemSender("COM1", 115200); sender.SendFile(filePath); }

当用户点击“下载”按钮时,程序获取文本框中输入的文件路径,创建YModemSender实例,并调用SendFile方法发送文件,实现一键下载功能。

总结

通过以上基于STM32F103的BootLoader IAP和C#上位机的实现,能够方便地实现设备程序的远程更新,并且易于移植到其他ARM芯片。无论是从硬件的MCU代码,还是上位机的C#编程,都为企业项目中的IAP应用提供了一个可行的方案。希望这篇博文能给大家在相关项目开发中带来一些启发。

BootLoader IAP 上位机使用C#语言编程,下位机以STM32F103系列MCU为例,方便移植到其他的ARM芯片,通过普通UART或485传输文件, 采用YModem协议。 实现完成一键下载,含有上位机源码及MCU源码。 企业在用的IAP。

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

健康科技的新突破点:提示工程的重要贡献方向

健康科技的AI拐点:提示工程如何重构医疗数据的“对话”能力? 引言:健康科技的“数据哑巴”困境,该用提示工程破局了! 你有没有见过这样的场景? 医院的电子病历系统里堆着几十万份非结构化文本:医…

作者头像 李华
网站建设 2026/6/15 22:34:11

SSM毕设项目推荐-基于高校毕业生求职与企业招聘信息管理基于ssm的就业招聘查询系统【附源码+文档,调试定制服务】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/5/30 13:37:40

计算机SSM毕设实战-基于SSM的英语四六级在线考试系统基于ssm的英语四六级学习系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/6/11 14:39:06

上下文工程的六大核心组件(可视化解析)

大家好,我是玄姐。以下是决定 AI 应用输出质量的大致占比:模型选择:15%提示词设计:10%其他所有因素(检索、记忆、工具、查询处理):75%很多团队都在纠结那无关紧要的 25%,却忽视了真正…

作者头像 李华
网站建设 2026/6/15 12:32:57

Si83402BAA-IF,具有低导通电阻的2通道隔离智能开关

型号介绍今天我要向大家介绍的是 skyworks 的智能隔离开关——Si83402BAA-IF。该器件具有低导通电阻 (RON),能够在提供高连续电流的同时,对感性负载进行无限量的消磁。采用紧凑的 DFN 封装,并集成了安全等级的隔离功能。其逻辑接口为两个低功…

作者头像 李华
网站建设 2026/6/20 1:43:20

基于springboot的电动车租赁平台系统-计算机毕业设计源码+LW无文档

基于SpringBoot的电动车租赁平台系统 摘要:本文详细阐述了基于SpringBoot的电动车租赁平台系统的研究背景意义、需求分析以及功能设计。随着共享经济的兴起和人们出行需求的多样化,电动车租赁市场具有广阔的发展前景。本系统旨在解决传统电动车租赁模式中…

作者头像 李华