一、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. linux学习之多高并发服务器篇(一)

    高并发服务器 高并发服务器 并发服务器开发 1.多进程并发服务器 使用多进程并发服务器时要考虑以下几点: 父最大文件描述个数(父进程中需要close关闭accept返回的新文件描述符) 系统内创建进程 ...

  2. Linux系统编程——进程间通信:信号中断处理

    什么是信号? 信号是 Linux 进程间通信的最古老的方式.信号是url=474nN303T2Oe2ehYZjkrggeXCaJPDSrmM5Unoh4TTuty4wSgS0nl4-vl43AGMFb ...

  3. Simditor用法

    一不小心接触到Simditor,瞬间被它优美极简的界面所吸引.Simditor是Tower开源的所见即所得的在线富文本编辑器. Simditor的理念是保持简单,避免过度的功能,每个特性都追求极致的用 ...

  4. 仿即刻app"猜你喜欢"切换控件

    最近在即刻里看到即刻的"猜你喜欢"的板块,觉得效果很赞. 当点击"换一换"时,上面三个条目程序切换效果,并且三个条目的切换以不同的速度进行. 于是开始想办法撸出 ...

  5. 从 dig(nslookup) bind —— windows 下的域名解析服务器信息的查看

    dig(domain information groper,之所以选择这三个词,在于这三个词的首字母构成的词 dig 也有探索挖掘的含义)本身是 Linux 下的查询 DNS 信息的工具,功能类似 n ...

  6. NET Remoting原理及应用

    .NET Remoting原理及应用实例: Remoting:(本文摘自百度百科) 简介:        什么是Remoting,简而言之,我们可以将其看作是一种分布式处理方 式.从微软的产品角度来看 ...

  7. scikit-learn的线性回归

    scikit-learn的线性回归预测Google股票 这是机器学习系列的第一篇文章. 本文将使用Python及scikit-learn的线性回归预测Google的股票走势.请千万别期望这个示例能够让 ...

  8. 让透明div里的文字不透明

    最近在工作中遇到一个问题,我在div里写上文字,当我把div变为半透明的时候,里面的文字也会随之透明.情况如下: <div class="box"> 这是一段不应该透明 ...

  9. android的HTTP框架之Volley

    Volley是android官方开发的一个HTTP框架,简化了利用java中原生的HTTP操作API-HttpURLConnection和HttpClient的操作. 一.首先是Volley的简单使用 ...

  10. Python(九) Python的高级语法与用法

    本章节我们揭开Python进阶部分的高级特性,详细讲解枚举.闭包,并对函数式编程做出介绍 一. 枚举其实是一个类 from enum import Enum #枚举类 class VIP(Enum): ...