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

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

[复制链接]
STMCU小助手 发布时间:2021-11-2 23:44
67.1 初学者重要提示
# g; k5 m+ X9 y1 P7 T3 V+ o2 h8 W  本章主要为大家介绍系统bootloader的理论知识,下个章节为大家实战。7 G% G+ [; ]" V  U0 a6 j
, \: [2 g- v1 v/ @
67.2 系统bootLoader基础知识
. I* \: N" n$ L5 lSTM32的系统存储区自带bootloader,此程序是ST在芯片出厂时烧录进去的,主要用于将用户应用程序下载到芯片内部Flash。支持USB,SPI,I2C,CAN,UART等接口方式下载。如果大家的应用程序打算采用这种接口方式进行升级,可以考虑采用系统bootloader,简单易用,无需用户自己写bootLoader了。
2 ~# t; z5 n6 M
9 O- I: |' s( s. g- x  U( W更重要的是,使用系统BootLoader可以不依赖硬件boot引脚,可以直接从应用程序跳转到系统BootLoader,这样灵活性就很大了。
0 i$ \+ \4 ~; r* L  M5 U0 h
# X% x4 q% h% a6 E$ Q67.2.1 系统bootLoader执行流程' {4 T0 z: b) l. I9 R6 X
下面是STM32H7的BootLoader程序执行流程,简单了解下即可:# h9 v& r# B4 Q) o" O* R4 A
: F5 C. z7 T9 @0 l) J
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png
, o: g$ k0 i8 G2 T7 }4 X
关于这个执行流程,要特别注意一点:如果在进入系统BootLoader前就插入了USB线,会导致进入系统BootLoader后优先执行USB DFU,其它的接口方式将没有机会执行。
  ^. A' o6 R4 L% k0 u  v& f1 p/ I  e! j+ ?& J- b
67.2.2 系统bootLoader使用的引脚
( v: }1 o+ x% U; ~STM32H7的Bootloader使用到的引脚分配如下:
) a9 S0 y  Q& n7 `+ M  U0 c- h4 q8 ?* b& `) H' c4 E& B& I
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png
% l  Y2 t+ t" E7 f6 r
67.3 进入系统bootLoader的方法! Q2 b  ^9 C+ \4 M
STM32进入系统BootLoader主要有两种方法,一种是设置boot引脚,另一种是应用程序直接跳转到系统BootLoader。$ ?0 q/ O: \7 i( H

$ H1 `) t/ C$ R# X67.3.1 设置硬件boot引脚进入系统bootLoader
8 l0 j# o, }# B: L! Z( l5 T% IH7的启动方式比较更灵活,只需一个boot引脚。但是一个引脚只能区分出两个状态,为了解决这个问题,H7专门配套了两个option bytes选项字节配置,如此以来就可以方便设置各种存储器地址了。' F7 t' [, y7 t, e* s: e
6 ^9 c# C" ]! B; X# h5 j4 c
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png
2 e3 J4 @- B7 n2 W! W' U  V
BOOT_ADD0和BOOT_ADD1对应32位地址到高16位,这点要特别注意。通过这两个选项字节,所有0x0000 0000到0x3FFF 0000的存储器地址都可以设置,包括:
  ~. H/ h: P* ]3 e, J7 r5 [" b2 |3 A4 x; D2 I4 q
  所有Flash地址空间。6 A& V+ \8 M" j# y! a2 w8 d
  所有RAM地址空间,ITCM,DTCM和SRAM。
1 h2 a/ e3 \4 c3 {5 t# x设置了选项字节后,掉电不会丢失,下次上电或者复位后,会根据BOOT引脚状态从BOOT_ADD0,或BOOT_ADD1所设置的地址进行启动。也就是说是,H7可以从0x0000 0000到0x3FFF 0000所有地址进行启动,这点与F4完全不同,F4系列是固定从0x0000 0000启动的。
' s- _  b5 N. R& l
, q) n1 X& n2 F' M4 G/ S6 |! h# \STM32H7的boot引脚设计:+ k1 D/ U( h2 V2 k

7 b0 ]0 `) S( t
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png
, j" L6 L  w! K2 g: i2 |
使用BOOT功能,注意以下几个问题:- J7 b- \1 K/ e
7 T1 C8 s& @3 Y+ Q5 N6 c
  如果用户不慎,设置的地址范围不在有效的存储器地址,那么BOOT = 0时,会从Flash首地址0x0800 0000启动,BOOT = 1时,会从ITCM首地址0x0000 0000启动。, P( L$ @* @8 b5 Y0 ~
  如果用户使能了Flash Level 2保护,那么只能从Flash地址空间进行启动。
* A7 ^; h* N* P& S* q% i67.3.2 用户应用程序跳转到系统bootLoader
2 R1 J3 H' h4 D除了使用boot引脚控制运行系统BootLoader,也可以上电后跳转,跳转前注意以下问题:/ n& w' o! _& q& b! U9 h% v
8 S6 t- W, f  Z% ~
  禁止所有外设时钟。9 Y( A" C6 D$ M  @! F8 n( _7 @: Y
  禁止使用的PLL。
" ^. o) a0 x. Y. ^  禁止所有中断。! F; f! [8 {6 @# P5 j+ l  @
  清除所有中断挂起标志。
1 r6 F" @7 O3 a& Q# r  如果使用Go命令,对于BootLoader中使用的硬件外设寄存器,跳转前是不会设置到复位值的,如果用户代码中恰好也用到这些寄存器,需要重新配置。这里要特别注意的是BootLoader会用到看门狗,并且喂狗时间设为最长了,如果用户代码里面要用到看门狗请根据需要重新配置,并且看门狗一旦开启是无法关闭的。
" ^8 T* R& M+ e% y  对于具有双bank特性的STM32,为了能够从用户代码跳转到系统boot,需要将系统boot代码区使用寄存器SYSCFG重映射到0x0000 0000(除了F7和H7系列)。对于STM32F7系列,需要禁止nDBOOT / nDBANK 特性,然后跳转到系统boot区。
6 h5 W# W3 u# {) ~- p8 O4 b3 n) @  如果用到系统bootloader的DFU/CAN接口,需要用到HSE时钟,这个时钟的频率是通过内部HSI/MSI检测出具体频率。因此,由于外部温度等各种情况,内部HSI的精度会受到影响,从而影响检测出来的HSE时钟有较大误差,最终导致DFU/CAN运行失败。
& z; z; A7 P9 j1 f- s$ U* y7 c, u8 s5 O9 k3 x
具体实现会在下一章节为大家讲解。
2 o1 N- g- [9 K0 a  U
4 }- k6 }1 k; @6 b# n3 d67.4 退出系统bootLoader的方法8 Z8 T0 {& J+ x% n, n5 S
当前主要研究了USB DFU和串口IAP退出bootLoader。# c  H' C! {% A2 b6 ~1 u3 z

; s/ ?/ A" @) M: x6 }  USB DFU. V3 c4 k, U6 h
当芯片工作在系统bootLoader的USB DFU模式,更新完毕程序后,不会自动退出USB DFU,需要重新复位芯片后才会退出。由于DFU模式会用到USB线,插拔USB线是难以避免的,所以是否支持自动退出,并不影响。, k6 {6 y, u$ Z
+ e% p% ]' L- X' q7 D% L; F
  串口IAP2 h% Z+ d7 C$ y* ^3 f
当芯片工作在系统bootLoader的串口升级模式,更新完毕程序后,可以自动退出。所以基于串口的组网设备,使用系统bootloader非常方便。
0 V0 l4 g" R8 ]  Y6 L/ \9 |% E4 H5 a9 b
67.5 系统bootLoader的擦写管理
" \1 g" _$ b! p' u注:这部分知识点有个了解即可。
  y3 O1 f; C: u# v3 h0 y" W, U8 v, Y; s1 S$ x. W( \
使用bootloader命令进行的所有写操作都只能字对齐(地址应该是4的倍数)。要写入的数据数量也必须是4的倍数(接受未对齐的半页写地址)。
* ~) N5 K& v/ m  有些产品不支持批量擦除操作。使用BootLoader进行批量擦除时,有两种方法可用:% F/ k) R. n0 I$ a  q
  使用扇区擦除命令一个一个删除。' N9 M7 J: o# P0 O; V& m
  将保护级别设置为1,然后设置为0(使用读保护命令,然后使用读非保护命令),将导致大批量擦除操作。2 W+ f; [/ i2 C. ~
  STM32 L1和L0系列的Bootloader除了支持操作内部Flash,内部SRAM,可选字节等,还支持操作Data Memeory(数据存储区,貌似是指的EEPROM)。数据存储区支持读写操作,而不支持擦除命令,如果要擦除,写0即可。另外对此存储区的写操作必须是4字节对齐(写地址),并且写入的数据也是4的倍数。
0 T+ f5 n2 {+ y. g; O  F2, F4, F7 和 L4除了支持操作内部Flash,内部SRAM,可选字节等,还支持操作OTP存储区。仅支持读写操作,不支持擦除命令。) _; s8 p$ E( ~) y
  F2, F4 和 F7系列的内部Flash写格式依赖于供电电压范围,默认的写操作只支持字节(半字,字和双字是不支持的),为了增加写操作速度,用户施加足够的电压范围以允许写操作按半字,字或双字,并通过虚拟内存位置的boot程序更新此配置。该内存位置不是物理地址,但可以根据协议使用常规的BootLoader读写操作。该存储位置包含4个字节,分别为如下表所述:
  B8 n8 D- n1 E+ M3 ]; @) E6 E8 i. x3 J
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDMvMTM3OTEwNy0yMDIw.png

1 D- @% M0 M8 o( Z67.6 总结
. O$ c( Y9 Z' l本章节就为大家讲解这么多,更新相关的知识看ST的应用笔记AN2606。
* M7 t/ e3 G% A1 ~3 z' D9 L+ t4 b, g8 d4 Y! [# H& m/ Y
  _5 m" @) k+ w, C; o
" }9 e; O' F3 C
" Q3 G' n% x0 \, l/ W: O/ R; Y
收藏 1 评论0 发布时间:2021-11-2 23:44

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版