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

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

[复制链接]
STMCU小助手 发布时间:2021-11-2 23:44
67.1 初学者重要提示
5 R4 S& J5 [- }  a" L% Y; r; t6 G; g1 N  本章主要为大家介绍系统bootloader的理论知识,下个章节为大家实战。3 O4 [& {1 K4 g
# c0 Y1 d- a' ^" ]1 D
67.2 系统bootLoader基础知识: H# i+ B& J& z4 `3 ^
STM32的系统存储区自带bootloader,此程序是ST在芯片出厂时烧录进去的,主要用于将用户应用程序下载到芯片内部Flash。支持USB,SPI,I2C,CAN,UART等接口方式下载。如果大家的应用程序打算采用这种接口方式进行升级,可以考虑采用系统bootloader,简单易用,无需用户自己写bootLoader了。
' E% G/ o4 h4 q3 L  ~+ k0 o" D3 {" M- {& A; t, x# P
更重要的是,使用系统BootLoader可以不依赖硬件boot引脚,可以直接从应用程序跳转到系统BootLoader,这样灵活性就很大了。
( ?4 i- R8 {8 z, ]0 T/ _& Y6 U( r$ \; u- ?9 `% Q5 d, E8 q
67.2.1 系统bootLoader执行流程% L% h; U; a" Z! W% _2 Q/ _
下面是STM32H7的BootLoader程序执行流程,简单了解下即可:
1 [5 t; \/ F4 H% j8 \. s1 q
3 H& X* D. h; b
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png

' Z! z" S4 ]' N3 I关于这个执行流程,要特别注意一点:如果在进入系统BootLoader前就插入了USB线,会导致进入系统BootLoader后优先执行USB DFU,其它的接口方式将没有机会执行。
9 `) W' z$ v- H- o% `9 u
; D! H, J0 r$ ]! K3 a- m67.2.2 系统bootLoader使用的引脚
. _8 Q" H) F0 FSTM32H7的Bootloader使用到的引脚分配如下:
$ n: j3 U8 v5 {$ c7 k
; o& f  j4 [3 h1 a" I
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png
. O, q0 r( P- F3 z/ u" u
67.3 进入系统bootLoader的方法- ~! ^  N0 U! a' D2 x8 I4 ~
STM32进入系统BootLoader主要有两种方法,一种是设置boot引脚,另一种是应用程序直接跳转到系统BootLoader。- H0 S$ f9 ^0 ?2 o

. ^* w: }+ |6 _2 y; _8 ?3 o% r/ |67.3.1 设置硬件boot引脚进入系统bootLoader
2 l5 N/ m* D. l" z' g0 Y5 {' mH7的启动方式比较更灵活,只需一个boot引脚。但是一个引脚只能区分出两个状态,为了解决这个问题,H7专门配套了两个option bytes选项字节配置,如此以来就可以方便设置各种存储器地址了。  B( [, f8 Q' H7 o( d, w

& ?0 m9 R- ~' M2 P( I3 J4 U% A
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png

+ c5 q6 Q; p2 ]; W3 QBOOT_ADD0和BOOT_ADD1对应32位地址到高16位,这点要特别注意。通过这两个选项字节,所有0x0000 0000到0x3FFF 0000的存储器地址都可以设置,包括:0 v0 V; D, b! ]0 z$ b" |
9 I+ n6 p) S# A. C+ ^: {) \
  所有Flash地址空间。
- [) x# F6 ~) p0 K: N7 e  所有RAM地址空间,ITCM,DTCM和SRAM。' E8 G3 [; c4 N% N5 \
设置了选项字节后,掉电不会丢失,下次上电或者复位后,会根据BOOT引脚状态从BOOT_ADD0,或BOOT_ADD1所设置的地址进行启动。也就是说是,H7可以从0x0000 0000到0x3FFF 0000所有地址进行启动,这点与F4完全不同,F4系列是固定从0x0000 0000启动的。
3 @9 j( j9 D) p$ F  D7 C' a' i/ X( c1 n
STM32H7的boot引脚设计:( e# M7 J9 U0 V; [
" ]( |) ?: }1 I7 v1 ?1 l
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png
! k) R& D* n- D% J; V3 [8 B9 }
使用BOOT功能,注意以下几个问题:
. e. s8 q" n* v/ j
! c$ y, X* a/ R# \7 R  如果用户不慎,设置的地址范围不在有效的存储器地址,那么BOOT = 0时,会从Flash首地址0x0800 0000启动,BOOT = 1时,会从ITCM首地址0x0000 0000启动。1 L# t% q0 S9 g( F+ j: f, P
  如果用户使能了Flash Level 2保护,那么只能从Flash地址空间进行启动。4 ?3 q$ c" c3 {0 z2 S9 F6 N
67.3.2 用户应用程序跳转到系统bootLoader
$ Y& J" Z7 U6 G* R# }! X) v除了使用boot引脚控制运行系统BootLoader,也可以上电后跳转,跳转前注意以下问题:8 y! r7 b7 S: |

: C* h- h% \" k. [+ L, G1 d/ }( x2 @  禁止所有外设时钟。; @8 s5 Y; T! e% a7 Q; s
  禁止使用的PLL。
, f. u/ h' h! l/ |& {  禁止所有中断。
) o% S5 P' S9 @+ m  清除所有中断挂起标志。
) l6 o' O' @& f9 O/ L  如果使用Go命令,对于BootLoader中使用的硬件外设寄存器,跳转前是不会设置到复位值的,如果用户代码中恰好也用到这些寄存器,需要重新配置。这里要特别注意的是BootLoader会用到看门狗,并且喂狗时间设为最长了,如果用户代码里面要用到看门狗请根据需要重新配置,并且看门狗一旦开启是无法关闭的。+ b1 O0 r  U# {/ X; N9 X- [9 \
  对于具有双bank特性的STM32,为了能够从用户代码跳转到系统boot,需要将系统boot代码区使用寄存器SYSCFG重映射到0x0000 0000(除了F7和H7系列)。对于STM32F7系列,需要禁止nDBOOT / nDBANK 特性,然后跳转到系统boot区。! q, w: I8 e9 ?3 k5 q% J, {9 H
  如果用到系统bootloader的DFU/CAN接口,需要用到HSE时钟,这个时钟的频率是通过内部HSI/MSI检测出具体频率。因此,由于外部温度等各种情况,内部HSI的精度会受到影响,从而影响检测出来的HSE时钟有较大误差,最终导致DFU/CAN运行失败。
5 G; h8 `; Q3 e* C* ^! `& h) w4 [- G4 @2 w+ i' C+ Y& U
具体实现会在下一章节为大家讲解。
! }6 k$ z9 z2 B1 `; m0 t# X5 v0 F' C! V5 J. t" v
67.4 退出系统bootLoader的方法
+ E) p! d% x: L; [! V# S) A当前主要研究了USB DFU和串口IAP退出bootLoader。
  B1 R: I  t& l. ?& F8 b, p3 P5 ]6 {* P! R! L& o$ `
  USB DFU# S5 f* [7 [. p7 Y+ b
当芯片工作在系统bootLoader的USB DFU模式,更新完毕程序后,不会自动退出USB DFU,需要重新复位芯片后才会退出。由于DFU模式会用到USB线,插拔USB线是难以避免的,所以是否支持自动退出,并不影响。2 k& }2 G' x& q9 C( R
$ X" }; d/ _1 r. I3 |
  串口IAP
) k" G) d1 f2 s. y* i) }2 P当芯片工作在系统bootLoader的串口升级模式,更新完毕程序后,可以自动退出。所以基于串口的组网设备,使用系统bootloader非常方便。5 ?- x4 Y9 R- p* ^- v8 i
) E, h4 V# {1 o# g1 Y' f0 [9 k
67.5 系统bootLoader的擦写管理
& j( [$ X! U0 P/ i注:这部分知识点有个了解即可。* U+ x( q4 r5 G8 ]. q5 D
8 F+ Y- z, a% c4 u) X
使用bootloader命令进行的所有写操作都只能字对齐(地址应该是4的倍数)。要写入的数据数量也必须是4的倍数(接受未对齐的半页写地址)。
" l# f$ R2 F3 C* E  有些产品不支持批量擦除操作。使用BootLoader进行批量擦除时,有两种方法可用:
/ k  W  y* R+ g( p  使用扇区擦除命令一个一个删除。
3 y. r6 [6 t9 m: w% [. \6 G6 q  将保护级别设置为1,然后设置为0(使用读保护命令,然后使用读非保护命令),将导致大批量擦除操作。; Y) H% j; ?: @* |
  STM32 L1和L0系列的Bootloader除了支持操作内部Flash,内部SRAM,可选字节等,还支持操作Data Memeory(数据存储区,貌似是指的EEPROM)。数据存储区支持读写操作,而不支持擦除命令,如果要擦除,写0即可。另外对此存储区的写操作必须是4字节对齐(写地址),并且写入的数据也是4的倍数。$ `3 `0 Y8 d. v5 o- [! R  `6 e
  F2, F4, F7 和 L4除了支持操作内部Flash,内部SRAM,可选字节等,还支持操作OTP存储区。仅支持读写操作,不支持擦除命令。0 ~# L* `% e5 ]. N# u$ w3 V
  F2, F4 和 F7系列的内部Flash写格式依赖于供电电压范围,默认的写操作只支持字节(半字,字和双字是不支持的),为了增加写操作速度,用户施加足够的电压范围以允许写操作按半字,字或双字,并通过虚拟内存位置的boot程序更新此配置。该内存位置不是物理地址,但可以根据协议使用常规的BootLoader读写操作。该存储位置包含4个字节,分别为如下表所述:# ?* D+ j" t2 p
* }7 d  x: l: a2 L3 h
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png
$ `$ I9 E) @$ }$ N
67.6 总结
, y+ C: x& C' [本章节就为大家讲解这么多,更新相关的知识看ST的应用笔记AN2606。
- m+ o6 {7 n( C3 V. p) c/ t3 n2 \9 F* _, |. r) b

' W3 ^* Y1 W7 a: x) ^) h* t' \, h3 \6 S  k
0 A2 K# o6 V3 j& j0 L% b
收藏 1 评论0 发布时间:2021-11-2 23:44

举报

0个回答

所属标签

相似分享

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