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

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

[复制链接]
STMCU小助手 发布时间:2021-12-18 17:42
67.1 初学者重要提示
  p/ r* i* c* M7 {  本章主要为大家介绍系统bootloader的理论知识,下个章节为大家实战。8 |! u' S& w% j; M7 i# ~

& M9 q& @7 B. ^% h- U; {  j: K7 R6 i67.2 系统bootLoader基础知识
" b3 K, d4 k- z& [6 E3 Y/ |6 o# x% |STM32的系统存储区自带bootloader,此程序是ST在芯片出厂时烧录进去的,主要用于将用户应用程序下载到芯片内部Flash。支持USB,SPI,I2C,CAN,UART等接口方式下载。如果大家的应用程序打算采用这种接口方式进行升级,可以考虑采用系统bootloader,简单易用,无需用户自己写bootLoader了。. \" i3 o; P2 O) K! m- K

" X) F  V$ f% m) x! O) _; r6 Q0 J1 {更重要的是,使用系统BootLoader可以不依赖硬件boot引脚,可以直接从应用程序跳转到系统BootLoader,这样灵活性就很大了。& m* R3 n( ?" E  S5 H5 u
0 b2 x% h' v/ n, f% s+ G+ @
67.2.1 系统bootLoader执行流程/ k: [* B7 j- E. o* h, W
下面是STM32H7的BootLoader程序执行流程,简单了解下即可:+ [7 U9 C6 V, y  N& M4 K
# C3 a8 {& g. ~- B% e
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png
. T0 Y# ?( w, X/ f+ x# [! m

/ N8 S4 L. |3 }- `- w1 t关于这个执行流程,要特别注意一点:如果在进入系统BootLoader前就插入了USB线,会导致进入系统BootLoader后优先执行USB DFU,其它的接口方式将没有机会执行。( x1 X: X+ t7 r: b2 \
  P6 t$ Z' U' ?% Q/ u
67.2.2 系统bootLoader使用的引脚
# n9 K, y( D  T8 J
STM32H7的Bootloader使用到的引脚分配如下:4 C( z3 K, S9 n1 z- W: r/ ?2 Z
0 Y4 `& v4 f* o7 x) F; k. _( G; W4 g: c9 I1 b
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png

" x4 _/ s3 M5 L: V" G4 n3 w
  y+ K5 `' `* R' L; N0 `7 j9 E" E; I7 C' n67.3 进入系统bootLoader的方法3 }+ R1 W9 y) I9 M
STM32进入系统BootLoader主要有两种方法,一种是设置boot引脚,另一种是应用程序直接跳转到系统BootLoader。/ ?( j8 }! g$ _- L+ P. x8 F

- s* R2 ?3 i  s7 K# m0 D5 ^& H67.3.1 设置硬件boot引脚进入系统bootLoader

6 F: y7 t& A6 _) r  A7 CH7的启动方式比较更灵活,只需一个boot引脚。但是一个引脚只能区分出两个状态,为了解决这个问题,H7专门配套了两个option bytes选项字节配置,如此以来就可以方便设置各种存储器地址了。; w% ]5 g8 \0 t

( P* R6 _+ G. y+ m$ L' `
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png
$ N7 o% i# V6 Z; o

6 x' }3 P  s5 l8 u$ Y9 ^. \% k6 oBOOT_ADD0和BOOT_ADD1对应32位地址到高16位,这点要特别注意。通过这两个选项字节,所有0x0000 0000到0x3FFF 0000的存储器地址都可以设置,包括:
$ Z0 g' V8 S6 L# ^! d5 y0 |# M
  所有Flash地址空间。$ N6 J8 x+ t) |7 Z0 H8 _
  所有RAM地址空间,ITCM,DTCM和SRAM。
. x1 U% e8 y: g1 n8 r+ h6 _设置了选项字节后,掉电不会丢失,下次上电或者复位后,会根据BOOT引脚状态从BOOT_ADD0,或BOOT_ADD1所设置的地址进行启动。也就是说是,H7可以从0x0000 0000到0x3FFF 0000所有地址进行启动,这点与F4完全不同,F4系列是固定从0x0000 0000启动的。
! v' e3 E! E! M5 i
1 ?# l/ i$ P% i5 u. MSTM32H7的boot引脚设计:7 ?/ I# g9 A5 W5 F' {, D" C0 B8 `

5 Y" t- l9 L1 s& S
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png

9 |% w- b& }2 F) b0 m2 n8 j' h3 J, m4 ^- g/ M" X: H. _# l3 ~
使用BOOT功能,注意以下几个问题:! T, }  x) L4 V! S

+ F, k7 c' Z' ^0 H* B* t  如果用户不慎,设置的地址范围不在有效的存储器地址,那么BOOT = 0时,会从Flash首地址0x0800 0000启动,BOOT = 1时,会从ITCM首地址0x0000 0000启动。
* m/ ^; `' T6 G  如果用户使能了Flash Level 2保护,那么只能从Flash地址空间进行启动。
6 @' a7 l/ s3 `, T5 B8 @/ Y67.3.2 用户应用程序跳转到系统bootLoader
, C2 b' v, r! |
除了使用boot引脚控制运行系统BootLoader,也可以上电后跳转,跳转前注意以下问题:
# A% N4 A) L1 i
- Z) b) m: [: y1 F  禁止所有外设时钟。
" `; h! f5 F3 ]: n  禁止使用的PLL。
8 m8 X; d% l4 k+ O: w6 a  禁止所有中断。8 @0 x* K! V& W5 G" n: n9 i' G6 [
  清除所有中断挂起标志。, i& u, M- T& [. J' R, I2 J: x8 h
  如果使用Go命令,对于BootLoader中使用的硬件外设寄存器,跳转前是不会设置到复位值的,如果用户代码中恰好也用到这些寄存器,需要重新配置。这里要特别注意的是BootLoader会用到看门狗,并且喂狗时间设为最长了,如果用户代码里面要用到看门狗请根据需要重新配置,并且看门狗一旦开启是无法关闭的。2 I( B% w4 q9 k* b3 e) M/ `
  对于具有双bank特性的STM32,为了能够从用户代码跳转到系统boot,需要将系统boot代码区使用寄存器SYSCFG重映射到0x0000 0000(除了F7和H7系列)。对于STM32F7系列,需要禁止nDBOOT / nDBANK 特性,然后跳转到系统boot区。: p) Q' t) Z4 X( M1 i
  如果用到系统bootloader的DFU/CAN接口,需要用到HSE时钟,这个时钟的频率是通过内部HSI/MSI检测出具体频率。因此,由于外部温度等各种情况,内部HSI的精度会受到影响,从而影响检测出来的HSE时钟有较大误差,最终导致DFU/CAN运行失败。
9 O+ C: O" O  J" {1 i5 J; q
; j2 B. O1 J/ h具体实现会在下一章节为大家讲解。" R- d; T; k- l# d: s4 b! |! Q
' l$ R' e* s1 k! o& `
67.4 退出系统bootLoader的方法
# U+ E8 [4 i8 ~. R) N当前主要研究了USB DFU和串口IAP退出bootLoader。
# T  y; q- k5 c* t  C" h+ s3 o9 J$ Y! n$ K' a5 i; F9 ^4 k
  USB DFU
& L+ U: B3 D( d  P4 T; P当芯片工作在系统bootLoader的USB DFU模式,更新完毕程序后,不会自动退出USB DFU,需要重新复位芯片后才会退出。由于DFU模式会用到USB线,插拔USB线是难以避免的,所以是否支持自动退出,并不影响。
3 k$ a  O# z; R$ R: L* h& `- Z9 v3 S/ P8 y1 d; K) b  @" U
  串口IAP
* O; ^+ ~# g; v$ G% o/ Z5 B当芯片工作在系统bootLoader的串口升级模式,更新完毕程序后,可以自动退出。所以基于串口的组网设备,使用系统bootloader非常方便。
; g2 L- o; U# G& ]. L8 ]% x
( w% _. ~/ @! j" _& `- }67.5 系统bootLoader的擦写管理
6 ~& `- y3 F7 k5 d6 }注:这部分知识点有个了解即可。. C$ {* X: ~4 [- }5 m: k( X8 P

0 \9 J! W; ]+ |) a  @+ ?4 S使用bootloader命令进行的所有写操作都只能字对齐(地址应该是4的倍数)。要写入的数据数量也必须是4的倍数(接受未对齐的半页写地址)。
% V. u/ T$ B, Z9 T9 v  p( w  有些产品不支持批量擦除操作。使用BootLoader进行批量擦除时,有两种方法可用:* b& t3 c; R! r4 c( Z
  使用扇区擦除命令一个一个删除。
4 f, n# w/ S: M. c1 ]  将保护级别设置为1,然后设置为0(使用读保护命令,然后使用读非保护命令),将导致大批量擦除操作。
. i/ w1 l  M8 }( }3 M( j2 a  STM32 L1和L0系列的Bootloader除了支持操作内部Flash,内部SRAM,可选字节等,还支持操作Data Memeory(数据存储区,貌似是指的EEPROM)。数据存储区支持读写操作,而不支持擦除命令,如果要擦除,写0即可。另外对此存储区的写操作必须是4字节对齐(写地址),并且写入的数据也是4的倍数。( a& t2 @( d: ]4 h, X+ L# l
  F2, F4, F7 和 L4除了支持操作内部Flash,内部SRAM,可选字节等,还支持操作OTP存储区。仅支持读写操作,不支持擦除命令。
$ ^, K+ G( N7 d) D0 V9 {/ W  F2, F4 和 F7系列的内部Flash写格式依赖于供电电压范围,默认的写操作只支持字节(半字,字和双字是不支持的),为了增加写操作速度,用户施加足够的电压范围以允许写操作按半字,字或双字,并通过虚拟内存位置的boot程序更新此配置。该内存位置不是物理地址,但可以根据协议使用常规的BootLoader读写操作。该存储位置包含4个字节,分别为如下表所述:
* n8 Z9 C5 m* y* ?7 G
6 }- ]' {8 o) c, F3 A5 j5 X5 {5 D1 _5 U  w) F  |" P
67.6 总结

9 b% ~9 `9 b8 X" g- P本章节就为大家讲解这么多,更新相关的知识看ST的应用笔记AN2606。8 P0 b0 _- I( G1 c$ }: x

: Y9 k  l$ |$ N9 P) W" k4 K7 k5 J5 q% g
* y& E1 G- i$ F2 b3 i
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png
收藏 评论0 发布时间:2021-12-18 17:42

举报

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