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

在 STM32MP13x 系列 MPU 上裸跑应用程序

[复制链接]
STMCU小助手 发布时间:2024-11-22 19:09
01 引言$ L; G- q( D, x
STM32MP13x 系列 MPU 是 STM32 Arm®Cortex® MPU 家族中的一部分,它拥有单核Cortex®-A7 核心,支持核心频率 650MHz~1GHz,不仅能够轻松运行 Linux 操作系统,还同时提供官方 HAL 库,用于支持基于 RTOS 或无 OS 的项目方案,即裸跑应用程序。
1 L2 a5 `0 W$ T. q, W) \8 A/ I9 Q) E& x& e3 w1 J- D( o$ j
本应用文档将就以下几个部分简述如何在 STM32MP13 系列 MPU 上开始无 OS 项目的开发:# d1 m+ Y/ z5 o/ b, g, E1 V
• STM32MP13x Baremetal 开发环境简介
5 }  B8 k2 F5 c• STM32MP13x 工程的创建- G8 b8 P" ^1 N$ H5 i7 s
• STM32MP13x 工程的在线调试
; L0 Q1 i7 |$ h- _  E• 镜像烧录及从外部 Flash 启动
% f3 x2 V2 o+ @

9 E3 j3 p8 o; M. N02 STM32MP13x Baremetal 开发环境简介
8 P5 c* I7 B3 l2.1 开发工具及环境
/ N6 i/ S: ^) J0 uSTM32MP13x Baremetal 开发工具主要包括:
7 x; t% W6 f4 B( d5 _$ R: @1. 烧录工具:STM32CubeProg ( 版本大于 v2.15.0)& _/ ]! q$ V# K" ^
2. 配置工具:STM32CubeMX (版本大于 v6.10.0)2 r+ g9 J& @  l1 A' V8 d; Y8 Y' s
3. 开发调试工具:IAR(版本大于 v9.50),或 STM32CubeIDE(版本大于 v1.14); F, I% j( \9 Y2 Q) \
本文示例基于 STM32CubeIDE 开发调试工具。9 H) a/ M4 F0 n8 e. m* o
3 Q& r2 ^' F% N! @2 E

! R3 S6 O: \1 C: x1 |! A* V: [2.2 STM32CubeMP13 开发包
8 e: _5 N( |8 S1 v. S" jSTM32CubeMP13 开发包同步发布于 ST 官网 www.st.com 和 github.com,可通过如下方式下载:' v' b. B" r& \! R4 I
1. ST 官网下载链接! Z, I0 w( _) H2 g! u1 R+ q
2. Github 仓库链接
8 I6 y# ]3 r! z! @1 D! Z) e) W& [. N3. 通过 STM32CubeMx 软件下载
! {+ p' k6 f, W) T1 L1 S2 L1 f$ W- j! @  F
2.2.1. STM32CubeMP13 开发包总览
7 P, ?& f/ N# q, W" sSTM32CubeMP13 开发包运行在 Arm® Cortex®-A7 处理器上,由以下三部分组成:& T) n0 l3 C+ H
• Level 0:驱动程序,包含 HAL、LL、BSP、CMSIS5 F2 v. j( D8 c( U* I$ L) }
• Level 1:中间件,包含 Eclipse ThreadX(原 AzureRTOS),USB Host & Device 库. m# n) ~) m9 H
• Level 2:包含各种板级示例程序: \% I! r) ~6 ]  R& V. K% m+ f- S4 J
除此之外,还包括一些工具助手等。
  _3 p" c% e/ d3 M( q
2 @& [* N9 W2 ?  V/ S
4 c& E9 K/ w) U
1.png & i8 `6 W* l- I1 F* X/ W  v- y4 ^
▲ 图 1 Baremetal 开发包源码框架, s4 I' ?( [  |6 G3 ?! ~
' u6 l+ ~) s4 _; ]/ Z2 \+ W

2 v+ A$ ^& A6 ?# \1 ^% [2.2.2. 源码目录结构, c1 d" {) h+ L% k3 A2 R& l# H( O8 p
2.png
) E1 {. M% c' h: q% N- v$ r" ^▲ 图 2 Baremetal 开发包源码目录# x' Y$ m* ]4 |* ^* o( h

& F) ^6 ?1 _. ]) h
2.2.3. 开发包支持模块列表
# s* u* L  Q! t$ q# s已支持的 HAL drivers :. _) Y1 f& Y6 t' T1 C+ g" g
• ADC, BSEC, CRC, CRYP (including SAES), DCMIPP, DDR, DFSDM, DMA,DTS, ETH, ETZPC, EXTI, FDCAN, FMC_NAND, GPIO, HASH, I2C, I2S, IWDG,LPTIM, LTDC, MCE, MDMA, PKA, PWR, XSPI (QSPI replaced with XSPI),RCC, RNG, RTC (including TAMP), SAI, SDMMC (including EMMC), SMARTCARD, SPDIFRX, SPI, TIM, UART, USART, USB
  _1 z+ r* K( K/ y! Q) J
) M4 N2 ~2 F* ^5 r: m
已支持的 LL drivers :% e% q9 ~( _. _6 H4 ]# I" O
• ADC, DMA/DMAMUX, EXTI, ETZPC, GPIO, I2C, LPTIM, MDMA, PWR, RCC & BUS, RTC, SPI, TIM, USART. m$ `( H/ C1 Y% R" P- J

% Q7 U2 X. H) _3 c0 y' d" H' V. P
BSP 与 BSP 组件:
: a6 s3 p4 @/ `6 I6 \• 基于 HAL 封装了更高一级的 API,为 LED、按钮、相机、LCD、SD 卡和 COM 端口提供 API,包含了以下一些外围器件的驱动:GC2145, LAN8742, MCP23x17, RK043FN48H, STMIPID02$ {$ l! y+ e% i  X' B

0 ~0 B9 F$ _' X( T3 N2 d
中间件程序:
6 _4 s+ b3 x2 k; k; ?• 包含一系列支持某种服务的库文件及接口文件,目前已支持:Eclipse ThreadX(原 AzureRTOS),STM32_USB_Device_Library,
0 _& _8 d7 e, J5 K. ?STM32_USB_Host_Library7 o6 @5 Y" j5 j. n. V' i6 f" Y* J
  S8 ^+ C' r2 U3 h: L+ f! |
项目工程:
  f4 F2 C- v: w2 X4 J! f5 p• Examples:基于 HAL 接口的简单示例,没有中间件功能。
$ h/ |9 y. c7 r; A8 _$ Q5 @8 r& p• Applications:较完整的工程应用实例,包含中间件功能。
6 Y4 r+ w9 d7 h  p1 \/ W( G5 e• External_Loader: 烧录镜像及从外部存储器启动的应用示例。' V+ u+ o: y4 a+ p3 A
• Template: 板级工程应用框架。$ ]9 \- `! z' s/ t2 h

. ]2 M9 m3 n- G
实用工具:" ]! I; S/ s+ Y9 b! @
• Imageheader:用于添加 stm32 头,支持存储设备启动。
* P; [% |4 U' U% x$ |/ D* Z2 W0 f• Fonts:提供了一组用于显示的标准字体,包括 font8,font12,font16,font20,font24
: x& |$ H4 f. v+ y# a- Z( V- F+ j
3 }: I! c; @  C. I: i
( }. Y7 V1 H0 ]  W8 `9 Y5 U
03 STM32MP13x 工程的创建
3 ?% E, _5 u, HSTM32MP13x 工程创建,可通过以下两种方式:: G* b' k& ^; s7 M( X
1. 使用 STM32CubeMx 配置并生成项目框架代码,并基于该框架代码开发应用。' C+ T8 {. R( N7 g
2. 导入 STM32CubeMP13 开发包示例工程代码,并基于该示例代码开发应用。& n& M- u, k: g3 K- {4 H" K: ^

3 Q  F6 t' K! M2 T4 [3.1. 从 STM32CubeMX 创建工程: x& C! |, `0 C  z
STM32CubeMX 是 STM32Cube 工具家族中的一员,它采用简单易用的图形界面,可以帮助开发者快速配置硬件和软件。可支持从 MCU/MPU 选型,引脚配置,系统时钟以及外设时钟设置,到外设参数配置,中间件参数配置等,并可生成适用的 C 代码项目。* n3 q6 B. M$ ]. |' I0 l8 ]
2 X1 T* A) ]3 R9 `# s
本章节简述如何通过 STM32CubeMx 生成适用于 STM32MP13x 的裸跑应用框架。使用该方式无需提前下载 STM32CubeMP13 开发包,STM32CubeMx 可自动联网下载。
' H% K1 R7 T4 U4 n% U+ E1. 打开 STM32CubeMX,点击 ACCESS TO MCU SELECTOR,2 I( x' M6 h* m. r' T$ i/ H
2. 在搜索框中输入 STM32MP13 相应料号,如:STM32MP135FAF7,双击打开配置窗口* x* B4 D( Y  u1 x
3. 弹框选择 MP13 Bare Metal,将生成 bare metal 工程框架。
3 Z' d) c5 f' h* C& ]" n 3.png
# g+ n/ n3 q" C; F& S! Y/ A& f8 M

- B1 m( m% h7 V7 h% i: M▲ 图 3 STM32CubeMx 选择器件2 V5 |/ i/ J2 M8 w: Z5 d4 h
4.png 8 y5 V; q5 K/ l! K' B, k# ^

- d( i% f# {: b7 ?7 E$ @9 ]8 V▲ 图 4 STM32CubeMx 选择工程类型
1 M0 o: x, z- L' m
1 @' w3 K: q' M2 r6 e0 D+ y0 M

: Y" G3 ?& U9 p4. 切换到 Project Manager 标签页,输入工程名称。4 g, g8 Q7 b" S, t4 w8 ~
5. 在此页进行项目选项配置,可保持默认。; O/ _4 ?0 X5 q- W: v
5.png " g" v" p5 {) Z1 d

4 r3 B# @- A: f* N/ p▲ 图 5 STM32CubeMx 工程设置页面% Q0 h# X5 l# `1 _& g% H2 b$ E0 c
" d# P8 _3 A( o( X8 H% |7 V
6 m/ p4 [3 V' x
6. 回到 Pinout & Configuration 标签页。" [, f( n/ T) \3 d$ c
7. 使能 RCC 和 DDR。
, h, e9 ^: m9 ]0 h7 @: E: N9 d8. 配置各外设总线,配置方法与其他 STM32 MCU 相同(也可参考 Help -> Docs & Resources)* u* @! ^7 C8 e/ @' I0 _
8 w  P8 |. ^" V  h

9 l" K, }) ~1 _3 U8 D0 g

+ C4 _- s- T% C5 y 6.png
; b6 k' P7 l8 R7 H" O) [

# W; I! z' E# S0 N3 o) I( p▲ 图 6 STM32CubeMx 外设配置页面
/ S; m# }& }  T/ N3 w: L' [$ N5 A0 z4 S/ Y! o/ M
9 H3 u5 F' m2 Q  C3 M6 k1 {2 m# I
9. 切换到 Clock Configuration 标签页。
3 R$ X4 I" _6 L7 B; |6 L$ i7 U+ ~10. 若软件报告时钟错误,可点击 Yes 自动修复。
% u) c1 |* m: \( P. K! g2 ?3 w1 J9 X11. 输入 CPU、DDR、总线等的工作频率,系统会自动匹配合适参数。
1 L; S- V/ H6 W) f7 q2 Z' v/ B! S6 a1 V' o5 K
7.png & \( ]' H' H' ?" W
▲ 图 7 STM32CubeMx 时钟配置页面9 |& h# p" }( e; P
+ E6 I- f& A/ |! _& F6 f. ]2 l' r
( L* r. c, H* Q3 P7 L# x  ~: Z! L
12. 所有外设配置完成,即可点击 GENERATE CODE,开始生成工程代码。
2 T2 ]- O- W1 f2 Y/ @. N5 t13. 若第一次使用,软件将提示是否下载 STM32CubeMP13 开发包,可点击“yes”,软件自动联网下载前述 STM32CubeMP13 开发包。
, l% V! A$ C3 ^. [. g. y14. 生成完成后,可直接点击 Open Project,将打开 STM32CubeIDE 工程。, V# @1 Q) T( d( \9 y( ^/ N
8.png
6 ^8 n7 d' r( S

; O# g/ P/ M* k0 b* V▲ 图 8 STM32CubeMx 代码生成页面
. W. U# C4 X& c9 E: e# V  V, B2 |' R 9.png / k& t- {; B! q( [
▲ 图 9 STM32CubeMx 完成代码生成页面8 H# U2 l3 ^5 ~
10.png
* R/ {- Y8 |; ?& |5 n
▲ 图 10 STM32CubeMx 生成工程代码示例9 }# _6 \0 |, l: p

* L, h0 X1 s( c7 e1 ?
15. 至此,工程框架已生成,可通过 STM32CubeIDE 进行用户代码的编辑、编译、调试。# g% O& E+ \$ ]* I! m% M

& Y5 g1 d0 i. ], b% {6 U- D
0 Z; J6 d% S- y( a" f6 `7 s
3.2. 从 STM32CubeMP13 开发包导入工程5 r9 h2 N3 U0 y, m) l6 n
若已事先通过 ST 官方网站或 Github 下载了 STM32CubeMP13 软件开发包,也可导入开发包中的工程示例代码,从示例代码开始进行项目开发。8 }3 P  E* ^0 M# C5 C

1 u' K# K  o  _/ i2 G) `
这里以 FSBLA_Sdmmc1 工程为例。; h: K5 {4 @' J6 D
项目路径:\Projects\STM32MP135C-DK\Applications\FSBLA\FSBLA_Sdmmc1
) v( p/ K" H# Y3 P% B1. 打开 STM32CubeIDE,导入 project
9 N8 \# e7 d1 S0 \2. 点击 Files -> Import…
! g2 U! L0 C; P9 J! y7 u! J 11.png
/ ]% J' M" @" n1 ~; V
▲ 图 11 STM32CubeIDE 右键项目菜单
- u+ H5 l! w5 X( J
1 M8 |" Z" [6 y" Y3 x

) O2 V+ x; Y4 F# s/ K6 ]; b3. 选择 Existing Projects into Workspace/ _, c- [& ?4 D5 `3 m
4. 点击 Next>
. a' i0 ~! m$ N8 D, U0 Q 12.png
8 \, x+ i- [; B

! n" {# n8 l; p▲ 图 12 STM32CubeIDE 导入已存在项目
0 Z0 z, Z' a8 U4 W' \- J) M  i- s+ ~& o& n9 w* @" ?8 {& u0 |* A+ w

( Y: Z, a% G! {# G2 G5.点击 Browse…,找到目录 \Projects\STM32MP135C-DK\Applications\FSBLA8 I1 r- X9 g3 t! t8 S
6. 选中 FSBLA_Sdmmc1_A7 工程! O# W6 [+ w, i# }
7. 点击 Finish,导入 Project
1 Y% ^7 w3 |0 a. ?9 T, C: T  O 13.png
5 c% R" B  I, u: X. l: G) {4 n

4 J" }  r1 W0 T( Z9 ~▲ 图 13 STM32CubeIDE 选择导入项目
! u2 f+ h$ q& G& v, d9 y: u  a  R

) k* `6 X/ v. k  V6 N8. 工程导入完成。2 x. j. j9 l1 e
4 O2 i( C  W5 h; S8 R* u
+ ]' \. ]6 @. l) n( W& A# V
04 STM32MP13x 工程的在线调试
, z1 }! D- N8 ~4 V2 U7 H+ u工程创建完成后,接下来本章节将介绍如何基于 STM32CubeIDE 进行工程编译及在线调试。
1 Y: c1 O& k3 p9 n& d3 ?$ r; v3 W# }, o
STM32MP135 内部包含 128KByte SYSRAM,若代码小于 128KByte,可直接运行于内部SYSRAM 中,适用于验证一些简单的外设实例。若代码大于 128KByte,则需要将程序运行于DDR 中。下面将分别阐述。+ ]* {/ W+ h2 v9 b; d( c. f

& ~9 b8 B4 c# w  f3 I8 w+ ~4.1. 在 SYSRAM 中调试程序: ]! Z" l- a6 r
仍以前述导入的 FSBLA_Sdmmc1_A7 工程为例。
) z$ Z+ Q2 I3 t3 A$ _1. 首先,将开发板切换到工程模式
( w; x/ n0 Z! h# u2. 连接 Type-C 电源3. 连接 MicroUSB,这里板载已支持 ST-Link
$ |4 C1 h7 v" x' H 14.png . L; n- u  o5 Y2 w2 y3 D! t

- a3 V( g8 b6 m7 v# \▲ 图 14 开发板切换工程模式
$ E% C5 \: E* \1 g. J8 E" i3 M/ P1 P4 h# G& s
4. 右键项目工程名称,选择 Build Project,完成编译。
: Z& o# l2 w/ f$ ]; H 15.png
0 \# k. t. _6 a6 l
3 c& s1 }4 w. X5 [9 y+ m+ D
▲ 图 15 选择编译工程$ ^2 |+ ^1 P9 ]% o0 p

; D3 x$ D- X* c  u( u5 Z

- g* W+ q' R& J5 d$ ^, J5. 右键工程名称,选择 Debug As -> STM32 C/C++ Application
8 g  }# p+ O1 |2 G% Q) ~ 16.png 8 n8 T% @. |4 z, G+ v1 ?
. x% o3 }) \4 U0 g# J+ R
▲ 图 16 选择调试项目方法 1
! @+ }2 C5 E$ m4 @. T6. 或点击 Debug 图标& X  g7 O8 |2 i) |' X3 f
7. 进入 Debug Configurations….
/ f# I- Q4 X) x$ K 17.png
! Z' I" G) P5 |/ e
* x! v( W9 i% `9 x: F' s! Z2 b
▲图 17 选择调试项目方法 2& a/ g: c  e" l8 R$ O: c

7 E& R# h6 n( V
% q1 C# h9 }% W& U: {0 A1 y' W
8. 进入调试配置菜单
! O: a0 f8 C% N- Q, y 18.png
2 o3 g. X  C( `2 H0 Q3 Q

- ]6 S: q: |( K0 d2 a( D, {# h0 ^▲图 18 调试配置页面1 ]" K5 p+ A/ \/ I( ~$ [  \
9 `- P) V# t# Y. a( b+ m8 c* i
6 R  `/ ?% l  z/ ?; F
19.png
/ S. M6 m6 L$ a4 Y8 |& Q/ a

! e0 i( F) x8 V- p( o7 k5 q6 W( ^: `0 s. B& A! X

5 e9 v% D* {  R# I' |, j9. 即可像 MCU 一样调试您的代码。5 V7 ]: T; g- e) J( `& A
20.png / i$ `5 Y. W3 G/ _
1 h6 {$ s3 s+ s0 J7 s3 z
▲图 19 项目调试窗口
& s/ ^4 \! y8 d7 Q$ m
' j# J$ D2 n; R7 z4 D/ X! u* W* S4.2. 在 DDR 中调试程序. c' O2 C! {5 n* i# x: B9 z
当代码量超过 SYSRAM(128KB)的大小时,需要将程序运行在 DDR。这里以 BSP_BasicTemplates 工程为例展示如何开发运行于 DDR 的用户程序、+ C4 i( M. L+ @( T( I
5 H6 M$ O7 c9 A7 ^% k
1. 首先,按照前述方法导入项目工程
6 I8 F  d+ q& R! O6 \, k. y 21.png
! D4 K- Z6 v- ]

% l5 B! X  g1 `) y▲图 20 导入 Templates 工程
3 U6 M. ?9 Z9 e1 v6 Z, {' x% Z1 u8 D: k1 G" B4 i! j- I

7 Y- ?6 l% F; S% H! ^7 r2. 打开 C/C++ Build 配置: v+ O0 ~6 |5 K1 F
3. 在 Preprocessor 中添加 USE_DDR 宏定义
+ w9 H) R2 k6 _' @ 22.png , K" Y( a. D( ?" c- u
& C: ?  r  l! U
▲图 21 使能 DDR 宏! ?5 q. L/ ]0 D* e6 c2 l* ~

& }, a: r, U/ E. _

+ ]. o% f* f  v/ J& A# ~4. 修改链接文件,重命名为 “stm32mp13xx_a7_ddr.ld”2 M  q1 |- e4 ?' ]1 U
5. 修改 REGION_ALIAS 定义到 DDR 区域:
; x' G. ^! L2 u, X6. 重新编译后,目标文件将链接到 DDR
- y3 i8 b; n' G) z' L9 q% \ 23.png # \3 ]7 F( @6 V

$ `  c9 p6 T0 [5 m0 R% P9 a▲图 22 修改链接空间
  v8 k( s& I; B 24.png : k/ a( x" I& Y( P1 N

; _* A5 [/ Z1 _- }0 b  n▲图 23 选择链接文件* J) F. G. G) ]/ r# K" ~
  _) j; \+ J2 ?& u
7. 在调试之前需要先运行 DDR_Init 对 DDR 进行初始化
. E$ H$ N0 q# M( }8. 按照前述方法导入 DDR_Init 工程,编译后全速运行一次,并保持开发板不掉电项目路径:\STM32MP135C-DK\Examples\DDR\DDR_Init( v9 n1 W) h: D1 F+ s% _! d
25.png 9 {$ F3 i9 [' T0 [4 n6 R
9 G$ }7 u/ P) I
▲ 图 24 运行 DDR 初始化
* y9 o6 }5 x, z
9 `- s$ k& f: T! ^/ a: t3 W
$ n9 {6 R, e' L2 y; U
9. 回到 BSP_BasicTemplates 工程。* I* O4 v% \) k! Y8 z
10. 在 Debug configuration 对话框中,将 Startup 页面的 monitor reset 删除。
7 q0 _) ?5 K. B- c4 \. `( h 26.png   Z8 T! [! i. z+ q

2 D3 o+ t8 d+ e) {4 J8 k/ g0 }  [▲ 图 25 修改调试参数
5 I: r, f* D6 C" w1 F8 R; C9 z3 q6 N% L

3 U% N9 `7 u: J! e1 u/ G' P' Z11. 点击 Debug 进入调试
9 ?. N, v& {0 ~4 t4 a9 q8 G1 m12. 可以看到当前 main 函数的地址已经为 0xC000 开头的 DDR 位置; _6 a) Q( g# k7 s: f7 g
" f; `4 ~2 X+ E  L7 h7 I/ l3 Y

9 k: f: g; y1 d5 J! B( m5 Y6 t 27.png 4 Q7 J8 O' Z$ E! j2 p: \% G
% T% ~" n6 r" L. ?" g4 e) z
▲ 图 26 在 DDR 中调试工程
  v. D+ ]  U9 B# e( u9 J9 w# v! G4 _, u! U8 @  j9 {* |
$ `% B4 o: m6 P/ k# j! j/ N
05 从外部 Flash 启动/ i" _, T, |5 s' H& N( D# \4 r
28.png
+ H; w* z6 }$ w$ d8 k
" R0 g/ K, k* Z& j# @/ a
▲ 图 27 STM32MP13 启动流程
+ L& T4 w  Q0 C- |9 i0 p* T% ^$ s/ G9 u$ b: N( s! f8 ~
从外部 flash 引导 STM32MP13, 一般需要包含两个部分源码。如上图所示,芯片上电后,首先运行内部固化的一段 ROM CODE,ROM CODE 从用户配置的启动器件中寻找 FSBLA,并将其拷贝至 SYSRAM 中,FSBLA 运行后,执行 DDR 初始化及用户代码(CUBE EXAMPLE)拷贝到 DDR 中,最终实现跳转到 DDR 中运行用户程序的目的。* N3 w4 C* T, R# n  V
" {  n+ I4 d" d9 j! ]
这里以 SDCard 启动为例,在第三章节中,我们编译调试的 FSBLA_Sdmmc1_A7 工程,即实现了 FSBLA 部分的功能,BSP_BasicTemplates 工程为实际开发的用户项目。完成启动需要将这两个工程生成的镜像文件都烧录到 SDCard 中。! W- t) g& N% q. F
2 }1 m% @2 Y0 p4 \. F+ a  _
• FSBLA 需烧录到 SDCard 的固定位置 LBA128 或 LBA640,ROM CODE 固定从这两个位置寻找 FSBLA。: G3 U# F+ G2 [. X* p2 Z  n+ s1 R6 F% T
• CUBE EXAMPLE 的存放位置可在 FSBLA 程序中修改,默认为 SDCard 的 LBA640。
; `/ s9 Y7 ?) I1 q1 a• 如果有烧录过 OpenSTLinux 的卡,需先格式化。原因是 ROM Code 优先从 GPT 分区表中寻找 FSBLA,若分区表存在,新烧录到 LBA128 位置的 FSBLA 将会被忽略。
8 x- [% X& w! L3 L8 m' |1 y 29.png 7 A0 V/ s4 a! ]) a2 L- E
▲ 图 28 镜像在 SDCard 中的 Layout  t6 N6 k; q- Y9 Z7 c3 \3 x
7 |: l, _( g/ ]- v$ _1 t3 c9 G, Y
需要注意的是,FSBLA 和 CUBE EXAMPLE 都需要加入 STM32 Header,才能被系统识别。STM32 Header 是 ROM CODE 加载二进制文件的必要格式,每一个被 ROM CODE 加载的二进制文件都需要在头部添加特定的 STM32 Header。STM32CubeMP13 开发包中提供了ImageHeader 工具,用于为项目二进制文件添加 STM32 Header。开发者不需要深究 STM32Header 的详细内容。
! T; U# i5 |% M" A+ K 30.png 6 s; F: d: X$ L0 p" b
▲ 图 29 STM32 Header 信息
8 j" l) f; p* w) I
4 h1 r+ L  C  e8 w0 R  L+ |
为用户程序加入 STM32 Header,可在工程配置的 post-build steps 中加入如下命令:
) r+ D, c% A. T8 h“(path_to_STM32CubeMP13
  K9 O" Y4 I& {2 I( cPackage)/Utilities/ImageHeader/postbuild_STM32MP13.sh"
; u0 Y/ `, Y$ H) N$ C( _& ~1 [0 W& G"${gnu_tools_for_stm32_compiler_path}"
' R' m" [8 p7 m6 a5 T! L"${BuildArtifactFileBaseName}"
0 W; b9 Z8 e) N8 X  k
9 F5 N- S0 X( K' k7 E/ O

6 Z4 v- ^# @4 R: z! A+ F重新编译完成后,即可生成打上 STM32 Header 的目标文件。7 a; x3 X' C8 H- D) x
31.png ! z" ^, `: c, X
▲ 图 30 添加 Post-build 命令% T; ]9 R. M; R( c* _3 d

* _- E2 `* [, i4 B" L注:path_to_STM32CubeMP13 Package 为 STM32CubeMP13 开发包的存放路径。
% t5 G( S% S) J3 k& Q3 D0 I' a* G- N
$ w1 Y/ @- @0 C/ Q$ {" |
至此,已准备好待烧入 SDCard 的目标文件:" a4 u! v) ]5 l9 V' K$ v
1. 已添加 STM32 Header 的 FSBLA_Sdmmc 目标文件:FSBLA_Sdmmc1_A7_Signed.bin (即 FSBL)
, b0 h" z$ x) x; J7 a! _, I$ Q2. 已添加 STM32 Header 的 CUBE EXAMPLE 目标文件:MP13_BSP_BasicTemplates.stm32(即用户工程)9 \/ Z' i* g9 e7 f' y8 p
( v; B' w) u8 b8 W( q) s
烧录工程位于 STM32CubeMP13 开发包的如下目录:
/ H$ l& f8 Z  v1 N; b* M( d\Projects\STM32MP135C-DK\External_Loader,以二进制的方式提供了烧录时需要的两个引导文件,包括:, }  K$ o' }3 f+ l
1.STM32PRGFW_UTIL_MP13xx_CP_Serial_Boot.stm32
" v. C: S" o9 n3 m! C6 K& e$ J2.SD_Ext_Loader.bin其中,STM32PRGFW_UTIL_MP13xx_CP_Serial_Boot.stm32 为基于开源工程。" m9 V* w  v* `6 g9 E* m
. l2 E: u, E2 q7 o  p' m* l
! z' c& q0 `7 e/ Y5 A9 Q7 g6 K
Openbootloader 实现的一套 IAP 应用,执行烧录流程管理。SD_Ext_Loader.bin 工程执行SDCard 设备的实际擦写操作。  |( x  I; K/ r- s6 @
3 C2 W  d) `6 M# K0 Y# u

0 |7 Q1 s& {+ W" {目前,引导设备可支持 SDCard,QSPI NOR FLASH、EMMC 等,若项目开发中需要修改适配不同的存储设备,可联系 ST 窗口获取烧录工程源码。% {) d3 w4 f- w2 a, E

) A& \  w$ t. x; @5 Y8 C9 A: ]: X
将需要烧录的两个文件拷贝到 External_Loader 目录下,与烧录工程的两个文件存放在相同位置,然后修改 tsv 文件。完成后,目录中文件列表和 tsv 文件内容如图所示。. R4 O7 T# O. R0 @0 S% x( I
32.png
. S2 ~9 [& U% n8 B  [# ~. _$ p
▲ 图 31 烧录文件列表5 i5 L6 @; O" L& L6 ]
33.png
- |5 U" S% w9 d$ m/ S" {/ L
▲ 图 32 tsv 文件内容1 ~4 b) @  ]' F8 L6 }4 e

, j3 u& j% ~7 ]& A% u% X1 S
0 h# {4 ~3 n. P' `
接下来,即可使用 STM32CubeProg 进行镜像烧录。可支持通过 USB 或 UART 连接,不支持通过 ST-LINK 连接。这里以 UART 连接为例:3 |+ x  v0 r9 E. i" h: D
1. 开发板跳线设置到 000 并上电7 a* [' }2 k7 p( {
2. 连接 MicroUSB 口,查看 COM 号。注意通过串口连接时需要断开 USB OTG* S, G; j% c7 s+ d( |' B3 z3 `
3. STM32CubeProgrammer 选择连接方式为 UART,选择相应 COM 口
" K4 ]4 v) |" Z4. 点击 Connect 连接( {; b' o! X  N3 S9 d1 K/ T4 |
34.png , ^) G4 q; |! g
1 j" y4 ~/ p: N1 s
35.png
# P9 U" x- ^; `' E/ _4 Q" t5 u& C! b5. 点击 Open File,选择 FlashLayout_OpenBL_ExtLoaderSDMMC_SerialBoot.tsv 文件
2 C) f6 ^  v# k: t4 X3 D4 p6. 点击 Browse,选择目标文件夹:\Projects\STM32MP135C DK\External_Loader\SD_Ext_Loader, l! B5 R( k) H# Q! I* }
7. 点击 Download,开始下载镜像# h! I0 x- G2 r7 C, Z
36.png
# ?: F. o% J/ C6 a6 T' F

, A) ^) V) u% q+ {5 j1 g" @; E2 e 37.png
; [* z9 U6 P+ U1 Y+ V4 n% L6 ~% `) k9 M4 X4 A
8. 等待烧录完成
" C$ h: ?) G1 m0 E9. 将板子断电,boot mode 切换至 SDCard 启动
, Q. v6 k; y' J+ X$ Y8 e6 ]7 y10. 重新上电,即可引导启动
9 M5 g3 X  J$ e( p 38.png
. E$ @! v3 N% i% c3 B
$ `" s0 X5 e4 T7 b9 @: p转载自:STM322 ~* ?2 J& l# b' D. A. x
) a5 j! x% N" p* O/ d

. z  w  Z# w: a; _/ w
收藏 评论0 发布时间:2024-11-22 19:09

举报

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