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

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

[复制链接]
STMCU小助手 发布时间:2021-11-2 23:44
67.1 初学者重要提示
8 F. y; e; `; H  本章主要为大家介绍系统bootloader的理论知识,下个章节为大家实战。2 G: ~$ y1 h6 `
8 D5 L( ~( l, T( X* [% v
67.2 系统bootLoader基础知识# W: U! n# H) W3 Y
STM32的系统存储区自带bootloader,此程序是ST在芯片出厂时烧录进去的,主要用于将用户应用程序下载到芯片内部Flash。支持USB,SPI,I2C,CAN,UART等接口方式下载。如果大家的应用程序打算采用这种接口方式进行升级,可以考虑采用系统bootloader,简单易用,无需用户自己写bootLoader了。& w/ R& Z! A  N, ~1 p3 o5 O
3 _! J. s8 K  v6 J9 s" H# M8 g
更重要的是,使用系统BootLoader可以不依赖硬件boot引脚,可以直接从应用程序跳转到系统BootLoader,这样灵活性就很大了。3 F3 J1 b+ l9 P# g4 c- y

: F$ x' S  a4 q) h9 b0 d1 k' O3 P' I67.2.1 系统bootLoader执行流程
; z9 q( ]% |1 m下面是STM32H7的BootLoader程序执行流程,简单了解下即可:) X8 M* {( y& }/ u1 t

6 b. {, a: f3 A6 ^5 L
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png
  V/ |: |: a% z1 p$ m. v  B
关于这个执行流程,要特别注意一点:如果在进入系统BootLoader前就插入了USB线,会导致进入系统BootLoader后优先执行USB DFU,其它的接口方式将没有机会执行。
2 S7 v: j! X) x
8 N- I" o7 x' R# C/ @7 x67.2.2 系统bootLoader使用的引脚- y5 H  n8 o4 H
STM32H7的Bootloader使用到的引脚分配如下:
3 y4 W7 V6 I$ H3 V" }6 g
( ?3 y: D/ ^/ ?- w( D  E) N
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png
) p* y1 @. `( U4 Q  [6 h/ y
67.3 进入系统bootLoader的方法' D# o5 a0 _3 V/ m) J' u
STM32进入系统BootLoader主要有两种方法,一种是设置boot引脚,另一种是应用程序直接跳转到系统BootLoader。! E6 y; M5 E2 O3 F) k+ K, C

3 q* T9 P; x! B- B67.3.1 设置硬件boot引脚进入系统bootLoader
: m* {$ `- L+ W' c. V3 VH7的启动方式比较更灵活,只需一个boot引脚。但是一个引脚只能区分出两个状态,为了解决这个问题,H7专门配套了两个option bytes选项字节配置,如此以来就可以方便设置各种存储器地址了。
7 ]/ C$ ?; s4 a" i* r% M( c6 N7 x$ n" ~( l- _; O2 N
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png

- ]- `9 v- h, dBOOT_ADD0和BOOT_ADD1对应32位地址到高16位,这点要特别注意。通过这两个选项字节,所有0x0000 0000到0x3FFF 0000的存储器地址都可以设置,包括:" i+ T; F2 ^' S# P- k8 ?0 t- m
4 g9 q1 ^8 g+ E3 M/ X. K
  所有Flash地址空间。
$ J- I8 F. t/ H) h* W. O, w  所有RAM地址空间,ITCM,DTCM和SRAM。
' L$ g: a) \! E/ E' \设置了选项字节后,掉电不会丢失,下次上电或者复位后,会根据BOOT引脚状态从BOOT_ADD0,或BOOT_ADD1所设置的地址进行启动。也就是说是,H7可以从0x0000 0000到0x3FFF 0000所有地址进行启动,这点与F4完全不同,F4系列是固定从0x0000 0000启动的。* l8 N0 X6 a7 _  w6 k$ J

5 T) R/ L( W, m! r. p4 A/ \7 VSTM32H7的boot引脚设计:
  _$ a. ?7 P! c6 E
  o7 Z4 h2 n0 D$ \* Y& }
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png

8 u2 \3 G, D! H4 J+ B使用BOOT功能,注意以下几个问题:3 J& `( U6 @- Q

6 _( X5 s7 Q* ^7 ?, D  如果用户不慎,设置的地址范围不在有效的存储器地址,那么BOOT = 0时,会从Flash首地址0x0800 0000启动,BOOT = 1时,会从ITCM首地址0x0000 0000启动。
6 \, f6 R1 n8 [! q( `  如果用户使能了Flash Level 2保护,那么只能从Flash地址空间进行启动。
5 f* P/ G- H& n1 T) V: X9 }9 |! ~& \/ m: e67.3.2 用户应用程序跳转到系统bootLoader; `/ S; q7 m3 g& D
除了使用boot引脚控制运行系统BootLoader,也可以上电后跳转,跳转前注意以下问题:; T" m; a% ]8 u

" `9 \: o, m! `4 A  禁止所有外设时钟。
! y* M4 a- s" y: M  禁止使用的PLL。! D3 b8 x7 }- ~0 U
  禁止所有中断。
' E8 l  h- L. N" m9 o# N  清除所有中断挂起标志。' S4 }7 N; U2 c! U6 T0 V
  如果使用Go命令,对于BootLoader中使用的硬件外设寄存器,跳转前是不会设置到复位值的,如果用户代码中恰好也用到这些寄存器,需要重新配置。这里要特别注意的是BootLoader会用到看门狗,并且喂狗时间设为最长了,如果用户代码里面要用到看门狗请根据需要重新配置,并且看门狗一旦开启是无法关闭的。
, s0 o4 M4 E0 {0 K( e( S3 ~' F  对于具有双bank特性的STM32,为了能够从用户代码跳转到系统boot,需要将系统boot代码区使用寄存器SYSCFG重映射到0x0000 0000(除了F7和H7系列)。对于STM32F7系列,需要禁止nDBOOT / nDBANK 特性,然后跳转到系统boot区。- e$ B5 X. ~1 E/ v) g# |/ g
  如果用到系统bootloader的DFU/CAN接口,需要用到HSE时钟,这个时钟的频率是通过内部HSI/MSI检测出具体频率。因此,由于外部温度等各种情况,内部HSI的精度会受到影响,从而影响检测出来的HSE时钟有较大误差,最终导致DFU/CAN运行失败。) O# L  s) F* ?0 D$ R* A
7 m1 g. p6 n# O, d
具体实现会在下一章节为大家讲解。
1 V9 Z' n, o9 r: J+ q' F* J& E& S
+ E  r" w' a' t  s4 _" J- L67.4 退出系统bootLoader的方法/ u% Y" r$ w* B. [3 e* [
当前主要研究了USB DFU和串口IAP退出bootLoader。
; j. A1 J) C, k  @/ R
: N0 t3 k9 ]& }  USB DFU" X/ h  X0 t, J9 j! l3 {
当芯片工作在系统bootLoader的USB DFU模式,更新完毕程序后,不会自动退出USB DFU,需要重新复位芯片后才会退出。由于DFU模式会用到USB线,插拔USB线是难以避免的,所以是否支持自动退出,并不影响。! ?: o' U5 N# o* l8 X# [
! A5 d9 l& m+ K" s7 u' F3 E$ s
  串口IAP
3 f, j/ s. z8 |当芯片工作在系统bootLoader的串口升级模式,更新完毕程序后,可以自动退出。所以基于串口的组网设备,使用系统bootloader非常方便。: N8 L) y6 T- K& L; L( B$ m; }1 b3 d

" e4 m/ r6 a  _. L$ ?+ w( s* o67.5 系统bootLoader的擦写管理
% ]# t0 c1 _8 V. i注:这部分知识点有个了解即可。7 F2 m9 K1 F' d, z. i: U
/ [, P5 p. g: T) Z( H
使用bootloader命令进行的所有写操作都只能字对齐(地址应该是4的倍数)。要写入的数据数量也必须是4的倍数(接受未对齐的半页写地址)。
" x! t: N5 d* M' I% w3 y  有些产品不支持批量擦除操作。使用BootLoader进行批量擦除时,有两种方法可用:$ _  ~$ Y- p/ a7 j
  使用扇区擦除命令一个一个删除。
* g' D/ j- O' z9 A  将保护级别设置为1,然后设置为0(使用读保护命令,然后使用读非保护命令),将导致大批量擦除操作。
1 n6 J( [8 f2 W; k. t  STM32 L1和L0系列的Bootloader除了支持操作内部Flash,内部SRAM,可选字节等,还支持操作Data Memeory(数据存储区,貌似是指的EEPROM)。数据存储区支持读写操作,而不支持擦除命令,如果要擦除,写0即可。另外对此存储区的写操作必须是4字节对齐(写地址),并且写入的数据也是4的倍数。
4 ]+ W" R+ S$ I+ O+ G. e- K  F2, F4, F7 和 L4除了支持操作内部Flash,内部SRAM,可选字节等,还支持操作OTP存储区。仅支持读写操作,不支持擦除命令。
: H; u: _# N+ z; A9 ]3 @  F2, F4 和 F7系列的内部Flash写格式依赖于供电电压范围,默认的写操作只支持字节(半字,字和双字是不支持的),为了增加写操作速度,用户施加足够的电压范围以允许写操作按半字,字或双字,并通过虚拟内存位置的boot程序更新此配置。该内存位置不是物理地址,但可以根据协议使用常规的BootLoader读写操作。该存储位置包含4个字节,分别为如下表所述:
$ X& F0 l6 v2 J! N; `' j; d. x4 e# o* c" X; Y  k0 o+ n6 a2 {
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png

1 B1 e6 w2 O" S/ y4 r6 }67.6 总结
  t$ k, x, D* [! ^: _本章节就为大家讲解这么多,更新相关的知识看ST的应用笔记AN2606。
" n+ @$ O* m/ H( Y$ F3 W# h' \" M+ L
( G! h- Q, ^0 b) h9 M- I: y- w( {! I

( K" e! e; y1 J9 C+ p" n8 r9 I5 [) e. y) C7 ~
收藏 1 评论0 发布时间:2021-11-2 23:44

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版