请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
STMCU小助手 发布时间:2021-12-18 17:42
67.1 初学者重要提示
* K  r" E" J7 Q3 Q  本章主要为大家介绍系统bootloader的理论知识,下个章节为大家实战。
& G8 n4 ]- F- s6 e& U: R ) x  C4 d; Z/ R& ]+ ]+ `9 U/ @
67.2 系统bootLoader基础知识( {  i$ c* L' a8 [9 v0 R
STM32的系统存储区自带bootloader,此程序是ST在芯片出厂时烧录进去的,主要用于将用户应用程序下载到芯片内部Flash。支持USB,SPI,I2C,CAN,UART等接口方式下载。如果大家的应用程序打算采用这种接口方式进行升级,可以考虑采用系统bootloader,简单易用,无需用户自己写bootLoader了。% T: x  r% L0 T  p* p& d) D9 }; d! F# T! O9 D

. e6 U& N3 `$ L更重要的是,使用系统BootLoader可以不依赖硬件boot引脚,可以直接从应用程序跳转到系统BootLoader,这样灵活性就很大了。& j2 v# J( G7 _! @' K: q
/ y& Z) D" v8 _! L
67.2.1 系统bootLoader执行流程: B% W- a5 l, N9 ^" I2 b8 Z
下面是STM32H7的BootLoader程序执行流程,简单了解下即可:
4 z* O6 ], V2 w
! E% J  S' F& ]
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png
/ x9 Z! J  f: J* _6 h* o
6 o  C/ \) p' K4 w4 R
关于这个执行流程,要特别注意一点:如果在进入系统BootLoader前就插入了USB线,会导致进入系统BootLoader后优先执行USB DFU,其它的接口方式将没有机会执行。
- I1 ?1 B  O; C; E4 M* b- E- d1 q0 z! T- N' o+ B- \
67.2.2 系统bootLoader使用的引脚

% W9 r0 }; n! hSTM32H7的Bootloader使用到的引脚分配如下:
) D( C5 {2 x) B" A  U' t
6 u  u2 U+ T: ^: Q
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png
7 L8 G; ?% U8 y( K! I

& \1 `' O* C" T( ?  G( H67.3 进入系统bootLoader的方法
- @- L3 \- m3 @$ SSTM32进入系统BootLoader主要有两种方法,一种是设置boot引脚,另一种是应用程序直接跳转到系统BootLoader。
  G8 b2 Z4 }# T# W$ p" i' ?5 Q1 x5 R7 b9 v0 D# o( C. h0 ~
67.3.1 设置硬件boot引脚进入系统bootLoader

- }3 q4 B9 Q# a9 E0 pH7的启动方式比较更灵活,只需一个boot引脚。但是一个引脚只能区分出两个状态,为了解决这个问题,H7专门配套了两个option bytes选项字节配置,如此以来就可以方便设置各种存储器地址了。
6 V/ k! R6 g5 W9 }+ ~5 ]# j% D5 D! I, R) p
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png
/ b2 e* [4 t0 N4 ]9 g5 k9 _
7 ~: q! S$ }. D: H  N
BOOT_ADD0和BOOT_ADD1对应32位地址到高16位,这点要特别注意。通过这两个选项字节,所有0x0000 0000到0x3FFF 0000的存储器地址都可以设置,包括:
% F- r5 c& o7 `4 T4 _2 ]4 }5 g( H0 I# _. q. c" a* u' U3 r
  所有Flash地址空间。
' Z* W2 w1 ?7 k: M$ q* H0 ]# ?  所有RAM地址空间,ITCM,DTCM和SRAM。1 J- D; }/ ]6 X* V1 Z% f" T, P
设置了选项字节后,掉电不会丢失,下次上电或者复位后,会根据BOOT引脚状态从BOOT_ADD0,或BOOT_ADD1所设置的地址进行启动。也就是说是,H7可以从0x0000 0000到0x3FFF 0000所有地址进行启动,这点与F4完全不同,F4系列是固定从0x0000 0000启动的。
" e# A/ N; l. _0 a
5 y$ U: O. e0 k- T" MSTM32H7的boot引脚设计:
" o+ T1 j( x/ Y4 O( ~. e+ C0 K7 y  b& H% G& `" I+ F) ~9 j: @- q' }
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png

2 _. G) ~% i' f5 N; X4 G: n
8 m. n# b  J6 v9 h& a* G使用BOOT功能,注意以下几个问题:
9 G+ r) c& d2 `; ?
& {, {7 O1 T$ n! ~( c+ h  如果用户不慎,设置的地址范围不在有效的存储器地址,那么BOOT = 0时,会从Flash首地址0x0800 0000启动,BOOT = 1时,会从ITCM首地址0x0000 0000启动。
3 s- N- [# r& r, j" H  如果用户使能了Flash Level 2保护,那么只能从Flash地址空间进行启动。
) N$ l8 t( s$ U8 U; z4 U67.3.2 用户应用程序跳转到系统bootLoader
( Z" J6 y& c, M9 z, S2 [
除了使用boot引脚控制运行系统BootLoader,也可以上电后跳转,跳转前注意以下问题:
; H5 n2 V' K. c1 m) U
$ x& ?4 V5 W; v0 a9 Z  禁止所有外设时钟。' S3 W" j$ U- w+ J+ \
  禁止使用的PLL。4 s1 p+ L, \( n# Y
  禁止所有中断。1 u0 z: w  D/ I! p5 l+ B: ?+ H
  清除所有中断挂起标志。
3 ?/ B: Z1 |& s  如果使用Go命令,对于BootLoader中使用的硬件外设寄存器,跳转前是不会设置到复位值的,如果用户代码中恰好也用到这些寄存器,需要重新配置。这里要特别注意的是BootLoader会用到看门狗,并且喂狗时间设为最长了,如果用户代码里面要用到看门狗请根据需要重新配置,并且看门狗一旦开启是无法关闭的。$ W6 C$ q) L6 j
  对于具有双bank特性的STM32,为了能够从用户代码跳转到系统boot,需要将系统boot代码区使用寄存器SYSCFG重映射到0x0000 0000(除了F7和H7系列)。对于STM32F7系列,需要禁止nDBOOT / nDBANK 特性,然后跳转到系统boot区。
8 E) Z( [, p. a. P, q( |  如果用到系统bootloader的DFU/CAN接口,需要用到HSE时钟,这个时钟的频率是通过内部HSI/MSI检测出具体频率。因此,由于外部温度等各种情况,内部HSI的精度会受到影响,从而影响检测出来的HSE时钟有较大误差,最终导致DFU/CAN运行失败。* d) @" f5 c6 d5 |- ^9 F
2 x* G; p& X7 g
具体实现会在下一章节为大家讲解。
# x7 E+ ~9 E% Q! m5 @3 {4 n  O4 J" t1 X: _" ^6 p
67.4 退出系统bootLoader的方法: i( @( r$ D5 M" \  U
当前主要研究了USB DFU和串口IAP退出bootLoader。, _' a- {* e* {4 y

; g$ |. |+ ^  W3 f; T( ?0 B  USB DFU$ x+ g$ ^7 N8 H% b6 v
当芯片工作在系统bootLoader的USB DFU模式,更新完毕程序后,不会自动退出USB DFU,需要重新复位芯片后才会退出。由于DFU模式会用到USB线,插拔USB线是难以避免的,所以是否支持自动退出,并不影响。
. Q' A1 d( v+ R! T+ j4 O) e" Y* s' Y9 p* g, B
  串口IAP
: s% X1 i# L/ F& V. v当芯片工作在系统bootLoader的串口升级模式,更新完毕程序后,可以自动退出。所以基于串口的组网设备,使用系统bootloader非常方便。% e9 d4 F& I! y* F, v1 r, G

- T6 q8 ~; ~" V9 Z2 e, R" G67.5 系统bootLoader的擦写管理: H' N) ^2 k7 j6 g" e& _8 w
注:这部分知识点有个了解即可。
0 d* _7 L6 s3 ?3 Y' |+ c! A0 F% ]/ @3 S
使用bootloader命令进行的所有写操作都只能字对齐(地址应该是4的倍数)。要写入的数据数量也必须是4的倍数(接受未对齐的半页写地址)。8 [7 N& Q. @! i! ~
  有些产品不支持批量擦除操作。使用BootLoader进行批量擦除时,有两种方法可用:
8 X5 Z$ N8 u, t5 F  使用扇区擦除命令一个一个删除。+ q2 y" |/ n8 w, i4 U: L& C4 Q
  将保护级别设置为1,然后设置为0(使用读保护命令,然后使用读非保护命令),将导致大批量擦除操作。2 y" {: R: r* ?7 O2 h& u# R# V  H" w
  STM32 L1和L0系列的Bootloader除了支持操作内部Flash,内部SRAM,可选字节等,还支持操作Data Memeory(数据存储区,貌似是指的EEPROM)。数据存储区支持读写操作,而不支持擦除命令,如果要擦除,写0即可。另外对此存储区的写操作必须是4字节对齐(写地址),并且写入的数据也是4的倍数。
& Q1 u$ F1 {/ y  F2, F4, F7 和 L4除了支持操作内部Flash,内部SRAM,可选字节等,还支持操作OTP存储区。仅支持读写操作,不支持擦除命令。
3 l1 Z/ t: K. a& O  F2, F4 和 F7系列的内部Flash写格式依赖于供电电压范围,默认的写操作只支持字节(半字,字和双字是不支持的),为了增加写操作速度,用户施加足够的电压范围以允许写操作按半字,字或双字,并通过虚拟内存位置的boot程序更新此配置。该内存位置不是物理地址,但可以根据协议使用常规的BootLoader读写操作。该存储位置包含4个字节,分别为如下表所述:
0 K' v5 r5 u" P6 e+ c' k
( k& O# u3 W" P  o3 Y  o" Y/ X
; c/ q$ v0 ~5 Y6 o+ @- L, ?+ k67.6 总结

' z1 W+ @% j  |# Q  r& R本章节就为大家讲解这么多,更新相关的知识看ST的应用笔记AN2606。
0 \( R) t/ \  I4 ~
& [/ [3 n' `$ Y$ Y
# J% ^* d) C) ~2 x) X% J6 q! `/ i" J( c) [  e6 n/ G
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png
收藏 评论0 发布时间:2021-12-18 17:42

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版