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

【经验分享】STM32H7的系统bootloader基础知识

[复制链接]
STMCU小助手 发布时间:2021-11-2 23:44
67.1 初学者重要提示0 p+ x. N3 h5 E
  本章主要为大家介绍系统bootloader的理论知识,下个章节为大家实战。2 X& n( x" B* ^, R+ b& n

5 \9 k$ Q1 @9 y$ x/ ~5 r67.2 系统bootLoader基础知识( h! a) x$ U+ b% y+ @5 f& \: M8 p
STM32的系统存储区自带bootloader,此程序是ST在芯片出厂时烧录进去的,主要用于将用户应用程序下载到芯片内部Flash。支持USB,SPI,I2C,CAN,UART等接口方式下载。如果大家的应用程序打算采用这种接口方式进行升级,可以考虑采用系统bootloader,简单易用,无需用户自己写bootLoader了。9 f+ H6 \  x2 A" t

& u# U7 C; Z% t+ r9 y1 x  W更重要的是,使用系统BootLoader可以不依赖硬件boot引脚,可以直接从应用程序跳转到系统BootLoader,这样灵活性就很大了。* j! Q2 Q/ N. P+ d

% W; L+ ]9 g1 }- X1 D9 b$ x67.2.1 系统bootLoader执行流程/ n5 T2 E/ s5 I. y; }' P
下面是STM32H7的BootLoader程序执行流程,简单了解下即可:& s; Q' f* _4 ^* |3 G5 B

. K) c1 `* o3 r! {
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png

* q" x2 f5 h5 y- P6 w6 s关于这个执行流程,要特别注意一点:如果在进入系统BootLoader前就插入了USB线,会导致进入系统BootLoader后优先执行USB DFU,其它的接口方式将没有机会执行。6 ?& S  F" p1 k, {

! F+ f- C, l3 F, w1 E67.2.2 系统bootLoader使用的引脚& v; a+ V# C7 j( ?  h8 N
STM32H7的Bootloader使用到的引脚分配如下:
2 D# G) o+ m$ O9 _+ b" i1 ]! q* u) r. ^& A3 A4 r
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png
! z1 q, v. u+ T2 ^
67.3 进入系统bootLoader的方法2 |4 W! {# }- X+ J. l& T9 Q; ?
STM32进入系统BootLoader主要有两种方法,一种是设置boot引脚,另一种是应用程序直接跳转到系统BootLoader。. a1 R6 j( X' v7 S1 J" c2 `. }
3 E6 f9 W' W1 \* o
67.3.1 设置硬件boot引脚进入系统bootLoader* C( F0 r8 y: w$ _
H7的启动方式比较更灵活,只需一个boot引脚。但是一个引脚只能区分出两个状态,为了解决这个问题,H7专门配套了两个option bytes选项字节配置,如此以来就可以方便设置各种存储器地址了。
' y9 W2 i  |& ]# H. J* t5 z: R# j' R7 A% {* U' B8 b& g! W8 _' o
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png

' ~0 P  q$ O$ I0 N: m& S2 pBOOT_ADD0和BOOT_ADD1对应32位地址到高16位,这点要特别注意。通过这两个选项字节,所有0x0000 0000到0x3FFF 0000的存储器地址都可以设置,包括:
/ ^/ s0 I; T+ O) V' X; z( c, A
! N3 U5 f  `2 r9 C  所有Flash地址空间。
: g7 Z, O5 H3 E* `, c  所有RAM地址空间,ITCM,DTCM和SRAM。3 X! Y* L3 ^/ m8 M
设置了选项字节后,掉电不会丢失,下次上电或者复位后,会根据BOOT引脚状态从BOOT_ADD0,或BOOT_ADD1所设置的地址进行启动。也就是说是,H7可以从0x0000 0000到0x3FFF 0000所有地址进行启动,这点与F4完全不同,F4系列是固定从0x0000 0000启动的。
7 A/ F/ _/ Z0 @( ]# {: b& ?% y6 Y; s9 q7 M5 J
STM32H7的boot引脚设计:! U9 c6 P* p8 Z) |; a* ^  h

. g% s* o4 p' U( z
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png

5 ?3 E: Z1 ~6 Q  L* ~7 ]使用BOOT功能,注意以下几个问题:
% {/ `: S# B. Y, C# I+ K( |# L  L$ J
: U6 b# u' w& f$ [0 Y# u& i  如果用户不慎,设置的地址范围不在有效的存储器地址,那么BOOT = 0时,会从Flash首地址0x0800 0000启动,BOOT = 1时,会从ITCM首地址0x0000 0000启动。- j5 i. v" `" ^" \+ y9 v+ |
  如果用户使能了Flash Level 2保护,那么只能从Flash地址空间进行启动。
4 P6 s6 o2 D" C# C1 I* Y( |. ^67.3.2 用户应用程序跳转到系统bootLoader
7 `) [9 Z, T* j3 Y0 D+ Y9 `除了使用boot引脚控制运行系统BootLoader,也可以上电后跳转,跳转前注意以下问题:& t  H' H9 y8 I! K+ |

) r7 C6 {3 o5 n  h( ]5 Y  禁止所有外设时钟。
! D& M4 g! C4 K: K) W  禁止使用的PLL。, l0 B7 O& C- @
  禁止所有中断。
$ x' k# G" m; X' O  清除所有中断挂起标志。
- n' _  E% F0 h( U) R; F  k* z0 L  如果使用Go命令,对于BootLoader中使用的硬件外设寄存器,跳转前是不会设置到复位值的,如果用户代码中恰好也用到这些寄存器,需要重新配置。这里要特别注意的是BootLoader会用到看门狗,并且喂狗时间设为最长了,如果用户代码里面要用到看门狗请根据需要重新配置,并且看门狗一旦开启是无法关闭的。
0 m* v8 I* S) E1 M; b6 R+ s1 `  对于具有双bank特性的STM32,为了能够从用户代码跳转到系统boot,需要将系统boot代码区使用寄存器SYSCFG重映射到0x0000 0000(除了F7和H7系列)。对于STM32F7系列,需要禁止nDBOOT / nDBANK 特性,然后跳转到系统boot区。7 n' \. {) D9 `4 o" u
  如果用到系统bootloader的DFU/CAN接口,需要用到HSE时钟,这个时钟的频率是通过内部HSI/MSI检测出具体频率。因此,由于外部温度等各种情况,内部HSI的精度会受到影响,从而影响检测出来的HSE时钟有较大误差,最终导致DFU/CAN运行失败。
8 }2 k% A+ ~8 ?) x+ h) u! g
& F+ q& |( B+ F' L具体实现会在下一章节为大家讲解。
' f6 O% l8 B3 ?% X; F( ^, n5 k, }5 e0 d: V  K4 Q
67.4 退出系统bootLoader的方法& {& z& P( y' v! E
当前主要研究了USB DFU和串口IAP退出bootLoader。
" i# D+ S) }) t# S) b; Z+ B" I% @5 g& F$ C7 |
  USB DFU
6 I1 M# f; h( b+ Q' k: R2 b: G当芯片工作在系统bootLoader的USB DFU模式,更新完毕程序后,不会自动退出USB DFU,需要重新复位芯片后才会退出。由于DFU模式会用到USB线,插拔USB线是难以避免的,所以是否支持自动退出,并不影响。
) ^  D4 _3 j( k  y9 ~* q
; m1 v. r+ D2 w2 t; q  串口IAP6 A3 g) X  V7 y8 o; Q
当芯片工作在系统bootLoader的串口升级模式,更新完毕程序后,可以自动退出。所以基于串口的组网设备,使用系统bootloader非常方便。
$ }2 q  n) m# r2 ^
3 X* [, Z1 s1 N5 V  _) Y67.5 系统bootLoader的擦写管理# J0 O, }1 j+ {3 E% _5 w3 w
注:这部分知识点有个了解即可。
* O5 I( ]* d5 ]2 L# I0 M
3 [, `) e% N8 m/ q7 o8 c使用bootloader命令进行的所有写操作都只能字对齐(地址应该是4的倍数)。要写入的数据数量也必须是4的倍数(接受未对齐的半页写地址)。/ R, y5 P% A) d3 l2 Y) @) K; c% _
  有些产品不支持批量擦除操作。使用BootLoader进行批量擦除时,有两种方法可用:/ A1 z2 g6 u6 a/ ]% W. {2 V
  使用扇区擦除命令一个一个删除。1 z  y0 O- C; P4 c- k9 g' }0 q# N
  将保护级别设置为1,然后设置为0(使用读保护命令,然后使用读非保护命令),将导致大批量擦除操作。, I, D) E) W/ A# |; E9 E, M3 f
  STM32 L1和L0系列的Bootloader除了支持操作内部Flash,内部SRAM,可选字节等,还支持操作Data Memeory(数据存储区,貌似是指的EEPROM)。数据存储区支持读写操作,而不支持擦除命令,如果要擦除,写0即可。另外对此存储区的写操作必须是4字节对齐(写地址),并且写入的数据也是4的倍数。/ K: u% K: X9 n
  F2, F4, F7 和 L4除了支持操作内部Flash,内部SRAM,可选字节等,还支持操作OTP存储区。仅支持读写操作,不支持擦除命令。
! B8 v+ z- |- m1 B% _( \  F2, F4 和 F7系列的内部Flash写格式依赖于供电电压范围,默认的写操作只支持字节(半字,字和双字是不支持的),为了增加写操作速度,用户施加足够的电压范围以允许写操作按半字,字或双字,并通过虚拟内存位置的boot程序更新此配置。该内存位置不是物理地址,但可以根据协议使用常规的BootLoader读写操作。该存储位置包含4个字节,分别为如下表所述:
5 |5 c  A7 S; c+ v6 c$ ^
2 y2 m% D) [9 v. K6 ^
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png

" k+ ]& I  |+ b- i( R0 c4 B67.6 总结
+ t" B0 m3 X) \; w4 X2 y2 D本章节就为大家讲解这么多,更新相关的知识看ST的应用笔记AN2606。) D: M/ T! `; E: h

3 l4 o' X5 _6 |$ f- Q! @! W  X) v3 }% J$ t
5 o/ M. f$ i/ \6 ^  e
" N5 ~+ P! z5 L  i/ r- \
赞 收藏 1 评论0 发布时间:2021-11-2 23:44

举报

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