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

STM8单片机为例,该如何实现Bootloader呢?

[复制链接]
gaosmile 发布时间:2021-1-6 12:18
去某新能源大厂出了一次差,这次出差是为了升级程序解决Bug,需要给单片机重新烧录.hex文件,用户已经将产品封装起来,无法开盖,只能使用CAN总线来更新程序,用Bootloader实现。其实就是通过上位机把.bin/hex文件以CAN通讯的方式发送给单片机并存储在规定的Flash中。这个过程与手机端更新APP类似。6 ?* I: J. o6 x3 U0 ~* R) n0 {
微信图片_20210106121729.jpg 3 A2 m6 h; n7 v7 U3 }
以STM8单片机为例,该如何实现Bootloader呢?今天和大家分享一下。
01
, u1 r4 q+ f% C+ I; a/ e
( |5 w2 @) g. @8 S# x

6 _2 ?, @- ]$ G5 J! G1 p8 d6 Y% M1 x
什么是Bootloader
9 R9 ]! b* E6 c0 C  }
Bootloader是一段用于更新自身应用软件并独立运行的代码,常被用于升级产品和修复产品bug。STM8单片机如果要下载hex文件的话需要通过STVP和STLINK来实现,单片机的引脚SWIM就是下载接口。如果产品在用户端被封装好了,无法通过SWIM来下载该怎么办呢?就使用Bootloader,STM支持CAN和UART实现Bootloader。就是通过CAN通信或者UART通信将数据存放在STM8的Flash上。
02

# Q8 O& F6 {& P4 g4 \
. [# s$ l' z" w* C5 n; W) V; i$ J8 {5 X6 w6 P7 N0 V
2 K( Q, _7 p# v
划分Flash区间
4 D; W- g/ l: ^/ I1 }
STM8的中断向量跳转地址是固定的,会跳转到0x8000对应中断的偏移地址,所以会把Bootloader存放在0x8000开始的空间内,比如给Bootloader代码所划分的空间为4k,那么空间起始地址为:0x8000-0x8FFF;那么应用代码的起始地址就可以从0x9000开始。
03

9 Q  h$ o. C% D! Z* Y. i6 ~" B: l# C, k, y" \2 [  C2 E+ s

) g( Q" f3 Q4 y* m. F# z6 S( Q% G- d: s) p7 x3 K
修改中断向量表
; r! q  ]& W# C& n+ J' a
STM8的中断向量表通过一段特定的代码来实现,并需要根据前文提到的空间划分来修改。STM8的应用程序起始地址是0x8400,默认的向量表如下代码所示:__root const long reintvec[]@".intvec"=
/ J! `( J% M, y  M4 S- r/ P{
$ r8 V" e, ^% T1 D, W, z0x82008080,0x82008404,0x82008408,0x8200840c, % C/ V) N9 B* M5 Y5 h9 x& {
0x82008410,0x82008414,0x82008418,0x8200841c,
1 ~* Z2 c4 t9 H0x82008420,0x82008424,0x82008428,0x8200842c, ; t& ?0 o  @0 Z0 ]' @4 _. z& z- G
0x82008430,0x82008434,0x82008438,0x8200843c,
) n  ^0 K& O# S) O5 `+ g0x82008440,0x82008444,0x82008448,0x8200844c,
& V7 _' j5 ~$ H* l' Y0x82008450,0x82008454,0x82008458,0x8200845c, 8 w1 _9 B+ \. p* \, z! K4 I; S
0x82008460,0x82008464,0x82008468,0x8200846c,
! s$ F, `4 N' g, G" Y0x82008470,0x82008474,0x82008478,0x8200847c, 1 [% a% {. V1 B2 z: L+ N- C: n
};
% p! E( X5 Y& N+ l
前文已经将应用程序的起始地址修改为0x9000,所以,向量表的的修改方法为:除了第一个元素为,其余的元素将8改为9,修改完后代码如下:__root const long reintvec[]@".intvec"=8 \* \  r) b8 ?. s2 O
{   2 z  E! O% |3 e: n: _) f
0x82008080,0x82009404,0x82009408,0x8200940c,   ]- Q3 i$ o! C! k: C
0x82009010,0x82009014,0x82009018,0x8200901c,; w3 w# S+ Y5 r6 J4 d; W2 ?
0x82009020,0x82009024,0x82009028,0x8200902c,: K" A' i3 s4 C: x" I
0x82009030,0x82009034,0x82009038,0x8200903c,
9 w$ f, T7 K6 e( J& j0x82009040,0x82009044,0x82009048,0x8200904c,+ B5 Y: ]! \' M/ N  U$ l2 p
0x82009050,0x82009054,0x82009058,0x8200905c,
- B7 @- `. E( H0 z, [0x82009060,0x82009064,0x82009068,0x8200906c,
4 T1 s! Y% Y1 ~0x82009070,0x82009074,0x82009078,0x8200907c,0 r7 ?: x6 M5 F3 d/ I3 R5 ?. N
};
/ o6 g- A0 Q. r

8 k5 x5 w! d) Q! z) a8 Z& q
04

1 s8 l  u  w3 e, p6 g- g2 l' s, o( U: c5 o- j! G. n
  _' P) Z2 i0 E' Q! [

, D2 G  j* H2 F3 w5 D; ]
修改ICF文件
ICF文件存放在编程环境的安装目录下,每个型号/系列的单片机都会对应一个ICF文件,需要修改一下ICF文件,这里需要根据flash空间的划分来修改,前面将Bootloader的终止地址设置为0x9FFF,所以修改如下:define region NearFuncCode = [from 0x8000 to 0x8FFF];6 M  j9 C& m7 S% J* w- w
define block INTVEC with size = 0x80 { ro section .intvec };
: F5 P% @" H" _' n. e4 Kplace at start of NearFuncCode  { block INTVEC };6 k' Z, K7 g6 g! }' h
+ u7 g& a8 b4 T  h. x4 A8 D, E  P+ J
微信图片_20210106121732.jpg
05

  k1 s7 _- F6 B
0 Q2 |/ a5 _- }' c4 O9 s
7 E7 _" I- I& q& m
* ^4 G1 x0 f, {! |, e% L6 A$ M
跳转命令
所谓跳转,就是在应用程序中跳转到Boot中去升级;升级完成后需要跳转到应用程序中,所跳转的起始就是起始地址。Bootloader跳转到应用程序的代码如下:asm("LDW X,  SP ");0 k. Q" y  @' L4 N2 D; b9 O
asm("LD  A,  $FF");: C) @) [/ q' T& Z1 g
asm("LD  XL, A  ");5 s; t9 n4 }0 ^, U; n
asm("LDW SP, X  ");
  I2 y. }  f  @7 \1 V9 c  uasm("JPF $9000");9 h7 X7 }9 ]& i
应用程序跳转到Bootloader中的代码如下sm("LDW X,  SP ");* J5 e3 U- G( q
asm("LD  A,  $FF");
7 V7 J$ Q7 u. \. {* i7 Aasm("LD  XL, A  ");
% Y& I+ ?$ n2 h9 Casm("LDW SP, X  ");
: s( f% x/ c; r5 }# U4 K2 {  Zasm("JPF $8000");
06

$ K  t3 ?: J* s' I) @
2 @  k* g( \) Z& q! D7 d5 a& z. o) h' k

3 Y7 \/ ?( ?3 c8 d  R3 X. a
编写交互代码
以上设置好之后,就可以编写交互代码了,所以交互代码其实就是一套协议,规定了应用程序如何跳转到Boot,在Boot中如何处理和存储数据,这需要上位机的支持。如果只是用于自家的产品,就可以自己定义协议。也可以使用标准的协议,比如汽车行业中的UDS(统一诊断服务)。Bootloader实现之后,就可以使用CAN/UART来实现产品固件的升级了。这就是Bootloader的关键内容,本文你学会了吗?留言讨论一下吧。1 Q2 A( S& J$ ^/ \* {
赞 收藏 评论1 发布时间:2021-1-6 12:18

举报

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