datasheet

STM32F103 代码远程升级(一)初识IAP编程

2019-07-11来源: eefocus关键字:STM32F103  代码远程升级  IAP编程

一、IAP是什么

IAP即为In Application Programming,解释为在应用中编程,用户自己的程序在运行过程中对User Flash的部分区域进行烧写。即是一种对单片机flash擦写的一种编程方案。

通常情况下,一片stm32单片机的flash只有一个用户程序,而IAP编程则是将单片机的flash分成至少两大区域,一部分叫做bootloader区,一部分叫做app用户代码区,还可留出一部分区域为代码备份区。


二、IAP的应用场所

通常情况下我们给stm32单片机烧录更新程序时是通过SWD、J-link或者通过设置BOOT引脚后,使用串口进行程序下载,这样的方式直接一次性将程序文件下载到单片机的flash中,比较适合绝大部分的应用。

但是当产品投入实际应用时,封装完成后在后期的使用过程中遇到某些程序上的bug或者是根据客户需求需要增加一些功能的时候,使用传统代码烧录的方法就可能需要拆除封装,而使用IAP编程在bootloader区提前写入与外部通信的接口用于升级单片机代码,使得我们不用对已完成包装的产品进行拆除既可以更新代码,这样既节约了成本,也更加方便快捷。


三、IAP编程的流程

IAP编程将Flash区分成的两个区域,bootloader区和app用户代码区具有截然不同的功能。

bootloader区,主要实现接收程序文件,并将该程序写于特定位置的Flash区域。而这里接收外部程序文件,就需要实时和外部通信了。Stm32单片机与外部通信大多是通过自身的串口接收和发送数据,不过Stm32单片机的串口可以外接多种通讯接口,例如422、485、GPRS及ESP8266等。即我们可以通过串口外接蓝牙模块、WiFi模块或者是其他网络模块,就可以实现远程的文件传送更新单片机程序了。

app用户代码区则是主要实现我们所需要的功能操作,除此之外app用户代码区还需要实时检查代码运行情况,通过判断更新程序的标志位来判断是否需要升级程序。若是需要升级程序则进入bootloader区进行代码更新;若不需要则继续运行功能函数代码即可。

因此IAP编程下的单片机运行流程如下图:

IAP编程下单片机运行流程图

根据运行流程,我们可以总结出简单几条bootloader设计过程中需要注意的地方:

1、精简、程序尽可能精简。在单片机Flash有限的情况下,bootloader代码占用Flash的空间越小,则APP程序代码就可占用更多,实现更多功能函数。

2、标志位不受复位的影响。

3、Bootloader中尽量不使用中断。


四、写在末尾的话

因为项目上需要,提出了远程升级单片机程序的要求,所以才开始接触到IAP编程。在弄清楚了原理和流程之后,我就开始着手实现这一功能,写此系列文章主要是为了留个笔记方便以后查看。文中的内容也多是我通过学习加上自身的理解写的,所以若有不妥之处,欢迎大家指出,共同进步。 后续文章主要是围绕Stm32F103单片机串口更新程序的具体操作,涉及的通信协议有Xmodem、Ymodem及MQTT;涉及的编程语言有C、Lua。



关键字:STM32F103  代码远程升级  IAP编程

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic467488.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:基于STM32的无线通信模块使用——HC_05蓝牙串口
下一篇:stm32 接收蓝牙(uart)等设备命令的处理

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

解决stm32f103通过stlink不能烧录程序问题

问题:   stm32(stm32f103c8T6)开发板只能通过串口烧录程序,而st—link居然不行描述:解决:st-link固件升级用stm32cubemx快速开发时没有配置好调试模式重新生成代码就可以了如果还是不行的话,就得升级一下stlink固件了,具体升级方法可百度
发表于 2019-07-19
解决stm32f103通过stlink不能烧录程序问题

STM32F4标准外设库模板工程建立与使用

<stdint.h>这个地方,然后在下面添加#include “arm_math.h”然后保存。ARM_MATH_CM4ARM_MATH_MATRIX_CHECKARM_MATH_ROUNDING__FPU_PRESENT__FPU_USED代码优化http://www.stmcu.org/module/forum/thread-603791-1-1.html网线热插拔http://blog.csdn.net/xukao5671927/article/details/77765464JTAG引脚复用STM32f1 中JTAG 引脚作为普通IO口设置方法以及STM32f4中的方法的不同在stm32f1中,我们对于不用
发表于 2019-07-19
STM32F4标准外设库模板工程建立与使用

STM32F1系列单片机USB外设相关寄存器的定义

Keil MDK网站上下载的Keil.STM32F1xx_DFP.2.2.0.pack包中的stm32f10x.h头文件里面没有USB_TypeDef的定义,只有寄存器位的定义,是不完整的头文件。没有USB的数据结构就会给访问USB寄存器带来一定的困难。虽然可以参照STM32参考手册中的USB register map自己编写出USB_TypeDef结构体,但是这样比较麻烦。不过,STM32CubeMX工具生成的STM32F103工程中的头文件stm32f103xe.h中就有完整的USB数据结构,该头文件的版本是V4.2.0,日期为31-March-2017,作者仍然是Keil里面的MCD Application Team
发表于 2019-07-19

STM32F103 DMA 通道对应的外设

今天在调试stm32f103的时候,使用串口1的RX对应DMA1通道5是正确的,但是当我调试调试到串口2的RX的时候依然在用原通道,完全忽略了芯片不同的外设所对应的DMA通道是不同的。 
发表于 2019-07-19
STM32F103 DMA 通道对应的外设

不同stm32f103芯片内部外设资源

由表可知,芯片内部的外设资源除了跟stm32f103后面的第一个字母有关外,还和flash的大小有关。上面的表中只有一部分,具体的可以参考Keil的芯片型号选择部分。下面是stm32f103c8t6的资源:  TIM1_BRK_IRQn               = 24,       TIM1_UP_IRQn                = 25,      
发表于 2019-07-19
不同stm32f103芯片内部外设资源

一种可行的STM32F103外设RTC使用方法

前言最近做的项目需要用RTC功能,记录掉上电时间。然后就开始琢磨STM32的RTC,在使用的过程中出现各种问题。搞的很是头痛。几经折腾,终于弄出一种稳定的使用方法。刚开始最大的问题就是掉电后时钟不走,代码改来该去,最后发现不管是第一次初始化还是每次上电运行,都需要打开PWR和BKP时钟。下面就把我的代码全贴出来,可以直接调用。代码#ifndef BSP_RTC_H#define BSP_RTC_H#include "stm32f10x.h"#include <time.h>//BCD码表示时间typedef struct systemtime_tag{    unsigned
发表于 2019-07-19

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved