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一个 ...
随机推荐
- TCP 三次握手,四次挥手
TCP 三次握手,四次挥手 1. TCP 三次握手 建立连接前,客户端和服务端需要通过握手来确认对方: 客户端发送 syn(同步序列编号) 请求,进入 syn_send 状态,等待确认 服务端接收并确 ...
- PatentTips - Virtualizing performance counters
BACKGROUND Generally, the concept of virtualization in information processing systems allows multipl ...
- 启动springboot
新建一个springboot项目,idea的做法:一般直接next就行 填写项目使用到的技术,上面的Spring Boot版本建议选择最新的稳定版,主要勾选上Web就可以了,如下图: 新建之后< ...
- Android自定义组件系列【16】——最帅气的自动滚动广告条
前一段时间要实现一个滚动的广告条,参考了一下网上许多实现,发现实现都很麻烦,所以我决定自己使用ViewFlipper来实现一个,在此将代码贴出来,与大家共享. 转载请说明出处:http://blog. ...
- codeforces 710C Magic Odd Square(构造或者n阶幻方)
Find an n × n matrix with different numbers from 1 to n2, so the sum in each row, column and both ma ...
- Python demo working
一.游戏1.2.3 print("-------------- Guess Number Game---------------------") num=input("G ...
- Python(一) 基本类型
前言: 什么是代码? 代码是现实世界事物在计算机世界中的映射. 什么事写代码? 写代码是将现实世界中的事物用计算机语言来描述. 一.数字:整形与浮点型 整型:int 浮点型:float (没有单精度和 ...
- SFML学习纪要
工作需要,近段粗浅看了一下SFML,记录一下! 一.浅见概述 SFML,simple and Fast mulitmedia Library官方网站:http://www.sfml-dev.org/i ...
- Swift学习笔记(1)--基本语法
1.分号; 1>Swift不要求每个语句后面跟一个分号作为语句结束的标识,如果加上也可以,看个人喜好 2>在一行中写了两句执行语句,需要用分号隔开,比如 let x = 0; printl ...
- 洛谷——P2446 [SDOI2010]大陆争霸
https://www.luogu.org/problem/show?pid=2446#sub 题目背景 在一个遥远的世界里有两个国家:位于大陆西端的杰森国和位于大陆东端的克里斯国.两个国家的人民分别 ...