
本帖最后由 一代睡神的崛起 于 2019-3-20 08:49 编辑 此次要讲的是基于STM32F103RET6的IAP升级历程。所谓的IAP( In Application Programming)即在线应用编程。其主要的应用就是对程序的在线升级更新。比如,我们开发的产品,在已经大量出货的情况下,突然发现我们产品的程序有个BUG,在这种情况下,总不能把所有的产品都召回吧,这样成本太高了。IAP就可以很好避免这个问题。 如果你的设备上有IAP功能,你可以要求把你的产品接到网口、USB、插个有新程序的TF卡、或者串口等等,就能对产品设备进行固件升级。就像我们的手机刷机一样。 IAP升级原理 STM32单片机,根据BOOT电平的设置,其上电启动的地址也是部一样的,常用的是从Flash启动。对应的BOOT电平设置如下: 在FLASH启动模式下,上电的启动地址是:0x0800 0000,也是FLASH的起始地址。 比如,本次使用的STM32F103RET6单片机,其FLASH大小为512K,RAM尺寸为64K。这里我将程序设计成两个BOOT程序和APP程序。 BOOT程序:位于FLASH的起始地址,及0x0800 0000.主要进行对后面APP程序的FLASH扇区经行编程,上电默认执行。 APP程序:位于FLASH的后半段,为用户实现功能的程序。 所以这里将512K的FLASH分成了两部分从0x0800 000 -0x0800 FFFF 为BOOT程序区,合计64K;剩下的从0x0801 0000-0x0808 0000为用户APP程序区,合计448K。 程序的启动流程是: 单片机上电之后,首先从0x08000000启动,运行BOOT程序,在BOOT程序中检测是否需要进行固件升级: 如果需要升级,则按照规定的方式,从串口接收数据对单片机的FLASH进行改写,改写完成之后,需要对改写的固件进行校验。校验通过后,则进行程序跳转。 如果不需要升级,则判断APP程序的起始地址是否正常,若正常,则进行程序跳转,运行APP即可。 BOOT程序设计 BOOT程序的核心功能有两个: 1、程序跳转 2、对APP程序的FLASH扇区内容进行改写 程序跳转很简单,也就几句话: 其中的 APP_START 就是我们APP程序的起始地址:0x0801 0000,而FLASH的改写稍微麻烦些,需要将0x0801 0000 后面的FLASH扇区进行擦除和重写。重写的类容为我们新的APP程序类容。 这里说明下,新的APP程序数据,有多种来源方式:可以将新的APP程序的BIN文件放到TF卡中,BOOT程序根据TF卡的BIN文件,去改写APP扇区。也可以用过CAN、RS485、串口、USB等串行接口接收新的APP程序数据包,并把数据包依次写到APP扇区。我们在产品上使用的DFU(不懂DFU的可以去baidu)。 配置工程:默认的是ROM1的起始地址为0x0800 0000 SIZE 为0x8 0000 而本次我们分配的BOOT程序为64K,所以需要修改SIZE为0x10000 其他地方编程没什么特殊: 这里需要主要的是: 1、每个单片机的FLASH大小和扇区是不一样的,两个程序的分割点,一定要选择某个扇区的起始地址。 2、本次是使用的单片机有256个扇区,每个扇区为2K,但是并不是所有单片机的PAGE都是一样大小的,比如STM32F407的扇区就不是平均分配的。 3、BOOT的功能建议设计为越简单越好,其主要功能就是为了下载程序。所以,越简单,其可能出问题的几率就越小。如果BOOT程序出了问题,那一般只能进行产品召回了。 4、安全很重要。在BOOT程序里,一定要记得,要将其他的控制引脚保持在合适的电平。比如:做小车控制板,在BOOT程序升级的时候,忘记了把运动控制引脚的电平拉低,导致在升级的时候,小车乱跑,容易撞到东西。 ========================示例:我设计的BOOT程序升级流程===================== 正常情况下,程序上电启动之后从MCU起始地址0x0800 0000直接启动,读取BKP_DR1寄存器,判断是否需要固件升级,如果不要升级,则进入固件跳转,运行APP程序。 具体流程如下图所示: 在BootLoader程序中,固件的起始地址、BootLoader版本都在程序的代码中固化好了;CPUID、内存尺寸直接读取MCU相关的寄存器即可,如图: APP程序设计 APP程序与我们平时编写的程序稍微有点差别了,因为其程序的起始地址发生了变化,所以需要修改两个地方:程序的起始地址和中断向量偏移地址。 1、程序起始地址修改. 划分的APP程序起始地址为0x0801 0000;APP占用空间大小为448K。SIZE=0x70000 2、修改中断向量偏移地址 在system_stm32f10x.c文件中,修改VECT_TAB_OFFSET的值为0x10000,默认程序定义的值为0 完成上面的修改之后,按照正常的程序设计编程即可.因为我们公司是设计产品开发的,对这块使用的比较多,所以分享一下自己的知识,希望大家共勉。 |
IAPç¸å ³å¾çå 容.rar
下载1.06 MB, 下载次数: 52
MCSDK FOC应用详解
STM32F10xxx 正交编码器接口应用笔记 及源代码
基于STM32定时器ETR信号的应用示例
《无刷直流电机控制应用 基于STM8S系列单片机》
STM32定时器触发SPI逐字收发之应用示例
【银杏科技ARM+FPGA双核心应用】STM32H7系列10——ADC
【银杏科技ARM+FPGA双核心应用】STM32H7系列57——MDK_FLM
无刷直流电机控制应用+基于STM8S系列单片机---电子书
STM32 USB的程序,包含固件、驱动和测试用的应用程序
工业以太网总线ETHERCAT驱动程序设计及应用(扫描版)
不好意思,文笔不好很少写帖子,所以图片不是很到位,打包成压缩包发上面了
点评