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

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

[复制链接]
STMCU小助手 发布时间:2021-12-18 17:42
67.1 初学者重要提示' o8 a4 s+ i. y! m: c0 M" }
  本章主要为大家介绍系统bootloader的理论知识,下个章节为大家实战。
/ V$ B5 _$ E! q9 |: L5 D, Q2 V
! m/ |# E' |- d67.2 系统bootLoader基础知识8 b6 _/ v$ [+ W. Q1 y1 ^* B- f6 \
STM32的系统存储区自带bootloader,此程序是ST在芯片出厂时烧录进去的,主要用于将用户应用程序下载到芯片内部Flash。支持USB,SPI,I2C,CAN,UART等接口方式下载。如果大家的应用程序打算采用这种接口方式进行升级,可以考虑采用系统bootloader,简单易用,无需用户自己写bootLoader了。
( K- y" R: G5 J3 ?0 U$ R% e' n: v0 }" Z9 @' K' O1 v- Y7 E  D
更重要的是,使用系统BootLoader可以不依赖硬件boot引脚,可以直接从应用程序跳转到系统BootLoader,这样灵活性就很大了。
+ i4 Z4 L& s/ K0 f* Z2 R& ]! L' t6 Z- D* y! }  y! b$ T3 F
67.2.1 系统bootLoader执行流程
' p& O$ f2 z- d1 F0 i  I% O下面是STM32H7的BootLoader程序执行流程,简单了解下即可:
( p: [' |0 d- e9 s* B+ P$ f5 R1 }- _3 h: D3 X+ m5 W2 B! D
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png
9 c" m/ c% E# d
; \% u( K' `5 ^, }1 K, d# X. O
关于这个执行流程,要特别注意一点:如果在进入系统BootLoader前就插入了USB线,会导致进入系统BootLoader后优先执行USB DFU,其它的接口方式将没有机会执行。
7 S2 l! A$ _# a! n. B8 I5 r1 o; p' ~
67.2.2 系统bootLoader使用的引脚
+ V2 o7 K% P' d, q3 t
STM32H7的Bootloader使用到的引脚分配如下:  O. \8 O. ^( @6 R

3 E9 p5 h& F' ]+ m+ F, ?' A$ U
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png

& O3 H# W/ K6 \% g9 e/ I- k/ i1 Y# s& t! g, {
67.3 进入系统bootLoader的方法6 ~# {# e* m1 b" a  S4 {" }
STM32进入系统BootLoader主要有两种方法,一种是设置boot引脚,另一种是应用程序直接跳转到系统BootLoader。
0 ^: U9 _! Z  G* D8 T; J# F
+ F2 P$ J! {+ g% }7 X. v4 S67.3.1 设置硬件boot引脚进入系统bootLoader

6 N1 a# p* [# d0 nH7的启动方式比较更灵活,只需一个boot引脚。但是一个引脚只能区分出两个状态,为了解决这个问题,H7专门配套了两个option bytes选项字节配置,如此以来就可以方便设置各种存储器地址了。
, i9 S/ z& G- E. J2 z
# f/ ?2 f# M* I9 }' w, I' ^$ r
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png

2 R7 }: K9 E4 w: {
6 F0 {9 h3 g9 c/ g& OBOOT_ADD0和BOOT_ADD1对应32位地址到高16位,这点要特别注意。通过这两个选项字节,所有0x0000 0000到0x3FFF 0000的存储器地址都可以设置,包括:
5 L" b6 N3 I$ i* W4 X
& j0 f( d: J4 g0 B' K7 |( {  所有Flash地址空间。* f; C, H& y3 W- y3 E4 P
  所有RAM地址空间,ITCM,DTCM和SRAM。: p6 m' I9 v9 C  @' s
设置了选项字节后,掉电不会丢失,下次上电或者复位后,会根据BOOT引脚状态从BOOT_ADD0,或BOOT_ADD1所设置的地址进行启动。也就是说是,H7可以从0x0000 0000到0x3FFF 0000所有地址进行启动,这点与F4完全不同,F4系列是固定从0x0000 0000启动的。* A. j+ [, R) l) n

* T' b) k% q' |. }' [6 O; |STM32H7的boot引脚设计:2 Z7 e2 `& Q1 y  \% b* i
6 p: U0 V0 M. T2 N3 W- L
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png

8 S; d- i; i, U/ Y! y, ~, \# X, K  e& U
使用BOOT功能,注意以下几个问题:8 z2 T  r3 X7 G
& x" x3 e- G& G4 s) r* {! s
  如果用户不慎,设置的地址范围不在有效的存储器地址,那么BOOT = 0时,会从Flash首地址0x0800 0000启动,BOOT = 1时,会从ITCM首地址0x0000 0000启动。
- A' S) d; t8 [$ _. D6 u; B2 r  如果用户使能了Flash Level 2保护,那么只能从Flash地址空间进行启动。
/ y9 x" j! t" ?67.3.2 用户应用程序跳转到系统bootLoader
& F- f: o& j7 W' f! z  M5 W
除了使用boot引脚控制运行系统BootLoader,也可以上电后跳转,跳转前注意以下问题:
/ s" n$ F3 M! y/ w
+ N: m: I8 e4 j! S7 U  禁止所有外设时钟。& F* u+ m6 b: \1 f9 K
  禁止使用的PLL。4 j1 K+ l# M/ V+ q9 T
  禁止所有中断。
6 G5 o. m. b; |% l2 I/ P  清除所有中断挂起标志。
- @# E/ n# z/ a! `* p2 C& g' Q  l  如果使用Go命令,对于BootLoader中使用的硬件外设寄存器,跳转前是不会设置到复位值的,如果用户代码中恰好也用到这些寄存器,需要重新配置。这里要特别注意的是BootLoader会用到看门狗,并且喂狗时间设为最长了,如果用户代码里面要用到看门狗请根据需要重新配置,并且看门狗一旦开启是无法关闭的。( v2 e8 h+ P% C
  对于具有双bank特性的STM32,为了能够从用户代码跳转到系统boot,需要将系统boot代码区使用寄存器SYSCFG重映射到0x0000 0000(除了F7和H7系列)。对于STM32F7系列,需要禁止nDBOOT / nDBANK 特性,然后跳转到系统boot区。
" l' Z* H1 p3 A4 ^# t% s  如果用到系统bootloader的DFU/CAN接口,需要用到HSE时钟,这个时钟的频率是通过内部HSI/MSI检测出具体频率。因此,由于外部温度等各种情况,内部HSI的精度会受到影响,从而影响检测出来的HSE时钟有较大误差,最终导致DFU/CAN运行失败。
9 h+ L  z( ^; \2 C. `( G. X  {2 ~) t
+ R" Y* W1 R& l5 d具体实现会在下一章节为大家讲解。
' l& x% v0 K' Z) l/ G
2 u4 ?* Z2 Q: g8 ]9 |; H8 V& ~* z' f67.4 退出系统bootLoader的方法
6 M9 o9 Q8 x; S! c. }  ^3 x$ u当前主要研究了USB DFU和串口IAP退出bootLoader。: V7 G4 A0 F: F! N
) Q* O* g9 R  c. M0 h; C# A0 }
  USB DFU
' D/ ^7 Z4 {2 ?当芯片工作在系统bootLoader的USB DFU模式,更新完毕程序后,不会自动退出USB DFU,需要重新复位芯片后才会退出。由于DFU模式会用到USB线,插拔USB线是难以避免的,所以是否支持自动退出,并不影响。
+ B+ u# k; K) o; o
! l8 p4 q! L" }& l2 p% a3 H2 ?  串口IAP9 a8 W  \, P/ U
当芯片工作在系统bootLoader的串口升级模式,更新完毕程序后,可以自动退出。所以基于串口的组网设备,使用系统bootloader非常方便。
* E5 t* \* J# ]6 @3 I4 z: w. @. W; v- j7 Z2 E
67.5 系统bootLoader的擦写管理
. _1 Y. {+ N. |* ?! f3 U注:这部分知识点有个了解即可。" G; M. m1 M2 A
& p, @' O; M* L0 d6 ~: A0 e
使用bootloader命令进行的所有写操作都只能字对齐(地址应该是4的倍数)。要写入的数据数量也必须是4的倍数(接受未对齐的半页写地址)。* T- h1 l" j7 F7 D% b" J* m2 [) W2 Z/ U
  有些产品不支持批量擦除操作。使用BootLoader进行批量擦除时,有两种方法可用:! I: i1 z2 F9 l
  使用扇区擦除命令一个一个删除。5 o0 G5 Q/ `7 [5 Y
  将保护级别设置为1,然后设置为0(使用读保护命令,然后使用读非保护命令),将导致大批量擦除操作。
7 G: u& x) K! ]  STM32 L1和L0系列的Bootloader除了支持操作内部Flash,内部SRAM,可选字节等,还支持操作Data Memeory(数据存储区,貌似是指的EEPROM)。数据存储区支持读写操作,而不支持擦除命令,如果要擦除,写0即可。另外对此存储区的写操作必须是4字节对齐(写地址),并且写入的数据也是4的倍数。
- M9 }( K- ^# n  `# s8 E  F2, F4, F7 和 L4除了支持操作内部Flash,内部SRAM,可选字节等,还支持操作OTP存储区。仅支持读写操作,不支持擦除命令。% l$ A7 B( i' D: H
  F2, F4 和 F7系列的内部Flash写格式依赖于供电电压范围,默认的写操作只支持字节(半字,字和双字是不支持的),为了增加写操作速度,用户施加足够的电压范围以允许写操作按半字,字或双字,并通过虚拟内存位置的boot程序更新此配置。该内存位置不是物理地址,但可以根据协议使用常规的BootLoader读写操作。该存储位置包含4个字节,分别为如下表所述:1 d4 s" T+ A! G& P3 N
  N( h" A5 X1 [/ j: B* ~# k3 _

" K5 x9 m9 {& v0 o9 E7 r67.6 总结

8 y$ j  {0 B; f4 V' E# v! Y本章节就为大家讲解这么多,更新相关的知识看ST的应用笔记AN2606。+ R  Y  o! w6 d5 M2 ~* M6 ?4 x

; H; z' |3 c" |% x% j0 V
( u- D" v6 O/ B/ J# a3 D3 R5 m8 U0 Y2 e7 Q& H
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png
赞 收藏 评论0 发布时间:2021-12-18 17:42

举报

0个回答

所属标签

相似技术帖

官网相关资源

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