你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32的IAP在线应用升级,摘抄过来的,希望对大家有帮助

[复制链接]
一代睡神的崛起 发布时间:2019-3-20 08:42
本帖最后由 一代睡神的崛起 于 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

收藏 2 评论4 发布时间:2019-3-20 08:42

举报

4个回答
一代睡神的崛起 回答时间:2019-3-20 08:48:11
本帖最后由 一代睡神的崛起 于 2019-3-20 08:49 编辑

不好意思,文笔不好很少写帖子,所以图片不是很到位,打包成压缩包发上面了
jeffhe1 回答时间:2019-3-20 15:00:35
這也就是 bootloader , 軟件 update 的意思 , 謝謝大大的提供 , 會努力詳讀的
jeffhe1 回答时间:2019-3-20 15:02:43
請問有整包軟件可以藉測試一下嗎? 避免一些外在因素導致無法成功

点评

我是整个工程,没有细分出来  发表于 2019-3-20 18:36
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版