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

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

[复制链接]
STMCU小助手 发布时间:2021-12-18 17:42
67.1 初学者重要提示
" L  h' q8 M1 p/ H. H8 l: d  本章主要为大家介绍系统bootloader的理论知识,下个章节为大家实战。
- I6 s' a9 ~* h7 \/ D* N0 r
- t5 A* M) Y; ^67.2 系统bootLoader基础知识! r6 D$ ?& }5 H
STM32的系统存储区自带bootloader,此程序是ST在芯片出厂时烧录进去的,主要用于将用户应用程序下载到芯片内部Flash。支持USB,SPI,I2C,CAN,UART等接口方式下载。如果大家的应用程序打算采用这种接口方式进行升级,可以考虑采用系统bootloader,简单易用,无需用户自己写bootLoader了。: x0 Y6 n6 N7 I. n

* ^' c6 a8 {$ k; E$ |更重要的是,使用系统BootLoader可以不依赖硬件boot引脚,可以直接从应用程序跳转到系统BootLoader,这样灵活性就很大了。
) ?6 C+ |2 v; K6 p2 ]
2 u. m) O* h+ ^' y67.2.1 系统bootLoader执行流程
! f/ `, C+ N  u) {2 S7 Y$ y9 I$ ]下面是STM32H7的BootLoader程序执行流程,简单了解下即可:
; ^# G% [& [: W# a
: L0 `* C/ \. A2 x
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png
- s. e5 V* P3 F3 e8 C

( s+ ?8 s: W. ~关于这个执行流程,要特别注意一点:如果在进入系统BootLoader前就插入了USB线,会导致进入系统BootLoader后优先执行USB DFU,其它的接口方式将没有机会执行。' T1 M; a( N' y5 T4 Q" t: W

2 A, }- x1 J. R/ _67.2.2 系统bootLoader使用的引脚
0 u$ g" G3 w: z+ Z. H1 l
STM32H7的Bootloader使用到的引脚分配如下:1 _. {1 w0 }2 r7 T; @1 {
9 h: k6 U# Y2 C; a( T' M9 s+ X
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png

, u. h4 L1 _, N6 U" j) G  ?4 Y+ m5 a4 B* X
67.3 进入系统bootLoader的方法
; y, x* X  X0 V5 B/ |% k. g9 X0 dSTM32进入系统BootLoader主要有两种方法,一种是设置boot引脚,另一种是应用程序直接跳转到系统BootLoader。) ^$ e6 E; m; o2 Z3 ^

. e8 {3 k1 y0 S9 N# s/ K6 B67.3.1 设置硬件boot引脚进入系统bootLoader

1 Y: s' J$ O% ^H7的启动方式比较更灵活,只需一个boot引脚。但是一个引脚只能区分出两个状态,为了解决这个问题,H7专门配套了两个option bytes选项字节配置,如此以来就可以方便设置各种存储器地址了。
3 X) O! o8 [% Q+ Q& u
( Q. I8 {3 E0 o4 J0 T6 m
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png

% S: ^: y: W  B( o8 @% ]' \1 c; E5 F6 D. w& y
BOOT_ADD0和BOOT_ADD1对应32位地址到高16位,这点要特别注意。通过这两个选项字节,所有0x0000 0000到0x3FFF 0000的存储器地址都可以设置,包括:
5 N# k; w; u9 k- @6 H/ P9 N5 S  \& ^& V' `
  所有Flash地址空间。! [. v* A/ Y! O5 n* k- ?1 \
  所有RAM地址空间,ITCM,DTCM和SRAM。. a9 N7 T" w& e' S" R/ T
设置了选项字节后,掉电不会丢失,下次上电或者复位后,会根据BOOT引脚状态从BOOT_ADD0,或BOOT_ADD1所设置的地址进行启动。也就是说是,H7可以从0x0000 0000到0x3FFF 0000所有地址进行启动,这点与F4完全不同,F4系列是固定从0x0000 0000启动的。2 `8 H6 t# G: V  U( ~8 m. }

, ^) \0 ~( K1 u) O5 HSTM32H7的boot引脚设计:0 f$ }9 H% r1 l, G& p) n; Y
% l  p; ]3 T& h4 R$ @: z) Y
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png
& X/ d8 c# E2 O0 E, I
9 g. {% u# {6 j5 o  H9 t
使用BOOT功能,注意以下几个问题:) f2 f+ G3 Q5 @+ J- g0 i

9 k& N4 s7 }3 C$ a! ^  如果用户不慎,设置的地址范围不在有效的存储器地址,那么BOOT = 0时,会从Flash首地址0x0800 0000启动,BOOT = 1时,会从ITCM首地址0x0000 0000启动。5 W& N! ]) L1 ?9 _
  如果用户使能了Flash Level 2保护,那么只能从Flash地址空间进行启动。
3 N6 Q1 B' y4 K+ [' _67.3.2 用户应用程序跳转到系统bootLoader

1 H! _7 K! N; F, E4 q; k4 k: D5 B4 q除了使用boot引脚控制运行系统BootLoader,也可以上电后跳转,跳转前注意以下问题:
0 ?! z% H# N! }1 q" _7 |3 R8 ^2 q+ q( |$ U7 J, |6 |% Y  s
  禁止所有外设时钟。8 }5 w- M0 X, {0 m7 L1 K5 k
  禁止使用的PLL。8 R' y  _3 ?3 `% T( {/ G
  禁止所有中断。# F+ @) ^- W6 R7 W# ~* ]
  清除所有中断挂起标志。) l" @0 O8 m2 d1 t# G: V$ o
  如果使用Go命令,对于BootLoader中使用的硬件外设寄存器,跳转前是不会设置到复位值的,如果用户代码中恰好也用到这些寄存器,需要重新配置。这里要特别注意的是BootLoader会用到看门狗,并且喂狗时间设为最长了,如果用户代码里面要用到看门狗请根据需要重新配置,并且看门狗一旦开启是无法关闭的。4 M9 m" ^/ s/ F% K% t" I
  对于具有双bank特性的STM32,为了能够从用户代码跳转到系统boot,需要将系统boot代码区使用寄存器SYSCFG重映射到0x0000 0000(除了F7和H7系列)。对于STM32F7系列,需要禁止nDBOOT / nDBANK 特性,然后跳转到系统boot区。
4 i# k6 ~' \, L. p, S  如果用到系统bootloader的DFU/CAN接口,需要用到HSE时钟,这个时钟的频率是通过内部HSI/MSI检测出具体频率。因此,由于外部温度等各种情况,内部HSI的精度会受到影响,从而影响检测出来的HSE时钟有较大误差,最终导致DFU/CAN运行失败。
6 ^5 d2 k. i0 [7 X$ @# M! f
, n4 z& z1 S6 h! G具体实现会在下一章节为大家讲解。
8 L) M  J2 d* Y+ E# u
6 m, V3 x! _  |) G1 r67.4 退出系统bootLoader的方法
9 x6 z" y* u3 W' P( q$ e/ }当前主要研究了USB DFU和串口IAP退出bootLoader。& g$ z; {+ O$ ^0 r0 ]5 [
( t( `8 {( X6 J; K: E
  USB DFU
. p7 E2 G2 j; {, v% U当芯片工作在系统bootLoader的USB DFU模式,更新完毕程序后,不会自动退出USB DFU,需要重新复位芯片后才会退出。由于DFU模式会用到USB线,插拔USB线是难以避免的,所以是否支持自动退出,并不影响。: l9 I2 k" B$ U* Y# Q" l1 O) u
- r9 @- R1 |; P4 l; M
  串口IAP
9 g! a0 l* T2 B, ?2 ~: T当芯片工作在系统bootLoader的串口升级模式,更新完毕程序后,可以自动退出。所以基于串口的组网设备,使用系统bootloader非常方便。
! C  M4 t' `5 B% ?
) q' s  a; w, ~67.5 系统bootLoader的擦写管理
$ N! M% h9 ~. l1 o- Z注:这部分知识点有个了解即可。
" V: F5 r/ k1 ~0 ~6 S+ h6 g0 U( S
使用bootloader命令进行的所有写操作都只能字对齐(地址应该是4的倍数)。要写入的数据数量也必须是4的倍数(接受未对齐的半页写地址)。
2 {: o' z+ O- u2 [$ L0 \$ y  h  有些产品不支持批量擦除操作。使用BootLoader进行批量擦除时,有两种方法可用:
/ h$ |% v2 S/ M5 ^3 x  使用扇区擦除命令一个一个删除。
# n9 s+ \, v, T& ?  T7 u( e  将保护级别设置为1,然后设置为0(使用读保护命令,然后使用读非保护命令),将导致大批量擦除操作。
; o# i- |$ o* U* u# r3 ]  STM32 L1和L0系列的Bootloader除了支持操作内部Flash,内部SRAM,可选字节等,还支持操作Data Memeory(数据存储区,貌似是指的EEPROM)。数据存储区支持读写操作,而不支持擦除命令,如果要擦除,写0即可。另外对此存储区的写操作必须是4字节对齐(写地址),并且写入的数据也是4的倍数。
7 ]" P, M4 ~1 ?+ b, ]/ z, R+ R3 |3 r& ?  F2, F4, F7 和 L4除了支持操作内部Flash,内部SRAM,可选字节等,还支持操作OTP存储区。仅支持读写操作,不支持擦除命令。4 Q$ [3 u2 O9 i/ H- l8 ?: [
  F2, F4 和 F7系列的内部Flash写格式依赖于供电电压范围,默认的写操作只支持字节(半字,字和双字是不支持的),为了增加写操作速度,用户施加足够的电压范围以允许写操作按半字,字或双字,并通过虚拟内存位置的boot程序更新此配置。该内存位置不是物理地址,但可以根据协议使用常规的BootLoader读写操作。该存储位置包含4个字节,分别为如下表所述:
6 [' ?9 w$ C  i# K$ g8 M, N
; L' o+ p/ I/ k8 a  Q2 V; p0 v& _9 Y
67.6 总结
, N6 O+ f8 K1 ?- u5 c  b
本章节就为大家讲解这么多,更新相关的知识看ST的应用笔记AN2606。7 M2 [' S  a1 [; Q7 ~5 H

' D: z! v( Y% e  @' E: k. O
  z  o* T! }6 o5 A0 ~9 s/ R- q" p, @
( N' W8 l* c! W% T0 ~
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png
赞 收藏 评论0 发布时间:2021-12-18 17:42

举报

0个回答

所属标签

相似技术帖

官网相关资源

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