一、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更新升级的更多相关文章

  1. STM32F103 串口-IAP程序升级

    STM32F103 串口-IAP程序升级 通常情况下我们给STM32系列的单片机烧录程序文件的时候,使用SWD.J-link或者通过设置BOOT引脚后,使用串口进行程序下载,这样的方式直接一次性将程序 ...

  2. STM32F103/429串口IAP+Ymodem升级

    起因: 串口IAP升级在正点原子的例程中有讲解,正点原子的方法是:在RAM中开辟一个120K的数据空间,用来存放bin文件,bin文件通过串口一次性发送到单片机,然后再实现程序的跳转.但是这种方法在实 ...

  3. STM32串口IAP分享

    什么是IAP? IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通 ...

  4. STM32f103x IAP远程升级小结

    最近在面试的时候遇到一个关于IAP远程程序升级的问题,由于之前所做的项目没有涉及到远程升级需求,当时一脸懵呆,不过回答的还是不错的,今天针对STM32F103系列调试了IAP的程序,这里做一下小结,如 ...

  5. STM32之串口DMA接收不定长数据

    STM32之串口DMA接收不定长数据 引言 在使用stm32或者其他单片机的时候,会经常使用到串口通讯,那么如何有效地接收数据呢?假如这段数据是不定长的有如何高效接收呢? 同学A:数据来了就会进入串口 ...

  6. android开发 更新升级安装到一半自动闪退

    如题:android开发 更新升级安装到一半自动闪退,,,解决办法,如下(红色为我新增的代码) /**     * 安装APK文件     */    private void installApk( ...

  7. STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷

    STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷 http://www.openedv.com/thread-63849-1-1.html 实现思路:采 用STM32F103的串口1,并配 ...

  8. JDFS:一款分布式文件管理实用程序第二篇(更新升级、解决一些bug)

    一 前言 本文是<JDFS:一款分布式文件管理实用程序>系列博客的第二篇,在上一篇博客中,笔者向读者展示了JDFS的核心功能部分,包括:服务端与客户端部分的上传.下载功能的实现,epoll ...

  9. Android应用程序的自动更新升级(自身升级、通过tomcat)(转)

    Android应用程序的自动更新升级(自身升级.通过tomcat) http://blog.csdn.net/mu0206mu/article/details/7204746 刚入手android一个 ...

随机推荐

  1. [BeiJing2009 WinterCamp]取石子游戏 Nim SG 函数

    Code: #include<cstdio> #include<algorithm> #include<cstring> using namespace std; ...

  2. DNA Sequence POJ - 2778 AC 自动机 矩阵乘法

    定义重载运算的时候一定要将矩阵初始化,因为这个调了一上午...... Code: #include<cstdio> #include<algorithm> #include&l ...

  3. echarts 总结:

    options配置项: title: 图表标题的配置 tooltip: 鼠标悬浮的提示 toolbox: 工具栏 series: 数据项,是每一个个的数据对象,可以根据type配置每一项数据的图例. ...

  4. [洛谷P3927]SAC E#1 - 一道中档题 Factorial

    题目大意:求$n!$在$k(k>1)$进制下末尾0的个数. 解题思路:一个数在十进制转k进制时,我们用短除法来做.容易发现,如果连续整除p个k,则末尾有p个0. 于是问题转化为$n!$能连续整除 ...

  5. caioj 1067动态规划入门(一维一边推5: 乘积最大(高精度版))

    因为这里涉及到乘号的个数,那么我们可以用f[i][j]表示前i个位乘号为j个时的最大乘积 那么相比上一题就是多了一层枚举多少个乘号的循环,可以得出 f[i][r] = max(f[j - 1][r - ...

  6. 紫书 例题 10-6 UVa 1635 (二项式定理+唯一分解定理)

    首先可以发现按照题目的算法最后得出来是一个杨辉三角 如果ai的系数是m的倍数,那么i即为答案 因为这个系数可能很大,而我们只需要判断倍数 所以我们就把m分解质因数,然后判断每一个系数 的质因数的幂是不 ...

  7. sublime配置python

    Sublime Text 2作为一款轻量级的编辑器,特点鲜明.方便使用,愈发受到普罗大众的喜爱.我个人近期也開始用了起来.同一时候,我近段时间还在学习Python的相关东西.所以開始用ST2来写Pyt ...

  8. JSR 303 - Bean Validation 简单介绍及用法

    一.JSR-303简单介绍 JSR-303 是 JAVA EE 6 中的一项子规范.叫做 Bean Validation,官方參考实现是Hibernate Validator. 此实现与 Hibern ...

  9. vue10 v-text v-html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 怎么在cmd中输入mysql就可以进去mysql控制台

    执行命令  设置cmd以管理员身份运行