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

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

[复制链接]
STMCU小助手 发布时间:2021-11-2 23:44
67.1 初学者重要提示
& _9 O1 {; q3 O: z  本章主要为大家介绍系统bootloader的理论知识,下个章节为大家实战。6 h& b4 r/ X8 Z8 J* b7 p
- V) p9 \& X" c. l
67.2 系统bootLoader基础知识$ L, T$ k, k4 T% S! c
STM32的系统存储区自带bootloader,此程序是ST在芯片出厂时烧录进去的,主要用于将用户应用程序下载到芯片内部Flash。支持USB,SPI,I2C,CAN,UART等接口方式下载。如果大家的应用程序打算采用这种接口方式进行升级,可以考虑采用系统bootloader,简单易用,无需用户自己写bootLoader了。5 B; Q  v% L$ v% U/ i! W! L
- q& @: T3 @8 @
更重要的是,使用系统BootLoader可以不依赖硬件boot引脚,可以直接从应用程序跳转到系统BootLoader,这样灵活性就很大了。
! q3 p! y* G! \2 V
1 [4 @. ^9 H8 Y8 \; I67.2.1 系统bootLoader执行流程
: M# P3 v) v' ~8 u3 J6 r下面是STM32H7的BootLoader程序执行流程,简单了解下即可:! u0 G# m9 s; a. e' E2 S

# \* ~! Y6 L+ n" i3 l
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png

# l1 k# i7 [6 i关于这个执行流程,要特别注意一点:如果在进入系统BootLoader前就插入了USB线,会导致进入系统BootLoader后优先执行USB DFU,其它的接口方式将没有机会执行。
( z4 z! y" _7 h$ \' l3 @* h
0 S- p* A3 `; }5 v( K67.2.2 系统bootLoader使用的引脚' E# O! l, d7 z- n0 S9 H7 V
STM32H7的Bootloader使用到的引脚分配如下:8 M9 O( }. g4 B# O* \

: n6 W. e( T# y+ M; H) ]. l' Q
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png
! w, }8 T' e/ `' q, p% |
67.3 进入系统bootLoader的方法
" S1 @( p! M9 c8 i: U' hSTM32进入系统BootLoader主要有两种方法,一种是设置boot引脚,另一种是应用程序直接跳转到系统BootLoader。6 u4 h( v5 P  o# i
( g/ O6 P1 d/ j6 e0 l0 t" Z7 o
67.3.1 设置硬件boot引脚进入系统bootLoader9 y+ L# O# a# w4 A5 F  l
H7的启动方式比较更灵活,只需一个boot引脚。但是一个引脚只能区分出两个状态,为了解决这个问题,H7专门配套了两个option bytes选项字节配置,如此以来就可以方便设置各种存储器地址了。- M5 R4 k6 g- e

! y- s, ]; N2 A0 s8 P9 x
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png

$ R8 H. @: _$ X% ~# c/ QBOOT_ADD0和BOOT_ADD1对应32位地址到高16位,这点要特别注意。通过这两个选项字节,所有0x0000 0000到0x3FFF 0000的存储器地址都可以设置,包括:( T+ m* q. Y9 `8 G; q

3 A/ R5 B+ a# ?4 W  所有Flash地址空间。0 m+ R9 ], |1 Q+ c
  所有RAM地址空间,ITCM,DTCM和SRAM。) S  ]- h9 S, B
设置了选项字节后,掉电不会丢失,下次上电或者复位后,会根据BOOT引脚状态从BOOT_ADD0,或BOOT_ADD1所设置的地址进行启动。也就是说是,H7可以从0x0000 0000到0x3FFF 0000所有地址进行启动,这点与F4完全不同,F4系列是固定从0x0000 0000启动的。' q" D0 r: _5 c# I  k7 r7 [1 B7 n

0 [' X; }7 M; R5 c/ }STM32H7的boot引脚设计:' L: p$ H* I5 w3 k1 E
3 o3 N: ]( @2 f
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png

+ p  R% A# J6 A* Z% r& g( \使用BOOT功能,注意以下几个问题:
5 E+ Z. g8 K6 v5 c- t/ m% R% W, H
  如果用户不慎,设置的地址范围不在有效的存储器地址,那么BOOT = 0时,会从Flash首地址0x0800 0000启动,BOOT = 1时,会从ITCM首地址0x0000 0000启动。, a5 m4 u8 t) U$ L, x
  如果用户使能了Flash Level 2保护,那么只能从Flash地址空间进行启动。
8 O( H! u3 ~/ N- Z+ o) f67.3.2 用户应用程序跳转到系统bootLoader+ g. O. F& Z" Q+ s/ O
除了使用boot引脚控制运行系统BootLoader,也可以上电后跳转,跳转前注意以下问题:
6 b7 ?& ~# Z( I/ D' J! `; w! u( e' @2 p0 M
  禁止所有外设时钟。
: c( \, p8 Y8 j8 a- j1 D  禁止使用的PLL。5 f4 R$ o8 |$ \% F+ g7 `7 J( h
  禁止所有中断。
% [3 e. k4 \4 {, O' T4 r. F  清除所有中断挂起标志。
1 i* R6 ^6 C/ n! ^, A  如果使用Go命令,对于BootLoader中使用的硬件外设寄存器,跳转前是不会设置到复位值的,如果用户代码中恰好也用到这些寄存器,需要重新配置。这里要特别注意的是BootLoader会用到看门狗,并且喂狗时间设为最长了,如果用户代码里面要用到看门狗请根据需要重新配置,并且看门狗一旦开启是无法关闭的。
0 i: D$ B# }+ C5 h9 e3 Q0 O  对于具有双bank特性的STM32,为了能够从用户代码跳转到系统boot,需要将系统boot代码区使用寄存器SYSCFG重映射到0x0000 0000(除了F7和H7系列)。对于STM32F7系列,需要禁止nDBOOT / nDBANK 特性,然后跳转到系统boot区。5 P* d# w' v1 p  F
  如果用到系统bootloader的DFU/CAN接口,需要用到HSE时钟,这个时钟的频率是通过内部HSI/MSI检测出具体频率。因此,由于外部温度等各种情况,内部HSI的精度会受到影响,从而影响检测出来的HSE时钟有较大误差,最终导致DFU/CAN运行失败。" L+ G* Q/ P' g% Z: u4 B2 V# z! j

: `& a( Q6 t& [, s( e0 N8 @具体实现会在下一章节为大家讲解。
* y1 S% }1 W+ g/ i6 U4 l/ Y
: _- F3 n9 f( E: q  S. m67.4 退出系统bootLoader的方法4 |) E, E5 x, _: w3 j- I' |
当前主要研究了USB DFU和串口IAP退出bootLoader。
0 k- f( z) k# J* `9 u4 p2 [
& S$ j+ d) q1 \0 x0 g3 Y  USB DFU
4 H* X9 A! E( A( ~# T( C& _7 w当芯片工作在系统bootLoader的USB DFU模式,更新完毕程序后,不会自动退出USB DFU,需要重新复位芯片后才会退出。由于DFU模式会用到USB线,插拔USB线是难以避免的,所以是否支持自动退出,并不影响。6 o, s: I4 v' @7 A; x

& {- d7 J" _/ D9 |6 q  串口IAP, a; w. T; k& d# n- w2 Q5 H9 H- X
当芯片工作在系统bootLoader的串口升级模式,更新完毕程序后,可以自动退出。所以基于串口的组网设备,使用系统bootloader非常方便。
, k$ t. X5 l& `! ^) W' ~2 \- j5 c* r# w& F* P: [" Y  q
67.5 系统bootLoader的擦写管理) x& [: E: i& o# T( x+ B
注:这部分知识点有个了解即可。5 o. z, y* t. E( j0 i
) t6 d) J+ z$ R7 y4 V) d" _
使用bootloader命令进行的所有写操作都只能字对齐(地址应该是4的倍数)。要写入的数据数量也必须是4的倍数(接受未对齐的半页写地址)。. O* _/ \2 F: |+ }, v# V$ n
  有些产品不支持批量擦除操作。使用BootLoader进行批量擦除时,有两种方法可用:! Q& s; C5 s5 s- E& _7 b
  使用扇区擦除命令一个一个删除。
2 L8 j( P8 [" d0 j3 d  将保护级别设置为1,然后设置为0(使用读保护命令,然后使用读非保护命令),将导致大批量擦除操作。
" n- T+ i( B1 J9 n0 S9 P7 w  STM32 L1和L0系列的Bootloader除了支持操作内部Flash,内部SRAM,可选字节等,还支持操作Data Memeory(数据存储区,貌似是指的EEPROM)。数据存储区支持读写操作,而不支持擦除命令,如果要擦除,写0即可。另外对此存储区的写操作必须是4字节对齐(写地址),并且写入的数据也是4的倍数。% o- ?" _) @* f
  F2, F4, F7 和 L4除了支持操作内部Flash,内部SRAM,可选字节等,还支持操作OTP存储区。仅支持读写操作,不支持擦除命令。" d' K) ]0 p2 x- ^" {1 M
  F2, F4 和 F7系列的内部Flash写格式依赖于供电电压范围,默认的写操作只支持字节(半字,字和双字是不支持的),为了增加写操作速度,用户施加足够的电压范围以允许写操作按半字,字或双字,并通过虚拟内存位置的boot程序更新此配置。该内存位置不是物理地址,但可以根据协议使用常规的BootLoader读写操作。该存储位置包含4个字节,分别为如下表所述:
$ @0 K. t- |# C1 B' l+ ?2 r! c) L, i$ l% k& y* n; s+ m1 _
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png

2 b% P. T9 {$ }9 W- x& m67.6 总结
9 T3 j; V8 }# B9 ?8 @5 c2 a; U' F本章节就为大家讲解这么多,更新相关的知识看ST的应用笔记AN2606。" G' X" l/ p; _- Z3 P# C: Z
# r! r9 Q, D+ L' H8 N0 j9 B. a
6 j% s1 S$ r/ o8 L: @
8 G* q& P$ v- {3 S3 N$ }

& \* i1 O+ W2 S* U, @8 d
收藏 1 评论0 发布时间:2021-11-2 23:44

举报

0个回答

所属标签

相似分享

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