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

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

[复制链接]
STMCU小助手 发布时间:2021-11-2 23:44
67.1 初学者重要提示1 h: y  Q- L2 S% ~: e' V, J# f' n
  本章主要为大家介绍系统bootloader的理论知识,下个章节为大家实战。
' C& [6 q( X: J6 N- J ; U! n0 ]! A7 G4 M9 A& o
67.2 系统bootLoader基础知识+ {2 y1 q4 j9 _/ v) a- r/ H6 c! {
STM32的系统存储区自带bootloader,此程序是ST在芯片出厂时烧录进去的,主要用于将用户应用程序下载到芯片内部Flash。支持USB,SPI,I2C,CAN,UART等接口方式下载。如果大家的应用程序打算采用这种接口方式进行升级,可以考虑采用系统bootloader,简单易用,无需用户自己写bootLoader了。; L- J1 C5 m; o# ?! `

% j9 U' q: X& e$ f更重要的是,使用系统BootLoader可以不依赖硬件boot引脚,可以直接从应用程序跳转到系统BootLoader,这样灵活性就很大了。# c, K* K3 }3 ^  `  U$ x% n3 P5 N1 P
  P5 V4 i! x1 A
67.2.1 系统bootLoader执行流程
3 |8 D( d% d; T9 d下面是STM32H7的BootLoader程序执行流程,简单了解下即可:2 J# Y/ s4 B. U5 C% G

; r- q; s& u) M* O
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png
* n. o* Q. j. }2 D  o/ k" b9 J5 p! W
关于这个执行流程,要特别注意一点:如果在进入系统BootLoader前就插入了USB线,会导致进入系统BootLoader后优先执行USB DFU,其它的接口方式将没有机会执行。4 f# m( h) B* Z: V8 X$ y
9 I! v# M3 {6 v1 E
67.2.2 系统bootLoader使用的引脚) Q. C! a8 q% L- m2 v
STM32H7的Bootloader使用到的引脚分配如下:3 ]. a3 Q3 R( h: x0 e" U

! G( S: B) P, d$ C! U- R1 ^9 Z
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png
# n7 Z( j3 N4 S* |: m! d
67.3 进入系统bootLoader的方法, W( w) T  H* q7 W
STM32进入系统BootLoader主要有两种方法,一种是设置boot引脚,另一种是应用程序直接跳转到系统BootLoader。( q- Z4 Q5 H7 i; z  v

9 w' I6 @3 Y; d67.3.1 设置硬件boot引脚进入系统bootLoader, u, d' E& s7 T% |
H7的启动方式比较更灵活,只需一个boot引脚。但是一个引脚只能区分出两个状态,为了解决这个问题,H7专门配套了两个option bytes选项字节配置,如此以来就可以方便设置各种存储器地址了。
# [4 R7 \2 D0 n$ f
; u2 `& B( J8 l( C" G
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png

7 X+ h7 F, `3 t3 c5 O8 t$ hBOOT_ADD0和BOOT_ADD1对应32位地址到高16位,这点要特别注意。通过这两个选项字节,所有0x0000 0000到0x3FFF 0000的存储器地址都可以设置,包括:8 \' n2 V& {4 ?1 c9 u0 F9 D+ r6 l

7 y4 @( z( R1 p+ z7 c6 I  所有Flash地址空间。
/ N' i- V' A8 j% y' d3 I" J5 D0 \. t  所有RAM地址空间,ITCM,DTCM和SRAM。$ Z& N  A6 m5 x" v( B
设置了选项字节后,掉电不会丢失,下次上电或者复位后,会根据BOOT引脚状态从BOOT_ADD0,或BOOT_ADD1所设置的地址进行启动。也就是说是,H7可以从0x0000 0000到0x3FFF 0000所有地址进行启动,这点与F4完全不同,F4系列是固定从0x0000 0000启动的。
, z# V0 H( E# o  Q( Q8 D- b+ z( h
STM32H7的boot引脚设计:" r, K1 y3 w: @/ Z1 ~" `9 B  ^: w
8 U$ g/ X5 Z3 ^8 ?
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png

& o& Z- P% M* ]1 X0 c. l. l使用BOOT功能,注意以下几个问题:
  v1 [. m6 f/ W$ J9 e7 d8 k* R) v; F7 m$ N
  如果用户不慎,设置的地址范围不在有效的存储器地址,那么BOOT = 0时,会从Flash首地址0x0800 0000启动,BOOT = 1时,会从ITCM首地址0x0000 0000启动。6 R) A8 A. _5 e6 P! `- p2 g- o
  如果用户使能了Flash Level 2保护,那么只能从Flash地址空间进行启动。
1 C/ t0 S0 N( s$ n67.3.2 用户应用程序跳转到系统bootLoader7 i: Q) P2 w; O9 t/ S
除了使用boot引脚控制运行系统BootLoader,也可以上电后跳转,跳转前注意以下问题:9 }1 F0 A) H( `! C, r8 {- D

1 k6 K5 {8 z9 y" i4 J  m( z' ?  禁止所有外设时钟。$ _+ D$ v! R; o1 H' z
  禁止使用的PLL。
" U* B4 n0 d) @  禁止所有中断。
. w3 s8 J: p6 Q  清除所有中断挂起标志。2 [3 V1 e7 j9 J- L6 Z. D8 K
  如果使用Go命令,对于BootLoader中使用的硬件外设寄存器,跳转前是不会设置到复位值的,如果用户代码中恰好也用到这些寄存器,需要重新配置。这里要特别注意的是BootLoader会用到看门狗,并且喂狗时间设为最长了,如果用户代码里面要用到看门狗请根据需要重新配置,并且看门狗一旦开启是无法关闭的。9 A. z$ x: O7 V+ N& l8 y) [% n
  对于具有双bank特性的STM32,为了能够从用户代码跳转到系统boot,需要将系统boot代码区使用寄存器SYSCFG重映射到0x0000 0000(除了F7和H7系列)。对于STM32F7系列,需要禁止nDBOOT / nDBANK 特性,然后跳转到系统boot区。
+ p3 U* Z+ r8 z/ t4 D+ ^) N  如果用到系统bootloader的DFU/CAN接口,需要用到HSE时钟,这个时钟的频率是通过内部HSI/MSI检测出具体频率。因此,由于外部温度等各种情况,内部HSI的精度会受到影响,从而影响检测出来的HSE时钟有较大误差,最终导致DFU/CAN运行失败。
) G* ]  F  w" o1 v) q5 \. I# G8 U/ u& {0 `# [: g( {  Z
具体实现会在下一章节为大家讲解。
2 n/ g; Y3 a2 Z5 O/ @5 |
6 ?& g2 N' b& B67.4 退出系统bootLoader的方法9 |. ?- Z: a2 V1 C7 U# b5 f
当前主要研究了USB DFU和串口IAP退出bootLoader。
4 w( U3 ?! p" e8 |3 n9 \, |7 r  N2 s/ V  d8 ^" X
  USB DFU
3 a6 N0 N! B, q4 a4 ]当芯片工作在系统bootLoader的USB DFU模式,更新完毕程序后,不会自动退出USB DFU,需要重新复位芯片后才会退出。由于DFU模式会用到USB线,插拔USB线是难以避免的,所以是否支持自动退出,并不影响。- W$ U5 n; R* W. ^/ z

& t: m2 [4 O) s& q: A6 Z( X! J  串口IAP
3 S# v; K2 J0 A' w# [- l) Z, e9 z, e当芯片工作在系统bootLoader的串口升级模式,更新完毕程序后,可以自动退出。所以基于串口的组网设备,使用系统bootloader非常方便。
/ B7 k$ K& r, m0 b9 Q9 {  _; s+ d) j% m# t, v' g" \
67.5 系统bootLoader的擦写管理) y% r) t" G4 Q5 F- ]5 \/ ]( m9 `8 ^
注:这部分知识点有个了解即可。
/ N  I9 a! r7 o2 i6 Y$ O9 D
+ b( k) \6 Y$ r/ m( U使用bootloader命令进行的所有写操作都只能字对齐(地址应该是4的倍数)。要写入的数据数量也必须是4的倍数(接受未对齐的半页写地址)。
: P' [% m5 q6 o& e, |) c1 x1 F  有些产品不支持批量擦除操作。使用BootLoader进行批量擦除时,有两种方法可用:- w4 O2 C. L( s% e& k/ ~5 V
  使用扇区擦除命令一个一个删除。7 l" n; `4 |/ e: [- W% N: r
  将保护级别设置为1,然后设置为0(使用读保护命令,然后使用读非保护命令),将导致大批量擦除操作。( q: b, J3 Y, t8 P6 D* k1 m/ @
  STM32 L1和L0系列的Bootloader除了支持操作内部Flash,内部SRAM,可选字节等,还支持操作Data Memeory(数据存储区,貌似是指的EEPROM)。数据存储区支持读写操作,而不支持擦除命令,如果要擦除,写0即可。另外对此存储区的写操作必须是4字节对齐(写地址),并且写入的数据也是4的倍数。+ t/ z, d" w/ \$ l" q
  F2, F4, F7 和 L4除了支持操作内部Flash,内部SRAM,可选字节等,还支持操作OTP存储区。仅支持读写操作,不支持擦除命令。
; r* H5 `0 Z( G% C6 J5 _* G$ a  F2, F4 和 F7系列的内部Flash写格式依赖于供电电压范围,默认的写操作只支持字节(半字,字和双字是不支持的),为了增加写操作速度,用户施加足够的电压范围以允许写操作按半字,字或双字,并通过虚拟内存位置的boot程序更新此配置。该内存位置不是物理地址,但可以根据协议使用常规的BootLoader读写操作。该存储位置包含4个字节,分别为如下表所述:
& P9 j2 t8 M$ {# `( C1 T% b; }% G. @5 M
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png
, w5 ^& E( i4 A1 C8 P
67.6 总结5 ]/ d9 \+ v& U4 e1 H# F% ]6 V# s; y
本章节就为大家讲解这么多,更新相关的知识看ST的应用笔记AN2606。( A" W' P+ \" Z2 m0 D( U) ^  Q, R
* u: ^( v% j8 C; P2 ~
2 S2 h$ c* L' ?0 j4 ?
& y7 t6 C$ S0 R0 v8 _* C

  e* j8 T2 x4 A8 L& l3 E: \
收藏 1 评论0 发布时间:2021-11-2 23:44

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版