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

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

[复制链接]
STMCU小助手 发布时间:2021-11-2 23:44
67.1 初学者重要提示
6 ^- b% P! ~: a3 Q! l0 W  本章主要为大家介绍系统bootloader的理论知识,下个章节为大家实战。/ n; P7 s# x1 m' I$ }- ~% F; D2 d
# I  m" `- |$ R1 _( M. |( T
67.2 系统bootLoader基础知识, U( H  v1 W6 E0 u" p7 m
STM32的系统存储区自带bootloader,此程序是ST在芯片出厂时烧录进去的,主要用于将用户应用程序下载到芯片内部Flash。支持USB,SPI,I2C,CAN,UART等接口方式下载。如果大家的应用程序打算采用这种接口方式进行升级,可以考虑采用系统bootloader,简单易用,无需用户自己写bootLoader了。! z0 W! \$ {( q: ^

# I. [; D9 B  |. D3 O# c2 J更重要的是,使用系统BootLoader可以不依赖硬件boot引脚,可以直接从应用程序跳转到系统BootLoader,这样灵活性就很大了。! M/ E, ^- u8 X) T5 u( `
0 v3 ^( ]% l7 R3 t% j
67.2.1 系统bootLoader执行流程; C: k, h! k; _7 Q' [" N
下面是STM32H7的BootLoader程序执行流程,简单了解下即可:
$ T2 q. R/ a  g9 ?3 B: m
/ i$ M3 K* {8 @$ p) ^
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png

! a) U$ e7 `/ X$ f- f  J* q- {关于这个执行流程,要特别注意一点:如果在进入系统BootLoader前就插入了USB线,会导致进入系统BootLoader后优先执行USB DFU,其它的接口方式将没有机会执行。9 T* k$ s( T) T9 t6 H

: I' C- U; N# T: R% x% g67.2.2 系统bootLoader使用的引脚
5 A* d; Q3 c: @7 {8 G3 rSTM32H7的Bootloader使用到的引脚分配如下:" C: s1 b, v! T) D) |  f8 _0 o
& Z1 E% ~( k/ t+ p$ {3 D
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png
* L7 W) |- o& r7 T8 ~/ J
67.3 进入系统bootLoader的方法
5 K+ [3 |3 ?: a: \4 K' X8 x5 ~STM32进入系统BootLoader主要有两种方法,一种是设置boot引脚,另一种是应用程序直接跳转到系统BootLoader。# ^" x# H3 W" t% D& P  H+ Z

) f4 k2 Q+ T( T: V" g* f- s* K67.3.1 设置硬件boot引脚进入系统bootLoader$ Z# k8 m, H1 D# |, a' l
H7的启动方式比较更灵活,只需一个boot引脚。但是一个引脚只能区分出两个状态,为了解决这个问题,H7专门配套了两个option bytes选项字节配置,如此以来就可以方便设置各种存储器地址了。
9 o, K. S. ^+ c. `% `6 l, |
" D0 i# A& x- ~, t8 X: M
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png
( X" o" Y! m% B" O
BOOT_ADD0和BOOT_ADD1对应32位地址到高16位,这点要特别注意。通过这两个选项字节,所有0x0000 0000到0x3FFF 0000的存储器地址都可以设置,包括:
/ S5 Y' c# N7 O4 q2 G2 w: E) M! r2 B: q9 v; e3 t
  所有Flash地址空间。
5 r. }7 u1 F: V  所有RAM地址空间,ITCM,DTCM和SRAM。% z' [' p; ^  X0 n& s9 i& t
设置了选项字节后,掉电不会丢失,下次上电或者复位后,会根据BOOT引脚状态从BOOT_ADD0,或BOOT_ADD1所设置的地址进行启动。也就是说是,H7可以从0x0000 0000到0x3FFF 0000所有地址进行启动,这点与F4完全不同,F4系列是固定从0x0000 0000启动的。
, G" b5 }/ A- w# i1 N' X: _: [( ^! ]" C
STM32H7的boot引脚设计:
7 e$ \' v8 U: ?9 h1 [$ q. K4 i, V5 j2 Q
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png

* \; i2 A- J2 M4 I9 r" ]使用BOOT功能,注意以下几个问题:
: H5 c8 v2 J4 j6 m( D5 K% t' U2 |. p4 A( X: z3 c
  如果用户不慎,设置的地址范围不在有效的存储器地址,那么BOOT = 0时,会从Flash首地址0x0800 0000启动,BOOT = 1时,会从ITCM首地址0x0000 0000启动。
. y( m1 ~* T' s! V  如果用户使能了Flash Level 2保护,那么只能从Flash地址空间进行启动。: Q4 C0 d& P8 ^, ~, J3 U3 }; H
67.3.2 用户应用程序跳转到系统bootLoader
  ^) |+ q! r" I; A7 m除了使用boot引脚控制运行系统BootLoader,也可以上电后跳转,跳转前注意以下问题:
) I& v- {2 S. s5 R8 h6 b
  n) d6 P) l9 m0 B0 }  禁止所有外设时钟。
& c/ R3 r8 ], q6 c3 k4 R/ N  禁止使用的PLL。
0 N$ h, H6 D  m/ R, F8 N  禁止所有中断。
# X5 @4 X& P# N+ M8 k" V  清除所有中断挂起标志。
8 Q+ Z8 e* \  y. I+ C  如果使用Go命令,对于BootLoader中使用的硬件外设寄存器,跳转前是不会设置到复位值的,如果用户代码中恰好也用到这些寄存器,需要重新配置。这里要特别注意的是BootLoader会用到看门狗,并且喂狗时间设为最长了,如果用户代码里面要用到看门狗请根据需要重新配置,并且看门狗一旦开启是无法关闭的。
- ]0 u# t# i( A+ b$ _; f1 p  对于具有双bank特性的STM32,为了能够从用户代码跳转到系统boot,需要将系统boot代码区使用寄存器SYSCFG重映射到0x0000 0000(除了F7和H7系列)。对于STM32F7系列,需要禁止nDBOOT / nDBANK 特性,然后跳转到系统boot区。% W. U+ W6 s6 o
  如果用到系统bootloader的DFU/CAN接口,需要用到HSE时钟,这个时钟的频率是通过内部HSI/MSI检测出具体频率。因此,由于外部温度等各种情况,内部HSI的精度会受到影响,从而影响检测出来的HSE时钟有较大误差,最终导致DFU/CAN运行失败。7 @# B" k" z( f/ |! k

/ d% Z9 W" f# C6 W: f具体实现会在下一章节为大家讲解。
5 o/ Z: k9 R; U( W" Y: L. Y' o' k9 m' F3 w. e7 K" F/ v
67.4 退出系统bootLoader的方法
3 `& i6 j% N7 P# I  t当前主要研究了USB DFU和串口IAP退出bootLoader。
  W- {; B) Z# g- \9 ~! A/ y. `( `' P& y$ ~- x
  USB DFU; a5 X& H; F- T0 [
当芯片工作在系统bootLoader的USB DFU模式,更新完毕程序后,不会自动退出USB DFU,需要重新复位芯片后才会退出。由于DFU模式会用到USB线,插拔USB线是难以避免的,所以是否支持自动退出,并不影响。' j: @6 T$ N6 c  L1 A. n, C' S/ M
' B. s1 B. v9 o  ~
  串口IAP+ ^3 t; g/ B* P/ Q* A1 n& c3 H- ]
当芯片工作在系统bootLoader的串口升级模式,更新完毕程序后,可以自动退出。所以基于串口的组网设备,使用系统bootloader非常方便。
& ]3 e6 i8 `& m4 S5 m/ s8 |& {$ `& @! o# f% h# D
67.5 系统bootLoader的擦写管理; t8 `5 \2 }0 d; g. V
注:这部分知识点有个了解即可。
( Q) X% G; {$ A7 T4 O2 [
. ?+ V* r: l) S. u# R9 _) F使用bootloader命令进行的所有写操作都只能字对齐(地址应该是4的倍数)。要写入的数据数量也必须是4的倍数(接受未对齐的半页写地址)。
5 \/ M/ `1 Q" J& b: ?  t4 u( \  有些产品不支持批量擦除操作。使用BootLoader进行批量擦除时,有两种方法可用:
3 [6 _7 v0 Y: A: o  使用扇区擦除命令一个一个删除。
& D6 a0 o* |3 ]: p6 G5 z  将保护级别设置为1,然后设置为0(使用读保护命令,然后使用读非保护命令),将导致大批量擦除操作。
/ S' D" i- S8 E) P3 D' Z( |, c  STM32 L1和L0系列的Bootloader除了支持操作内部Flash,内部SRAM,可选字节等,还支持操作Data Memeory(数据存储区,貌似是指的EEPROM)。数据存储区支持读写操作,而不支持擦除命令,如果要擦除,写0即可。另外对此存储区的写操作必须是4字节对齐(写地址),并且写入的数据也是4的倍数。; J1 {3 e' Z/ e  T  w2 b! g, u
  F2, F4, F7 和 L4除了支持操作内部Flash,内部SRAM,可选字节等,还支持操作OTP存储区。仅支持读写操作,不支持擦除命令。1 }- ^& h4 I7 x1 p9 u
  F2, F4 和 F7系列的内部Flash写格式依赖于供电电压范围,默认的写操作只支持字节(半字,字和双字是不支持的),为了增加写操作速度,用户施加足够的电压范围以允许写操作按半字,字或双字,并通过虚拟内存位置的boot程序更新此配置。该内存位置不是物理地址,但可以根据协议使用常规的BootLoader读写操作。该存储位置包含4个字节,分别为如下表所述:
; g! C! X# x  w: \- S$ c/ i* q4 Q) F( F  x6 y1 a4 r* U
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png

( m9 k* h5 V0 H4 s67.6 总结
5 L" Z4 j9 I, y) |8 \" X8 {本章节就为大家讲解这么多,更新相关的知识看ST的应用笔记AN2606。
6 m, Z8 ^5 W) j9 Y. n$ y: N3 P9 q2 S: d& U1 \6 q

- g6 A9 r" ?% j1 C! F* r, _/ ^% ]* j+ t1 W' ~

8 P5 C, n2 r5 ^2 I
收藏 1 评论0 发布时间:2021-11-2 23:44

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版