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

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

[复制链接]
STMCU小助手 发布时间:2021-12-18 17:42
67.1 初学者重要提示
" F; ~3 {; f* C/ Q* V! c  本章主要为大家介绍系统bootloader的理论知识,下个章节为大家实战。
8 ~2 |7 U3 \% `3 b: E
( A- B1 m0 N, ~& C67.2 系统bootLoader基础知识
& A" r; x. e5 k7 Q7 {+ OSTM32的系统存储区自带bootloader,此程序是ST在芯片出厂时烧录进去的,主要用于将用户应用程序下载到芯片内部Flash。支持USB,SPI,I2C,CAN,UART等接口方式下载。如果大家的应用程序打算采用这种接口方式进行升级,可以考虑采用系统bootloader,简单易用,无需用户自己写bootLoader了。. M; J- Y/ `  Y( c8 h- ]! E
. H; ^2 [7 R+ h8 k
更重要的是,使用系统BootLoader可以不依赖硬件boot引脚,可以直接从应用程序跳转到系统BootLoader,这样灵活性就很大了。
) ^. Y  |2 @* n, z9 s6 Z. `
! ^) H" {7 l; M/ v4 e) ^67.2.1 系统bootLoader执行流程4 Z0 z5 C: g* T1 e3 U2 e
下面是STM32H7的BootLoader程序执行流程,简单了解下即可:  y9 \2 k( u+ b' ]; g0 t
" s* i8 P* n; N3 A4 n% x
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png

* {/ o% A! w7 Y( Q3 W, A) a; k7 p8 D3 c4 d. n; l2 z
关于这个执行流程,要特别注意一点:如果在进入系统BootLoader前就插入了USB线,会导致进入系统BootLoader后优先执行USB DFU,其它的接口方式将没有机会执行。* {; M$ g- ~! i2 r' ^3 t6 ]
! ?3 W! ]) B! N  f2 s
67.2.2 系统bootLoader使用的引脚

1 K. K  M. p8 Z4 k) CSTM32H7的Bootloader使用到的引脚分配如下:- i  y0 M; m( V- @

5 A4 T4 \  u1 G! a* G
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png
( O* t) y+ ]2 F$ s

$ @7 b# W" c  K1 D, `67.3 进入系统bootLoader的方法" \# c+ g9 t! C- ?5 n& D& t/ a
STM32进入系统BootLoader主要有两种方法,一种是设置boot引脚,另一种是应用程序直接跳转到系统BootLoader。
+ f. C& G( U: R( k4 Y, C; D7 J+ a, C0 f5 I! ^4 _+ L( j
67.3.1 设置硬件boot引脚进入系统bootLoader

) y; D6 z$ [$ w& ZH7的启动方式比较更灵活,只需一个boot引脚。但是一个引脚只能区分出两个状态,为了解决这个问题,H7专门配套了两个option bytes选项字节配置,如此以来就可以方便设置各种存储器地址了。
. U/ i4 f, I8 U2 c
' D8 Z; E9 G0 D. t: Q" D  O% r
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png

( A( ~  Y, c: x% M2 V6 z" K8 o. N& ^, }
BOOT_ADD0和BOOT_ADD1对应32位地址到高16位,这点要特别注意。通过这两个选项字节,所有0x0000 0000到0x3FFF 0000的存储器地址都可以设置,包括:' b  m% `) F# G0 N. S
1 B/ c6 r, T. Q( {$ u% E
  所有Flash地址空间。6 g/ z, j0 w* B2 }
  所有RAM地址空间,ITCM,DTCM和SRAM。* V8 e+ x+ g& ]# r# _) _) S
设置了选项字节后,掉电不会丢失,下次上电或者复位后,会根据BOOT引脚状态从BOOT_ADD0,或BOOT_ADD1所设置的地址进行启动。也就是说是,H7可以从0x0000 0000到0x3FFF 0000所有地址进行启动,这点与F4完全不同,F4系列是固定从0x0000 0000启动的。
2 W2 |0 [" j6 I- C: \. I
' c0 z$ v  E* z" M/ h6 ~STM32H7的boot引脚设计:
: ?: N8 }$ N* L6 W, [
3 h; k) s! s9 S( Q* C* d
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png
7 q* `) X/ l2 c- B  A! o

4 d7 `. w9 b  Z使用BOOT功能,注意以下几个问题:$ X  P) S$ n" V4 U' S
5 V& M! L. ]7 b  ?  |2 E  [* J
  如果用户不慎,设置的地址范围不在有效的存储器地址,那么BOOT = 0时,会从Flash首地址0x0800 0000启动,BOOT = 1时,会从ITCM首地址0x0000 0000启动。
, S+ G* ~0 v" T9 U  如果用户使能了Flash Level 2保护,那么只能从Flash地址空间进行启动。
' {; D$ p& g1 |& I67.3.2 用户应用程序跳转到系统bootLoader
! J$ z: Y4 s) O
除了使用boot引脚控制运行系统BootLoader,也可以上电后跳转,跳转前注意以下问题:/ E% A- {& X& \% p5 n- m
  y+ [9 U1 u8 O% B( P2 ?( W
  禁止所有外设时钟。1 ~8 P6 I- `% ]( w6 z+ x8 P
  禁止使用的PLL。6 J* c6 @, Q- \
  禁止所有中断。4 s2 e2 F7 O; I
  清除所有中断挂起标志。. j) _. A' H6 X* F
  如果使用Go命令,对于BootLoader中使用的硬件外设寄存器,跳转前是不会设置到复位值的,如果用户代码中恰好也用到这些寄存器,需要重新配置。这里要特别注意的是BootLoader会用到看门狗,并且喂狗时间设为最长了,如果用户代码里面要用到看门狗请根据需要重新配置,并且看门狗一旦开启是无法关闭的。+ a  m+ s! k; S6 m: [# \9 s
  对于具有双bank特性的STM32,为了能够从用户代码跳转到系统boot,需要将系统boot代码区使用寄存器SYSCFG重映射到0x0000 0000(除了F7和H7系列)。对于STM32F7系列,需要禁止nDBOOT / nDBANK 特性,然后跳转到系统boot区。
. `- t1 j% x/ z2 N7 C8 B3 l: }9 n  如果用到系统bootloader的DFU/CAN接口,需要用到HSE时钟,这个时钟的频率是通过内部HSI/MSI检测出具体频率。因此,由于外部温度等各种情况,内部HSI的精度会受到影响,从而影响检测出来的HSE时钟有较大误差,最终导致DFU/CAN运行失败。
  n( |  Q. s3 U
2 `% }9 F5 u  J  W0 q6 R具体实现会在下一章节为大家讲解。
/ R* y; k: {( {  e; x& l/ Q. A$ n
1 J# l4 U+ K  x" j  m; G  J$ {67.4 退出系统bootLoader的方法. d# L: J4 ]$ t$ |
当前主要研究了USB DFU和串口IAP退出bootLoader。/ V' F& u. Y1 y, `, J

" \+ G; l% `, k2 [7 N  USB DFU8 k5 j, h: b4 l
当芯片工作在系统bootLoader的USB DFU模式,更新完毕程序后,不会自动退出USB DFU,需要重新复位芯片后才会退出。由于DFU模式会用到USB线,插拔USB线是难以避免的,所以是否支持自动退出,并不影响。' |/ O% d0 @" F; c2 T+ S3 J
" p2 x7 E3 i! n( g, x' G3 o
  串口IAP! P( n' V+ r7 ]. O
当芯片工作在系统bootLoader的串口升级模式,更新完毕程序后,可以自动退出。所以基于串口的组网设备,使用系统bootloader非常方便。
9 Q$ j0 m. P! {5 C0 p; I
2 n* j# A# w2 z( m+ K! X67.5 系统bootLoader的擦写管理1 e: Y, x& B+ b% }0 _' z0 X; G$ h! ]
注:这部分知识点有个了解即可。' t: O! x* `! m8 K6 ~1 J0 v

5 w7 k+ ^+ f9 e' r4 Z3 m5 Q使用bootloader命令进行的所有写操作都只能字对齐(地址应该是4的倍数)。要写入的数据数量也必须是4的倍数(接受未对齐的半页写地址)。9 @7 S) o  {$ O) z4 W
  有些产品不支持批量擦除操作。使用BootLoader进行批量擦除时,有两种方法可用:# c: [' h0 a  f+ ?% b4 c4 d5 Z
  使用扇区擦除命令一个一个删除。( C% Q( o- N" K3 E, N- o
  将保护级别设置为1,然后设置为0(使用读保护命令,然后使用读非保护命令),将导致大批量擦除操作。
( k! u7 a7 O2 w) o- x) a/ [; l. h) a  STM32 L1和L0系列的Bootloader除了支持操作内部Flash,内部SRAM,可选字节等,还支持操作Data Memeory(数据存储区,貌似是指的EEPROM)。数据存储区支持读写操作,而不支持擦除命令,如果要擦除,写0即可。另外对此存储区的写操作必须是4字节对齐(写地址),并且写入的数据也是4的倍数。
$ s9 U/ b) y& A, H' y3 B  F2, F4, F7 和 L4除了支持操作内部Flash,内部SRAM,可选字节等,还支持操作OTP存储区。仅支持读写操作,不支持擦除命令。6 @; Q8 Q5 _9 v# L' ~
  F2, F4 和 F7系列的内部Flash写格式依赖于供电电压范围,默认的写操作只支持字节(半字,字和双字是不支持的),为了增加写操作速度,用户施加足够的电压范围以允许写操作按半字,字或双字,并通过虚拟内存位置的boot程序更新此配置。该内存位置不是物理地址,但可以根据协议使用常规的BootLoader读写操作。该存储位置包含4个字节,分别为如下表所述:
' _4 H) X- y9 M0 t/ \7 L) D4 Z' K
1 n# Q" T2 a( T3 u' x: F# P( T; {
% _6 a+ X8 R% {# P67.6 总结

* a+ X" g1 `9 w- w# Q本章节就为大家讲解这么多,更新相关的知识看ST的应用笔记AN2606。
3 w1 f9 Q8 a$ R- F( P: s  W8 [3 W& O2 {% C

' e. x1 B/ ^; ~
$ l$ P, F% g* A0 ~! U
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png
赞 收藏 评论0 发布时间:2021-12-18 17:42

举报

0个回答

所属标签

相似技术帖

官网相关资源

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