STM32F103C8T6在线升级 IAP

2023-11-02

stm32程序每次执行都会从基地址0x800 0000开始执行。IAP程序升级的执行是在bootloader引导文件执行后,进行加载、跳转APP程序。所以每次上电后进入BootLoader判断是否需要升级,如果升级则接受bin文件,如果不升级则直接跳转app程序。

BootLoader和app程序的FLASH大小需要根据自己的程序情况自由的分配大小就可以了。

代码:根据正点原子的例程进行修改的

1、由于BootLoader引导程序比较小,我设置的flash大小为0x1800

 

2、iap函数:由于STM32F103C8T6程序存储容量是64KB,每页的大小为1K字节即1024,所以iapbuf数组设置为512。

代码如下:

#include "stmflash.h"
#include "iap.h"
iapfun jump2app; 
u16 iapbuf[512];   
//appxaddr:应用程序的起始地址
//appbuf:应用程序CODE.
//appsize:应用程序大小(字节).
void iap_write_appbin(u32 appxaddr,u8 *appbuf,u32 appsize)
{
u16 t;
u16 i=0;
u16 temp;
u32 fwaddr=appxaddr;//当前写入的地址
u8 *dfu=appbuf;
for(t=0;t<appsize;t+=2)
{    
temp=(u16)dfu[1]<<8;
temp+=(u16)dfu[0];  
dfu+=2;//偏移2个字节
iapbuf[i++]=temp;    
if(i==512)
{
i=0;
STMFLASH_Write(fwaddr,iapbuf,512);
fwaddr+=1024;//偏移1024  
}
}
if(i)
STMFLASH_Write(fwaddr,iapbuf,i);//将最后的一些内容字节写进去.  
}
//跳转到应用程序段
//appxaddr:用户代码起始地址.
void iap_load_app(u32 appxaddr)
{
if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法.

jump2app=(iapfun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)
MSR_MSP(*(vu32*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
jump2app(); //跳转到APP.
}

}

3、BootLoader函数 :

    首先判断app代码的首地址是否为0x0800 000,是则进入app,否的话进行引导区。

    判断app代码栈顶是否为0x2000 000,不是则进入升级模式,代码如下,其中FLASH_APP1_ADDR=0x8001800

while(1)
{
if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{
iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
}
if((((*(vu32*)FLASH_APP1_ADDR)&0x2FFE0000)!=0x20000000))
{
printf("/***** No APP! *****/ \r\n");
printf("stm32f103c8t6在线升级  \r\n");
printf("选择对应的app  bin文件 \r\n");
printf("输入 A  发送bin文件 \r\n");
printf("输入 E  进入app \r\n");
while(1)
{
if(USART_RX_CNT)
{
if(oldcount==USART_RX_CNT)//新周期内,没有收到任何数据,认为本次数据接收完成.
{
applenth=USART_RX_CNT;
oldcount=0;
USART_RX_CNT=0;
if(applenth > 100)
{
printf("用户程序接收完成!\r\n");
printf("代码长度:%dBytes\r\n",applenth);
}

}
else 
oldcount=USART_RX_CNT;
}
delay_ms(10);

if(USART_RX_BUF[0] == 'A')
{
if(applenth)
printf("\r\n 请发送bin文件 \r\n");
app_bin = 1;
applenth=0;
}
else if(app_bin)
{

if(applenth)
{
printf("开始更新固件...\r\n");
printf("Copying APP2FLASH...");

if(((*(vu32*)(0X20000400+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{  
iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,applenth);//更新FLASH代码   
printf("Copy APP Successed!!");
printf("固件更新完成!\r\n");
applenth = 0;
app_bin = 0;
}
}
}

if(USART_RX_BUF[0] == 'E')
{
if(applenth)
printf("\r\n 将要执行APP \r\n");
app_enter = 1;
applenth = 0;

if(app_enter)
{
printf("开始执行FLASH用户代码!!\r\n");
if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{  
iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
}else 
{
printf("非FLASH应用程序,无法执行!\r\n");
printf("Illegal FLASH APP!");  
}
}
}
}

}

4、bootloader下进去之后,后面该是app程序了。

5、app程序就比较简单了,首先设置flash向量便宜地址0x1800

 

 

其次配置程序的启动地址

6、编译后keil下载程序就可以了,或者通过串口按照自己编写的步骤进行下载。

发送 A 提示 请发送bin文件

下面依次打开选择bin文件并发送,会打印出接收的字节数跟更新固件

最后发送E,会有开始执行提示。或者单片机直接复位也可以直接执行app,到此app在线升级完成。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F103C8T6在线升级 IAP 的相关文章

  • # PIC32MK1024GPE100-串口BootLoader ## 传统BootLoader(不带BANK切换)

    下面开始具体操作 稍微带一点理论 研究不深 编译环境 mplab x ide v5 5 mhc harmoney v3 0 第一步 创建BootLoader工程 创建工程 如图1 这里不展开讲 只讲注意点 注意 1 配置好板子上对应引脚 如
  • 血压计算法

    1 1 动脉平均压的计算 动脉平均压 MAP 是血压波 P t 形在一个周期内的积分除以周期T 其定义如下 均压反映了动脉血压的数值和波形 从试波法原理的两条基本原则 振荡波包络线呈现出近似抛物线的形态 脉搏振荡波振幅最大对应的袖带压力为平
  • 什么是大小端?如何确定大小端?

    一 什么是大小端 对于一个由2个字节组成的16位整数 在内存中存储这两个字节有两种方法 一种是将低序字节存储在起始地址 这称为小端 little endian 字节序 另一种方法是将高序字节存储在起始地址 这称为大端 big endian
  • STM32 基础系列教程 24 - USB_HID_key

    前言 学习stm32 USB接口使用 学会用CUBE工具快速创建USB设备工程及调试 关于usb的相关知道请读者提前准备并学习 当然如果不想深究其中原理的话 跟着本文来操作就可以实现基于USB的设备开发了 需要提示的是 stm32在使用us
  • STM32 基础系列教程 38 - Lwip_http

    前言 HTTP协议 HyperText Transfer Protocol 超文本传输协议 是因特网上应用最为广泛的种网络传输协议 所有的WWW文件都必须遵守这个标准 HTTP是一个基于TCP IP通信协议来传递数据 HTML 文件 图片文
  • 关于串口助手接收到数据,但显示的数据(16进制)为00的解决方法

    只需要把波特率调低就行
  • 汇编基础知识

    一 汇编语法 1 GNU 汇编语法适用于所有的架构 并不是 ARM 独享的 GNU 汇编由一系列的语句组成 每行一条语句 每条语句有三个可选部分 如下 label instruction comment label 即标号 表示地址位置 有
  • 怎样入门嵌入式嵌入式未来的发展方向

    概述 很多工程师要往嵌入式方向发展 特别是ARM得到应用后 这个趋势更是有增无减 但你真的知道怎样入门嵌入式么 你知道嵌入式未来的发展方向么 怎样入门嵌入式嵌入式未来的发展方向 在很多学生或者初级工程师都关注嵌入式 尤其在ARM大红大紫以后
  • stm32+DS1302+TM1638驱动程序

    TM1638数码管显示驱动程序 参考 1 TM1638与STM32连接 1 1 硬件连接 Vcc 电源 GND 电源地 STB PA0 CLK PA1 DIO PA2 1 2 驱动程序 TM1638 c文件 Program Assignme
  • 交叉编译tslib (正确版)

    1 下载安装交叉编译器 编译器版本不限 需要与系统移植时的编译器保持一致即可 2 下载tslib1 4 3 交叉编译tslib 1 4 下载的tslib 1 4 tar gz放到 home driver ts 目录下 cd home dri
  • 完美解决 keil5.25 某宝Jlink无法使用问题

    首先再次声明下 支持正版 打击盗版 有钱就去买个正版的吧 最近开心地给实验室的电脑装上新版的Keil 5 25 可是装完后发现JLINK无法使用了 直接提示SN什么的 总之就是盗版问题 网上找个各种换 KEIL安装目录中的 ARM Segg
  • 嵌入式入门基础知识有哪些?

    嵌入式系统是指在特定应用领域内为满足特定要求而设计的计算机系统 通常被嵌入到设备中 具有实时性 可靠性 低功耗等特点 嵌入式系统应用广泛 例如 智能家居 智能手表 汽车控制系统 医疗设备等 在本篇博客中 我们将讨论嵌入式入门基础知识 包括嵌
  • STM32 基础系列教程 20 - RTC

    前言 学习stm32 RTC 实时时钟 的使用 学会用RTC实现钟表功能 示例详解 基于硬件平台 STM32F10C8T6最小系统板 MCU 的型号是 STM32F103c8t6 使用stm32cubemx 工具自动产生的配置工程 使用KE
  • STM32 基础系列教程 36 - Lwip_dns

    前言 域名系统 英文 DomainNameSystem 缩写 DNS 是互联网的一项服务 它作为将域名和IP地址相互映射的一个分布式数据库 能够使人更方便地访问互联网 DNS使用TCP和UDP端口53 当前 对于每一级域名长度的限制是63个
  • STM32 基础系列教程 30 - 文件系统

    前言 学习stm32中FATFS 文件系统的基础使用 学会文件的打开及读写删除等基本操作 理解文件系统基本概念 示例详解 基于硬件平台 STM32F10C8T6最小系统板 MCU 的型号是 STM32F103c8t6 使用stm32cube
  • STM32 - 利用SPI接口读写FLASH编程实践

    1 SPI 固件库介绍 可以直接查看 F103固件库手册 只有英文没有中文 chm 找到SPI章节 相关信息都在这里 初始化结构体及函数定义在库文件 stm32f4xx spi h 及 stm32f4xx spi c 中 编程 时我们可以结
  • Beyond Compare 3 许可证密钥被撤销

    最近在使用 Beyond Compare 3 时突然出现 许可证密钥被撤销 问题 现象截图以下 自己清除注册表并重新安装后还是出现相同的问题 没办法只能求助于百度 找到解决方法 删除 C Users Administrator AppDat
  • 通过Keil如何查看MCU的RAM与ROM使用情况

    概述 在很多偏门MCU 还是使用keil进行开发 开发过程中能免会出现ram rom不够问题 怎么查看呢 下面揭晓答案 一 查看方式 1 编译后 2 通过map查看 方法很简单 鼠标对准红色圈 双击即可 有时 双击不了 只要按照上图配置 此
  • 在WINDOW 系统下如何用批处理命令生成代码

    如图要实现一个每次编译都会自动重新生成的代码 一般是 软件版本相关的代码最适合这种自动生成 上图中需在用到编译时间和日期 来直接上代码 BEGIN COLOR 07 cls echo off ECHO ECHO 自动生成软件版本号 ECHO
  • keil更改黑色背景颜色

    1 先将keil安装目录下UV4中global文件复制出来留作备用 然后用记事本打开安装目录下的global文件 2 将下面的内容全部替换global里的内容 然后保存 properties for all file types inden

随机推荐

  • LeetCode第55题:跳跃游戏:给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。

    LeetCode第55题 跳跃游戏 给定一个非负整数数组 nums 你最初位于数组的 第一个下标 数组中的每个元素代表你在该位置可以跳跃的最大长度 判断你是否能够到达最后一个下标 示例 输入 nums 2 3 1 1 4 输出 true 解
  • SpringBoot配置Mybatis的两种方式(通过XML配置和通过YML配置文件配置)

    一 通过XML的方式配置Mybatis 在 src main resource下创建Mybatis配置文件 mybatis config xml 和 映射文件目录mapper 在application yml指定Mybatis配置文件 映射
  • 优化算法——全局灵敏度分析算法(PAWN )(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 目前更新 电力系统相关知识 期刊论文 算法 机器学习和人工智能学习 支持 如果觉得博主的文章还不错或者您用得到的话 可以关注一下博主 如果三连收藏支持就更好啦 这就
  • Ceph入门到精通-ceph对于长文件名如何处理

    RADOS object with short name 上一篇博文 我们将介绍了对象相关的数据结构ghobject t 以及对象在底层文件系统存储的文件名 以及如何从文件名对应到 ghobject t对象 映射关系如下图所示 这里面有一个
  • [QT编程系列-27]:多线程机制 - 信号与槽实现不同对象之间通信的五种情形:线程内同步通信、线程内异步通信、线程间异步通信

    目录 理论基础 0 1信号与槽机制 0 2 线程的事件队列 0 3 线程的信号队列 第1种情形 主线程上下文的两个对象之间同步通信 第2种情形 主线程上下文的两个对象之间异步通信 第3种情形 子线程给主线程上下文中的对象发送异步信号 第4种
  • 香港一事无成一日游

    因工作需求 我想开一些港卡 跟老婆商量后 说办就办 参考了群友和前同事的开卡相关的经验文章 再结合小红书上的各种教程 准备去香港将此事解决 因为不太懂里面的道道 我们自己也准备了一份自认为比较周全的文档 此文档结众家之长 在出发前 文档创建
  • 关于单链表的增删查改等操作(c语言版)

    目录 1 关于单链表 2 单链表的优缺点 3 单链表的初始化 4 申请新结点 5 关于单链表的插入 尾插 6 单链表的头插 7 单链表的尾删 7 单链表的头删 8 单链表的查找 9 在某一的数字的前面插入新数据 10 在某一结点之后插入数据
  • windows10 安装mqtt服务器和client客户端进行本地调试

    一 安装mqtt服务器 使用emqx作为mqtt服务器 下载emqx windows 4 3 8 zip emqx windows 4 3 8 zip 其他版本 Directory listing for broker EMQ 解压到自定义
  • 微信小程序压缩wxml

    背景 微信小程序添加webpack压缩之后 支持js css等压缩 但是wxml没有找到对应的api 后来看到小程序可以启动自定义编译命令 兜兜转转找到了一些命令来实现wxml的压缩 记录如下 需要的伙伴自取 命令输入位置如下图 命令如下
  • 安装教程rtx2080ti_Ubuntu18.04上安装RTX 2080Ti显卡驱动

    上了RTX 2080Ti显卡后 原来Ubuntu18 04内置的驱动和PPA安装的都不运作了 安装NVidia官网下载的驱动可以跑起来 但是需要费一些周折 1 禁用系统默认显卡驱动 打开系统黑名单 sudo gedit etc modpro
  • 网页游戏《天书世界》屌丝修仙记

    天书世界修仙 无限小号刷打宝塔 得到的金钱数据对比 终极玩法 天书世界 修仙 看了一些玄幻修仙小说 主人公屌丝逆袭白富美的攻略只有一个 就是不同常人的隐藏技能 作为工程师 羡慕没鸟用 还是实践一下 看看是否有潜质 于是搞了一个网页游戏 耍耍
  • JAVA面试题汇总

    JAVA面试题汇总 一 java基础篇 1 final 关键字的作用 被 final 修饰的类不可以被继承 被 final 修饰的方法不可以被重写 被 final 修饰的变量不可以被改变 如果修饰引用 那么表示引用不可变 引用指向的内容可变
  • Mybatis中的statementType="STATEMENT"使用注意

    今天遇到如下问题 Cause com mysql jdbc exceptions jdbc4 MySQLSyntaxErrorException You have an error in your SQL syntax check the
  • vulnhub靶场 DC-1

    过程曲曲折折 中途还看了下题解才断断续续的完成这个靶场 只能说技术不到家 攻击机 kali ip 192 168 16 134 靶场 ip 192 168 16 149 首先是到vulnhub官网去下载DC 1的靶场这里就不讲如何下载了 直
  • 【100天精通python】Day34:使用python操作数据库_ORM(SQLAlchemy)使用

    目录 专栏导读 1 ORM 概述 2 SQLAlchemy 概述 3 ORM SQLAlchemy使用 3 1 安装SQLAlchemy 3 2 定义数据库模型类 3 3 创建数据表 3 4 插入数据 3 5 查询数据 3 6 更新数据 3
  • SpringBoot 系统全局异常处理

    1 编写系统全局异常处理类要求 1 定义全局异常处理类 使用 ControllerAdvice 注解标签修饰 2 处理指定异常类信息 通过 ExceptionHandler 注解标签修饰 3 处理指定异常类是否向前端返回错误信息 如果需要向
  • Restful API 的设计规范

    Restful API 的设计规范 Restful API 的设计规范 1 URI URI规范 资源集合 vs 单个资源 避免层级过深的URI 对Composite资源的访问 2 Request HTTP方法 安全性和幂等性 复杂查询 Bo
  • Effective STL学习

    引言 以下为个人的一些读书心得 对于部分比较浅显易懂的就不再赘述 只是日常使用中不太会留意到的加以解释 第一章 容器 第一条 慎重选择容器类型 第二条 不要试图编写独立于容器类型的代码 第三条 确保容器中的对象拷贝正确而高效 第四条 调用e
  • Android 模拟双击点赞脚本

    以下代码通过GPT3 5生成 bin bash 点击次数范围 CLICK COUNT MIN 20 CLICK COUNT MAX 30 每次点击间隔范围 CLICK INTERVAL MIN 3000 CLICK INTERVAL MAX
  • STM32F103C8T6在线升级 IAP

    stm32程序每次执行都会从基地址0x800 0000开始执行 IAP程序升级的执行是在bootloader引导文件执行后 进行加载 跳转APP程序 所以每次上电后进入BootLoader判断是否需要升级 如果升级则接受bin文件 如果不升