STM32之串口IAP更新升级
一、IAP简介
IAP是应用编程,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级,后续产品发布后,更新程序我只需要把.bin文件通过串口发送给芯片就可以执行更
新,很方便产品的维护工作。对于应用IAP的项目,整个项目需要有两个项目的代码,第一个项目程序不执行正常的功能,通过串口或者USB等通信来接收对第二个项目代码,并且执行更新第二
部分的代码,称这个程序为Bootloader程序,第二个项目的程序是我们产品要实现的功能程序,即产品功能程序。针对我的工程项目,当芯片上电后,首先会执行Bootloader程序,并且会执行以
下操作:
1、通过按键来判断是否需要对产品功能程序进行更新
2、不更新则跳转到4运行产品功能程序。
3、进入更新功能程序状态,要等待串口发送过来的产品功能程序
, 接收成功后并开始功能程序的更新工作。更新完成后自己跳转到4运行产品功能程序
4、进入到产品的功能程序。
Bootloader程序一般使用JLINK下载或者ISP串口下载到芯片里边,而产品的功能程序则是通过设置后,KEIL在编译后把.axf文件转为.bin文件,更新产品功能程序则是通过串口软件把.bin文件发送
给Bootloader程序,就可以进行产品功能。
二、IAP 程序运行流程
STM32芯片正常运行的流程如下:
加入IAP程序后,STM32芯片运行的流程如下:
三、IAP配置
1、Bootloader程序:
我使用的芯片STM32F407VET6,在Bootloader程序是参考正点原子的源代码修改的,我通过一个拨码开关来判断是不是要更新产品功能程序,如果要更新则拨到ON,程序会通过串口等待接收
要更新的代码,接收完成后会自己更新,更新完成后自动进入到产品功能程序里边,下次需要更新则需要重新上电或者复位。程序代码如下:
while(1)
{
if(USART_RX_CNT)
{
if(oldcount==USART_RX_CNT)//新周期内,没有收到任何数据,认为本次数据接收完成.
{
applenth=USART_RX_CNT;
oldcount=0;
USART_RX_CNT=0;
printf("用户程序接收完成!\r\n");
printf("代码长度:%dBytes\r\n",applenth);
flagtest=0;
}
else
oldcount=USART_RX_CNT;
}
t++;
delay_ms(10);
if(t==30)
{
LED0=!LED0;
t=0;
}
key=KEY_Scan(0);
if(key==1) //按键按下
{
if(applenth&&flagtest==0)
{
flagtest=1;
printf("开始更新固件...\r\n");
if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{
iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,applenth);//更新FLASH代码
printf("固件更新完成!\r\n");
}else
{
printf("非FLASH应用程序!\r\n");
}
}
else
{
printf("没有可以更新的固件!\r\n");
}
}
else
{
flagtest=0;
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");
}
}
}
2、产品功能程序的IAP配置
因为加入IAP功能后,实际上我们的程序由两个部分组成,一个是Bootloader程序,另一个的产品功能程序。那么我们会在芯片的Flash中设置64k来保存bootloader程序,64k以后存储产品的功
能程序,如下图所示,IROM1的起始地址一般为0X08000000,大小为0X80000(512k),STM32F407VET6的flash为512k,而对于bootloader程序预留了64K的空间,对于产品功能程序的起始地
址为0X08010000,即偏移量0X10000(64k)预留给bootloader,而0X8010000开始以后都是产品功能程序的存储空间。
另外,在程序中还需要设置产品功能程序中断向量表的起始地址,表示flash是从这个新设置的起始地址开始的。一般放在main函数的最开头。
SCB->VTOR = FLASH_BASE | 0x10000;//设置偏移量
我们要知道更新产品程序是通过串口发送bin文件给bootloader项目的程序,我们要怎么配置把产品功能程序生成.bin文件?在KEIL环境中设置,如下图所示,name of Executable
为axf文件的名
字,实际上.bin文件是通过.axf文件转换的。
图中输入的内容为D:\software\keil\ARM\ARMCC\bin\fromelf.exe --bin -o E:\IMI_101项目\IMI_101\MDK-ARM\IMI_101.bin E:\IMI_101项目\IMI_101\MDK-ARM\IMI_101\IMI_101.axf
其中fromelf.exe为安装KEIL软件包含的软件,主要用于把axf文件转换为bin文件。
E:\IMI_101项目\IMI_101\MDK-ARM\IMI_101.bin 为生成的bin文件存放的路径和文件名字
E:\IMI_101项目\IMI_101\MDK-ARM\IMI_101\IMI_101.axf 为axf文件所在的路径和文件名
产品功能程序在编译无报错即就可以生成IMI_101.bin文件。
四、参考文档
http://www.docin.com/p-972460815.html
by 羊羊得亿
2017-11-23 ShenZhen
STM32之串口IAP更新升级的更多相关文章
- STM32F103 串口-IAP程序升级
STM32F103 串口-IAP程序升级 通常情况下我们给STM32系列的单片机烧录程序文件的时候,使用SWD.J-link或者通过设置BOOT引脚后,使用串口进行程序下载,这样的方式直接一次性将程序 ...
- STM32F103/429串口IAP+Ymodem升级
起因: 串口IAP升级在正点原子的例程中有讲解,正点原子的方法是:在RAM中开辟一个120K的数据空间,用来存放bin文件,bin文件通过串口一次性发送到单片机,然后再实现程序的跳转.但是这种方法在实 ...
- STM32串口IAP分享
什么是IAP? IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通 ...
- STM32f103x IAP远程升级小结
最近在面试的时候遇到一个关于IAP远程程序升级的问题,由于之前所做的项目没有涉及到远程升级需求,当时一脸懵呆,不过回答的还是不错的,今天针对STM32F103系列调试了IAP的程序,这里做一下小结,如 ...
- STM32之串口DMA接收不定长数据
STM32之串口DMA接收不定长数据 引言 在使用stm32或者其他单片机的时候,会经常使用到串口通讯,那么如何有效地接收数据呢?假如这段数据是不定长的有如何高效接收呢? 同学A:数据来了就会进入串口 ...
- android开发 更新升级安装到一半自动闪退
如题:android开发 更新升级安装到一半自动闪退,,,解决办法,如下(红色为我新增的代码) /** * 安装APK文件 */ private void installApk( ...
- STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷
STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷 http://www.openedv.com/thread-63849-1-1.html 实现思路:采 用STM32F103的串口1,并配 ...
- JDFS:一款分布式文件管理实用程序第二篇(更新升级、解决一些bug)
一 前言 本文是<JDFS:一款分布式文件管理实用程序>系列博客的第二篇,在上一篇博客中,笔者向读者展示了JDFS的核心功能部分,包括:服务端与客户端部分的上传.下载功能的实现,epoll ...
- Android应用程序的自动更新升级(自身升级、通过tomcat)(转)
Android应用程序的自动更新升级(自身升级.通过tomcat) http://blog.csdn.net/mu0206mu/article/details/7204746 刚入手android一个 ...
随机推荐
- [BJWC2012]冻结 分层图最短路
昨晚飞行路线之后,这道题就应该能一眼切了 题目当然也不难,跑一遍分层图最短路即可 Code: #include<cstring> #include<algorithm> #in ...
- HTML5的核心内容
开发者可以放心地使用html5的理由 兼容性.HTML5在老版本的浏览器可以正常运行,同时支持HTML5的新浏览器也能正常运行HTML4,用HTML4创建出来的网站不是必须全部重建的. 实用性.HTM ...
- ES6学习笔记(十六)async函数
1.含义 ES2017 标准引入了 async 函数,使得异步操作变得更加方便. async 函数是什么?一句话,它就是 Generator 函数的语法糖,号称异步的终极解决方案. 前文有一个 Gen ...
- 单调队列&单调栈归纳
单调队列 求长度为M的区间内的最大(小)值 单调队列的基本操作,也就是经典的滑动窗口问题. 求长度为M的区间内最大值和最小值的最大差值 两个单调队列,求出长度为M的区间最大最小值的数组,分别求最大最小 ...
- 修复linux的grub2引导(单独/boot,lvm-root)
root@ubuntu:/home/ubuntu# pwd /home/ubuntu root@ubuntu:/home/ubuntu# lsblk NAME MAJ ...
- 对比学习sass和stylus的常用功能
在众多的css预处理器语言中,sass和stylus算是十分优秀的两个.本文主要针对两者的常用功能做个简单的对比分析.在对比中了解二者的差异,同时帮助大家更好的掌握这两种预处理语言.本文涉及到的sas ...
- HDU 4937 Lucky Number 搜索
题意: 给你一个数,求在多少种不同的进制下这个数每一位都是3.4.5.6中的一个. 思路: 搜索.枚举这个数在任意进制下的表示,判断是否合法.当数字只有3.4.5.6时,必定有无穷种. 因为数字太大, ...
- rac重新启动遭遇ORA-01078、ORA-01565、ORA-17503、ORA-12547
今天測试环境server重新启动导致一个节点集群无法重新启动,遭遇ORA-12547错误.详细例如以下: server重新启动后,rac1集群无法启动,rac2正常启动: [root@rac1 ~]# ...
- hdu(1069)——Monkey and Banana(LIS变形)
题意: 如今给你n个石块,然后它由坐标来表示(x,y,z).可是它能够有不同的方法,也就是说它的三个坐标能够轮换着来的. 石块的数量不限,可是每次都必须保持上底面的长和宽严格递减,然后问你用这些石块所 ...
- Centos7.4 modsecurity with nginx 安装
1.准备: 系统环境:Centos7.4 软件及版本: nginx:OpenResty1.13.6.1 ModSecurity:ModSecurity v3.0.0rc1 (Linux) modsec ...