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

【经验分享】浅析STM32 Bootloader设计

[复制链接]
STMCU小助手 发布时间:2022-1-27 23:08
不需要拆机就能对产品进行固件升级是很多人想要的效果,不仅方便而且节省精力和成本。那么如何完成这项工作呢?接下来所介绍的Bootloader就可以完成这项工作,通过Bootloader引导程序完成固件的升级。下面来浅析STM32 Bootloader设计。
& R7 Z: I3 g7 C) C( {
设计思想

7 R# m; l! ~2 Z! [% E' w5 [
  由Bootloader负责检测SD卡中是否有固件更新所需的BIN文件。如果检测到所需要的BIN文件,则开始复制文件更新固件。更新结束后跳转到指定的地址开始执行最新的程序。可以在论坛的ARM版块找到liklon的帖子:两份简单的 Bootloader 程序。

5 R) P; b0 {/ l
  知识要点
7 Z# G7 a, `2 d9 A* ]9 |
  STM32内部FLASH的起始地址为0X08000000,Bootloader程序文件就从此地址开始写入,存放APP程序的首地址设置在紧跟Bootloader之后。当程序开始执行时,首先运行的是Bootloader程序,此时Bootloader检测SD卡中的BIN文件并将其复制到APP区域使固件得以更新,固件更新结束后还需要跳转到APP程序开始执行新的程序,完成这最后这一步要了解Cortex-M3的中断向量表:
; h& k0 F' B! M

% H8 g  ?; N4 _+ h1 G
  程序启动后,将首先从“中断向量表”取出复位中断向量执行复位中断程序完成启动,当复位中断程序运行完成后才跳转到main函数。由此可见,在最后一步的设计中需要根据存放APP程序的起始地址以及中断向量表来设置栈顶地址,并获取复位中断地址跳转到复位中断程序。接下来开始分析程序设计步骤。

+ ]- x2 H8 `! n/ y. ]
  Bootloader程序设计

( J) E  w9 C* i* x# G6 b& F* V
  1.确定存放APP程序的首地址
! q5 P  j# e/ ]4 r% Q- C
  #define FLASH_APP_ADDR 0x08010000 //应用程序起始地址(存放在FLASH)上一句代码中是0X08010000可以看出,留给Bootloader程序的存储空间大小为64K。存放APP程序的起始地址为0X08010000。
1 C" n; a% g2 m% h- O7 V# T
  2.Bootloader检测是否有BIN文件

/ J! f2 Q, }2 B
  gCheckFat = f_open(&FP_Struct,"/APP/LIKLON.BIN",FA_READ);//判读gCheckFat确定上面的代码是检测是否存在liklon.bin这个文件存在,其中liklon.bin文件就是固件升级所需要的BIN文件。

1 s; a" o' O; ]
  3.复制文件到指定地址
3 |  y7 t4 k/ L3 y" E+ p
  上一步中如果gCheckFat为0则表示存在所需BIN文件,则可以执行这一步。f_read (&FP_Struct,ReadAppBuffer,512,(UINT *)&ReadNum); //读取512个字节将512个字节转换为256个16位的数据存放在ChangeBuffer数组中,准备写入FLASH。FlashWrite(FLASH_APP_ADDR + i * 512,ChangeBuffer,256); //向指定地址写入读出数据向APP程序区写入512个字节的数据。按照这样读取写入,就可以完成对APP程序区的更新。
   4.跳转到新程序运行
  更新完程序后就需要跳转到新程序开始运行,具体实现看下面代码:
  typedef void (*iapfun)(void); //定义一个函数类型的参数
( k% |8 m  t) }7 U7 m4 A% }+ A& |; A$ ^  iapfun jump2app;
- I- M3 z% R, l# _/ P  __asm void MSR_MSP(u32 addr) //设置堆栈指针" Y" S* x* ^( r& c5 A
  {
. @. G2 L  N5 Z; G( u/ [        MSR MSP, r0
) X$ J# @. R  C" R" X; M& r        BX r14+ f' @  O- X3 [8 ~1 [" P& l
  }
$ p0 v5 n$ e6 z  //跳转到应用程序段! G6 ]5 k! M- i9 ^! X2 q2 T
  //appxaddr:用户代码起始地址.7 g; f7 x% d( D( W8 K+ ]
  void iap_load_app(u32 appxaddr); s" u# Z9 l! E  u( {- b' b
  {
* O% Z# Z! R+ I7 n6 D6 @        if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法.
" a0 w4 [% j/ I5 O        {, @! M0 D1 K) i- N1 Q
              jump2app = (iapfun)*(vu32*)(appxaddr+4);//用户代码区第二个字为程序开始地址(复位地址),此处查看中断向量表可知; w3 G% c2 E# V$ o
              MSR_MSP(*(vu32*)appxaddr);//初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)' E3 \7 z6 u0 T  ], M: b% K
              jump2app(); //跳转到APP,执行复位中断程序4 d) L6 p+ y+ s- z1 [% w
        }/ U" n. H. Q( w2 Q1 L
  }
  APP程序设计注意
  1.编译软件需要做出设置:
  在Bootloader程序中已经指定了APP程序存储的起始地址为0x08010000,所以在APP程序设计时需要将编译软件这里做出设置,修改起始地址和大小。
  2.修改system_stm32f10x.c文件
  同样是针对于APP的起始地址改变而修改这里的偏移量,如上图所示。
  文中只是简单的介绍了关于Bootloader程序的设计,作为抛砖引玉,大家可以继续深入,添加数据校验和程序加密等。

& p+ y% j; `! @. n5 o: g; y$ |8 q, x
赞 收藏 评论0 发布时间:2022-1-27 23:08

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版