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

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

[复制链接]
STMCU小助手 发布时间:2024-11-22 19:09
01 引言: H/ B- u  H, L
STM32MP13x 系列 MPU 是 STM32 Arm®Cortex® MPU 家族中的一部分,它拥有单核Cortex®-A7 核心,支持核心频率 650MHz~1GHz,不仅能够轻松运行 Linux 操作系统,还同时提供官方 HAL 库,用于支持基于 RTOS 或无 OS 的项目方案,即裸跑应用程序。) b% ?0 b$ [/ C. I

" V7 I6 v* J0 w+ X
本应用文档将就以下几个部分简述如何在 STM32MP13 系列 MPU 上开始无 OS 项目的开发:
4 j2 _! W- x' ]• STM32MP13x Baremetal 开发环境简介
! M4 |: x/ ^" h. K) Z8 d. @) L$ Y: ^" U6 m• STM32MP13x 工程的创建$ m8 K' G9 x; V8 C
• STM32MP13x 工程的在线调试
4 n; Q& n/ l' u) u• 镜像烧录及从外部 Flash 启动- e$ Z; ?* f) S! A7 c5 H

6 [# C2 [/ l# F. R: m" U6 Y6 b02 STM32MP13x Baremetal 开发环境简介1 \* E" ?" n" g$ u" d5 x
2.1 开发工具及环境( V! `8 M' n) p) I& C
STM32MP13x Baremetal 开发工具主要包括:
6 f9 k$ L" @3 z  G1. 烧录工具:STM32CubeProg ( 版本大于 v2.15.0); [/ [( C0 x% P  S0 l$ F
2. 配置工具:STM32CubeMX (版本大于 v6.10.0); z7 \! {0 N: i* E- l
3. 开发调试工具:IAR(版本大于 v9.50),或 STM32CubeIDE(版本大于 v1.14)
5 L1 }. c* `! v0 B本文示例基于 STM32CubeIDE 开发调试工具。
1 P/ y3 ~' y& w4 x  z6 L+ b1 H6 `* w$ ]  V8 K6 C: S
0 x6 H7 b2 m+ `( x, L
2.2 STM32CubeMP13 开发包/ S/ P+ E8 \+ I3 x4 a" D1 ]
STM32CubeMP13 开发包同步发布于 ST 官网 www.st.com 和 github.com,可通过如下方式下载:% p+ A& f6 p$ f% z% y/ c- \
1. ST 官网下载链接3 S$ X6 J4 z" u) v3 ?+ j
2. Github 仓库链接# h; E* P$ Z8 L* O
3. 通过 STM32CubeMx 软件下载# Z- {; d/ ~7 L5 Z

6 Y6 [% k+ e0 U; r$ h! a7 f3 c
2.2.1. STM32CubeMP13 开发包总览+ F/ @; W8 \' u) r  O' i+ Q
STM32CubeMP13 开发包运行在 Arm® Cortex®-A7 处理器上,由以下三部分组成:( I! n+ L0 Z9 M, V. ^
• Level 0:驱动程序,包含 HAL、LL、BSP、CMSIS( K1 M% ^- _. c0 T# ?
• Level 1:中间件,包含 Eclipse ThreadX(原 AzureRTOS),USB Host & Device 库  n/ q0 f" F  t4 G& v; y3 s
• Level 2:包含各种板级示例程序0 g1 D% L" U( z  Q6 B
除此之外,还包括一些工具助手等。
" B# v3 e/ O9 b& l( Y4 ?
$ i! x* C6 Y/ d1 X- b
1 V! l. {! S# @* \; \
1.png
- t) U1 o+ Z. E6 c4 Y
▲ 图 1 Baremetal 开发包源码框架
" y$ h0 \' e+ M5 h, }8 e
2 {1 H: N, h! a6 v% d' O

) b2 z& i) f0 v2 N0 e7 Z" Q2.2.2. 源码目录结构% A0 D* n  p( ]
2.png 6 h8 Y0 g4 @! u
▲ 图 2 Baremetal 开发包源码目录
, v4 m4 e% |2 Z# r) F) A
( d& p4 E: C- u5 _
2.2.3. 开发包支持模块列表. q7 F; n9 V# r, e' C0 W; s
已支持的 HAL drivers :
9 [* @, `. f( z: L• 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
4 ?- [% k' X; v6 o9 V# I
  k# n2 {) u( I) Y
已支持的 LL drivers :# w' X! b/ K" q) Q$ @3 A2 M
• ADC, DMA/DMAMUX, EXTI, ETZPC, GPIO, I2C, LPTIM, MDMA, PWR, RCC & BUS, RTC, SPI, TIM, USART; M- v- _# R' n. G- D! h

$ g* U# M  \' R' ~" m
BSP 与 BSP 组件:
# e9 l% J4 {8 f, l- d• 基于 HAL 封装了更高一级的 API,为 LED、按钮、相机、LCD、SD 卡和 COM 端口提供 API,包含了以下一些外围器件的驱动:GC2145, LAN8742, MCP23x17, RK043FN48H, STMIPID02
4 h" \9 E1 I6 K9 t' c- P) C0 g+ J+ a$ p4 L4 ^/ o; |; S
中间件程序:
9 v. ]& P5 K! `0 }; q; F• 包含一系列支持某种服务的库文件及接口文件,目前已支持:Eclipse ThreadX(原 AzureRTOS),STM32_USB_Device_Library,
3 l6 m; u4 X* x6 Q( d! v* lSTM32_USB_Host_Library
5 ]+ S- _, V* I5 A. Q8 K$ N
% k7 z! w/ `) ~6 c$ T, H9 T
项目工程:) m) {. v+ C) B
• Examples:基于 HAL 接口的简单示例,没有中间件功能。
" a( Z% r+ {# q& n* u; m• Applications:较完整的工程应用实例,包含中间件功能。
" h3 }) v8 `: g5 w2 N- u( D• External_Loader: 烧录镜像及从外部存储器启动的应用示例。/ y; n# I9 J2 U* K( r' z
• Template: 板级工程应用框架。. z2 g, ~5 g2 c# b  k4 p8 c
/ L0 W$ p( M' G8 m" G. Y1 A
实用工具:, Q+ s: J+ G7 d$ R$ e# t% r
• Imageheader:用于添加 stm32 头,支持存储设备启动。" B( o( a" L$ t* d- z# l$ ^" K
• Fonts:提供了一组用于显示的标准字体,包括 font8,font12,font16,font20,font24
! j7 p( k# T+ j* ^$ V5 J
/ K! Q( j: N, ^" x

8 N! T5 [; l0 G$ i/ e- Q03 STM32MP13x 工程的创建
" k' u+ L7 M9 r# s; dSTM32MP13x 工程创建,可通过以下两种方式:) f4 r1 p  o! h
1. 使用 STM32CubeMx 配置并生成项目框架代码,并基于该框架代码开发应用。8 P) E- h6 b- F, v* P1 `- a
2. 导入 STM32CubeMP13 开发包示例工程代码,并基于该示例代码开发应用。
+ L( P, g2 K( l+ h' G2 I8 e0 u8 z0 }! O) A' x( o$ J) m
3.1. 从 STM32CubeMX 创建工程3 d7 G2 y( e5 e$ @
STM32CubeMX 是 STM32Cube 工具家族中的一员,它采用简单易用的图形界面,可以帮助开发者快速配置硬件和软件。可支持从 MCU/MPU 选型,引脚配置,系统时钟以及外设时钟设置,到外设参数配置,中间件参数配置等,并可生成适用的 C 代码项目。7 }; ^9 o7 k1 A) a. Z6 h/ ?5 o
, ]4 D1 R$ p4 h: ^9 D& d
本章节简述如何通过 STM32CubeMx 生成适用于 STM32MP13x 的裸跑应用框架。使用该方式无需提前下载 STM32CubeMP13 开发包,STM32CubeMx 可自动联网下载。0 h/ \4 Y6 c9 B2 h4 R9 ~
1. 打开 STM32CubeMX,点击 ACCESS TO MCU SELECTOR,0 c' r: q4 U. A" M- y& S( O6 z
2. 在搜索框中输入 STM32MP13 相应料号,如:STM32MP135FAF7,双击打开配置窗口% w9 c1 V6 ^- x  }. P5 q4 [$ @
3. 弹框选择 MP13 Bare Metal,将生成 bare metal 工程框架。
7 ~( ?5 o) D+ ?7 }2 A, Q 3.png
6 l' Y6 Z* ?4 H7 o6 d

$ M/ F5 e" J) d4 _& h% v▲ 图 3 STM32CubeMx 选择器件* \0 w& V; ~: [; Y% A
4.png , w. I$ I2 F) u
. _4 ~- J0 ^7 l# f( E2 T  z% W
▲ 图 4 STM32CubeMx 选择工程类型
" K0 c3 n7 k4 @
, ?' V' a8 v) ~$ `1 a) G

& ~; h- f/ A5 }" u4 ]4. 切换到 Project Manager 标签页,输入工程名称。$ S& ^+ c$ h' t1 N8 }+ \
5. 在此页进行项目选项配置,可保持默认。* O+ W- w0 p5 l* l1 o: H
5.png # u5 A$ Y( P% s% t! \- {7 f% x3 y7 U+ ?

/ c7 h& n5 m) _▲ 图 5 STM32CubeMx 工程设置页面
! N7 k( c8 p3 |
, H( s$ P9 Y* Z0 k" d- t% T' W

( W$ y6 ^& h# s: [; @6. 回到 Pinout & Configuration 标签页。
1 n. n8 C8 t* A( h6 N7. 使能 RCC 和 DDR。  M+ p- N' T$ t) f! b
8. 配置各外设总线,配置方法与其他 STM32 MCU 相同(也可参考 Help -> Docs & Resources)
* Z: E0 ]& b4 j8 m4 g, d5 t2 w3 Q0 V) k) z0 K0 E" s' c

& @; P; b6 C; s" {( R3 C8 \; h

) Y8 B, u* @0 L3 q% e 6.png 4 {  g3 u# g) k+ F, ~
" ?7 z  i% c% \% b- j
▲ 图 6 STM32CubeMx 外设配置页面9 E5 o& z/ p3 k6 c  ^3 N
5 {! x/ A* l2 q# L( c
( t4 M# v6 @0 ?, X
9. 切换到 Clock Configuration 标签页。
9 d5 `6 W. J7 h: z9 i  J10. 若软件报告时钟错误,可点击 Yes 自动修复。+ n1 k1 |/ p% i) V  d
11. 输入 CPU、DDR、总线等的工作频率,系统会自动匹配合适参数。; a& Z% J- [, a, l. O1 v; P. l% l# A
# e; M  [/ y6 I4 v
7.png 2 G/ b5 I8 |4 C  r5 V. P% y
▲ 图 7 STM32CubeMx 时钟配置页面
# m/ U& w) A3 p) J' a" z5 m# @
: \8 H% N. j, |
: c' ]. {. A5 H9 a/ c
12. 所有外设配置完成,即可点击 GENERATE CODE,开始生成工程代码。. Y9 u0 x) H3 \$ X, q
13. 若第一次使用,软件将提示是否下载 STM32CubeMP13 开发包,可点击“yes”,软件自动联网下载前述 STM32CubeMP13 开发包。
/ y" p! w& f; R; F; k$ J6 h! Q, J14. 生成完成后,可直接点击 Open Project,将打开 STM32CubeIDE 工程。
7 K. D' J1 u0 r- L; e) @ 8.png
4 j! `5 M1 l2 X- c1 w
: N; {- ?# H' h
▲ 图 8 STM32CubeMx 代码生成页面7 b: Z8 ?: O+ A; `- t" s! d7 E# r% w
9.png ) i. @/ M% W9 b& P; B8 |% H/ f  ~' g
▲ 图 9 STM32CubeMx 完成代码生成页面0 t8 u# e: V: V  C6 O' ~6 o0 w
10.png # P* t, M# V* p: Q' @7 F6 y
▲ 图 10 STM32CubeMx 生成工程代码示例  o. e& _& J, W$ l4 |0 W4 S+ T4 h3 o

+ ?- {5 _9 w; n& j7 X- `& j" D
15. 至此,工程框架已生成,可通过 STM32CubeIDE 进行用户代码的编辑、编译、调试。0 N7 I2 W& ~' P- u4 S7 D
; s1 d* m1 p" A- d7 x6 K$ h; ?
' W3 w( N, o* `* ?# N6 n) B
3.2. 从 STM32CubeMP13 开发包导入工程
4 |4 }+ z$ k, b5 I8 u) g7 ]若已事先通过 ST 官方网站或 Github 下载了 STM32CubeMP13 软件开发包,也可导入开发包中的工程示例代码,从示例代码开始进行项目开发。
7 B* c1 g/ T- }! A3 v; B  ^& m' t) @
这里以 FSBLA_Sdmmc1 工程为例。
& M7 M+ t( z  Q% ]( u! c) Z项目路径:\Projects\STM32MP135C-DK\Applications\FSBLA\FSBLA_Sdmmc1- S+ P( C" B1 T9 U
1. 打开 STM32CubeIDE,导入 project) l7 g1 ?: o- y" ?
2. 点击 Files -> Import…
, h  _; \5 u3 e# ^ 11.png
2 t7 u# J2 j( b. x
▲ 图 11 STM32CubeIDE 右键项目菜单6 |& ~% P9 d. w( o2 f2 _2 b
) [' E3 f7 J; `8 \% a# H" A6 x7 ^
, [; V0 e: Q2 ^4 b  P8 N8 D
3. 选择 Existing Projects into Workspace
3 W6 ?) d1 \# L/ `4 |& O* L4. 点击 Next>
" Q( U  x7 s4 V 12.png
0 N: {+ H( Q0 b# B6 [! ^, R
  f, E2 l5 i: o3 a
▲ 图 12 STM32CubeIDE 导入已存在项目
( }3 F; h8 _! Q2 a: U% w( ]5 @# {; `2 I& W) q
3 w6 {& ^3 a1 C/ U$ p5 c) D7 E- o
5.点击 Browse…,找到目录 \Projects\STM32MP135C-DK\Applications\FSBLA* `- a3 d6 `, G
6. 选中 FSBLA_Sdmmc1_A7 工程" J& G0 p. d" y; S* k( [& T
7. 点击 Finish,导入 Project
: ?- i& z3 ~! g% N4 K5 v% @6 w 13.png
( y1 ~: Y  ]  Q9 D
0 g8 U( e% m" O
▲ 图 13 STM32CubeIDE 选择导入项目1 o8 K3 w& Z4 Z9 \

) t/ h  V. Q1 A; x

' M" L9 v, p5 P# P$ t/ N8. 工程导入完成。
  r8 @/ S" W2 ~1 Y3 [* r0 i0 @6 I3 j, l9 b) ?, A. ^

" ^" D! ?$ ~- }& Q+ [0 }5 ]04 STM32MP13x 工程的在线调试$ F3 ^* e, n/ S2 I, e! }
工程创建完成后,接下来本章节将介绍如何基于 STM32CubeIDE 进行工程编译及在线调试。
0 ?4 d% A% D2 r/ j9 J  U) c! z$ N6 o$ o' P. b
STM32MP135 内部包含 128KByte SYSRAM,若代码小于 128KByte,可直接运行于内部SYSRAM 中,适用于验证一些简单的外设实例。若代码大于 128KByte,则需要将程序运行于DDR 中。下面将分别阐述。
% L  B9 Q( _9 s( w% s- V
5 ]8 J8 f2 u9 ?: |0 z- t/ p
4.1. 在 SYSRAM 中调试程序7 h8 U6 S+ q& ^) X' u$ `; |
仍以前述导入的 FSBLA_Sdmmc1_A7 工程为例。
. ], G% q. F+ }0 s3 f* Q- J% J4 z1. 首先,将开发板切换到工程模式- K$ m( i* g& ]; b) R
2. 连接 Type-C 电源3. 连接 MicroUSB,这里板载已支持 ST-Link
( M. u1 q; A: ?1 C 14.png 6 L0 r# g: U0 K7 R
* x- E4 J5 i% }6 l
▲ 图 14 开发板切换工程模式
% U% _5 y6 Z6 O6 J+ J, x- ^% p- K  m# z0 u6 P5 \) M
4. 右键项目工程名称,选择 Build Project,完成编译。; Z+ |! E3 a- h0 P7 N- ]
15.png
: d: x8 m5 p1 J( I/ l

: x; l9 T& `  ]5 F▲ 图 15 选择编译工程
, }. _. j- i* ^# R' B2 Q" U: M: |' I; n+ Z- o+ `3 f7 @
' t6 p9 \7 R% \$ A0 K$ r8 f: e
5. 右键工程名称,选择 Debug As -> STM32 C/C++ Application
/ c2 Q: }/ r4 r3 q4 H 16.png
0 o4 p+ @; G5 L

) D; Q# Y, |9 t9 G0 _▲ 图 16 选择调试项目方法 1
6 {0 l1 Q# _; W2 ?! V6. 或点击 Debug 图标/ x! C# E& Q( }- }
7. 进入 Debug Configurations….) _' t1 C$ p1 A
17.png
0 Y2 ^7 u0 g3 y2 M8 g; H5 \# D3 b
6 n5 ~7 k3 N+ X8 M5 _
▲图 17 选择调试项目方法 2
& N" k1 h# M" h, Z8 ^
  f- F' L0 c  d7 ^: R* \) t, N5 N4 h% B/ p

+ S) J7 n# |5 J' _) f8. 进入调试配置菜单2 i9 Q5 T4 J% i
18.png
- X9 y1 D# g$ B1 [( z6 \: k

8 ]0 F/ _6 h( H$ }0 K. {: D4 u7 I▲图 18 调试配置页面
2 @  b  F. p3 r3 h( t( L6 G5 g  K8 F" z* O0 U* x( W
, k+ a" d& Q' ?9 [( h; |
19.png
* V! F. M0 i4 ^! x& H, D- b
7 I' K) J8 }) E4 Y. M' D: B

& _5 s" u; V, Q

9 f+ _+ t* s: |* g4 f% Q( l9. 即可像 MCU 一样调试您的代码。2 a; Q. Y6 C0 E; ^$ P
20.png 9 B- g+ Z/ f. E% H. {6 T5 u

: h! \3 R& T% Q! e, y/ M$ R, Y* E▲图 19 项目调试窗口4 N' T! b+ Z9 ~# h  A, y1 I/ ~- F

& e; y( m& o0 ]4.2. 在 DDR 中调试程序
# `; W; O" o; ]3 v6 h当代码量超过 SYSRAM(128KB)的大小时,需要将程序运行在 DDR。这里以 BSP_BasicTemplates 工程为例展示如何开发运行于 DDR 的用户程序、, a3 Q6 {3 e# |4 a- y7 Z0 v

( W$ L! D) H! o5 @4 }0 m- N
1. 首先,按照前述方法导入项目工程
1 N5 r& o$ E5 E) [4 p 21.png / I* h' Z9 x: b8 ~

2 ]4 U1 R8 l) B  m▲图 20 导入 Templates 工程
& C+ \" M8 F5 F$ _$ i& Y$ T; f) @6 H2 P0 ?5 u- l
* b. s  k3 S* t8 e4 I9 K1 c$ e
2. 打开 C/C++ Build 配置* m% b1 z6 ^, `
3. 在 Preprocessor 中添加 USE_DDR 宏定义
, S+ F' T) s) L7 g* U$ F 22.png % t* R' y5 D) R" d- J! d' w

8 o2 d( P( ?, B▲图 21 使能 DDR 宏
" X* ~: L4 v' e8 b- H- G$ G& P; y6 M/ f0 W$ p- T# Q/ m
- {# z9 j2 t5 r# U0 h8 p/ }% K
4. 修改链接文件,重命名为 “stm32mp13xx_a7_ddr.ld”
( M6 Q' c6 L# s7 k; A5. 修改 REGION_ALIAS 定义到 DDR 区域:1 K, v: d  n  N+ n2 p
6. 重新编译后,目标文件将链接到 DDR
; e0 M/ ~9 X# O# C; ?! j 23.png
5 f& d4 O( p% r" j2 p8 @; J
6 W+ \; J1 K0 T: e% x" h. K9 Q
▲图 22 修改链接空间8 @& L7 n# u# _  v: N7 r
24.png ! F$ k" s7 F3 ~* T: @# `7 j6 h
0 Y& p4 g4 W9 }  i, t
▲图 23 选择链接文件
4 O. V: _0 L5 l; o6 d  V, D0 u" y, V' m% \
7. 在调试之前需要先运行 DDR_Init 对 DDR 进行初始化) x# y" S5 y' o) ^- \( h8 z- r$ D
8. 按照前述方法导入 DDR_Init 工程,编译后全速运行一次,并保持开发板不掉电项目路径:\STM32MP135C-DK\Examples\DDR\DDR_Init
) `2 i& q. B4 u! {5 {6 k 25.png 7 m0 h( q+ u3 B# X$ S" K

( y5 k  N- A. U2 ^. S# k& w▲ 图 24 运行 DDR 初始化
* x7 e( ]4 _: p- |; M8 c1 u/ H$ z6 ~. ^7 x; m4 l
. D( B2 c( x. _4 [- r+ @  T
9. 回到 BSP_BasicTemplates 工程。
  B7 X; t' R5 W10. 在 Debug configuration 对话框中,将 Startup 页面的 monitor reset 删除。' _+ n' A+ I. s& i
26.png
  _: W  i! ^; Z
2 Y- n" k2 j& q8 o/ Y& I4 F
▲ 图 25 修改调试参数; a& _- j* ^* r# [: N

4 p  s& {% ^# v9 \  [0 ?$ @6 m
6 x( x9 H: |8 j
11. 点击 Debug 进入调试
4 s+ j) j7 D. }+ B7 |0 L) ^12. 可以看到当前 main 函数的地址已经为 0xC000 开头的 DDR 位置
( d& q. `* Q! }3 M2 ]' ?5 K0 I8 J) f9 l" X( h. Z

+ |4 |- j! W; o8 R  J8 i/ f 27.png
+ ~" w* y: U( {+ A

  u8 V6 D1 n' B" F▲ 图 26 在 DDR 中调试工程
2 S4 k9 j* x' @& ~" J& {% N0 m' \8 u6 H1 W( X  O' }" u

$ S$ g9 B, z) |6 A8 q  _05 从外部 Flash 启动
8 n* M7 G* z. g, E2 [( ^& j 28.png ( h6 q/ W$ b' O
  f9 d- O7 A! [) t: m
▲ 图 27 STM32MP13 启动流程
7 o# h6 k* C( L0 k* O! h
* x" g9 t/ V& z2 {
从外部 flash 引导 STM32MP13, 一般需要包含两个部分源码。如上图所示,芯片上电后,首先运行内部固化的一段 ROM CODE,ROM CODE 从用户配置的启动器件中寻找 FSBLA,并将其拷贝至 SYSRAM 中,FSBLA 运行后,执行 DDR 初始化及用户代码(CUBE EXAMPLE)拷贝到 DDR 中,最终实现跳转到 DDR 中运行用户程序的目的。
- g2 Q* f4 u& ?2 Q7 g- Y. f3 l: b! I% D6 F4 y" J0 E
这里以 SDCard 启动为例,在第三章节中,我们编译调试的 FSBLA_Sdmmc1_A7 工程,即实现了 FSBLA 部分的功能,BSP_BasicTemplates 工程为实际开发的用户项目。完成启动需要将这两个工程生成的镜像文件都烧录到 SDCard 中。6 W5 ]7 o" n1 F: B9 v

4 E- J$ \- k* M3 U5 C
• FSBLA 需烧录到 SDCard 的固定位置 LBA128 或 LBA640,ROM CODE 固定从这两个位置寻找 FSBLA。
4 F+ l! i+ S4 Q: M0 E" A• CUBE EXAMPLE 的存放位置可在 FSBLA 程序中修改,默认为 SDCard 的 LBA640。% S2 p- [6 D  ^8 @( E! \5 P* g7 w
• 如果有烧录过 OpenSTLinux 的卡,需先格式化。原因是 ROM Code 优先从 GPT 分区表中寻找 FSBLA,若分区表存在,新烧录到 LBA128 位置的 FSBLA 将会被忽略。
. W5 \1 {% S+ `# B9 d7 Z% { 29.png
& \4 D5 t  ]  t' z- o5 A* \
▲ 图 28 镜像在 SDCard 中的 Layout
8 {7 U& j( P" y2 w- \* U( q( B, h* [! n  Y' L
需要注意的是,FSBLA 和 CUBE EXAMPLE 都需要加入 STM32 Header,才能被系统识别。STM32 Header 是 ROM CODE 加载二进制文件的必要格式,每一个被 ROM CODE 加载的二进制文件都需要在头部添加特定的 STM32 Header。STM32CubeMP13 开发包中提供了ImageHeader 工具,用于为项目二进制文件添加 STM32 Header。开发者不需要深究 STM32Header 的详细内容。' R: v) D  V, d& b" Q' y0 x
30.png ) s! Y( X1 ?5 }- w$ o) o
▲ 图 29 STM32 Header 信息
, }! K4 [+ k: z3 J7 t' X
, I9 V4 }& u9 j2 f
为用户程序加入 STM32 Header,可在工程配置的 post-build steps 中加入如下命令:" Z  [8 f' t2 |* q7 |* P
“(path_to_STM32CubeMP13
- H  r0 `# ^6 e; a7 k% wPackage)/Utilities/ImageHeader/postbuild_STM32MP13.sh"
2 f% X4 M$ |& l" m# a! j"${gnu_tools_for_stm32_compiler_path}"
( g+ `* n* T0 ?0 u2 a- K"${BuildArtifactFileBaseName}"( F; D3 Y9 [0 G6 {: n2 M, U. E, T

' J  k6 ^1 [4 O2 }. V* x

+ H" S& j" g5 Y8 w- X% o) O- y3 l重新编译完成后,即可生成打上 STM32 Header 的目标文件。
, n  M2 R. ]2 v1 q9 C; i" q 31.png - X, i' w: }1 \$ i' ~: C
▲ 图 30 添加 Post-build 命令
5 S5 w! {7 |$ N9 b/ {2 V: H2 O3 b) n" g- z0 V
注:path_to_STM32CubeMP13 Package 为 STM32CubeMP13 开发包的存放路径。: M- \* w2 h9 B5 f; I

0 d/ ?. g, {. W  i- s  Y6 M. J- y+ h  n
至此,已准备好待烧入 SDCard 的目标文件:* o! k9 \& s6 j  P1 `/ s: v0 T
1. 已添加 STM32 Header 的 FSBLA_Sdmmc 目标文件:FSBLA_Sdmmc1_A7_Signed.bin (即 FSBL)* q% `! s8 w# r
2. 已添加 STM32 Header 的 CUBE EXAMPLE 目标文件:MP13_BSP_BasicTemplates.stm32(即用户工程)5 r. U5 I% v) E' E

+ D4 X1 X7 C3 {( w- }# J4 G
烧录工程位于 STM32CubeMP13 开发包的如下目录:& o9 @' X. ?0 ]; P: K) W
\Projects\STM32MP135C-DK\External_Loader,以二进制的方式提供了烧录时需要的两个引导文件,包括:& g% J9 G5 {" Q
1.STM32PRGFW_UTIL_MP13xx_CP_Serial_Boot.stm32' x7 z; M6 N: ^9 H1 Y' C6 P4 C7 s
2.SD_Ext_Loader.bin其中,STM32PRGFW_UTIL_MP13xx_CP_Serial_Boot.stm32 为基于开源工程。
! \+ s2 e+ O! R, k5 Y1 X; y( c1 M, b+ B

, b1 T( ?, M+ Q$ UOpenbootloader 实现的一套 IAP 应用,执行烧录流程管理。SD_Ext_Loader.bin 工程执行SDCard 设备的实际擦写操作。
" V2 w5 j5 X# I) n, H3 d
- z0 S% x: M! G8 j" d  L

; u- X- V0 z# U) {* ?, T/ x目前,引导设备可支持 SDCard,QSPI NOR FLASH、EMMC 等,若项目开发中需要修改适配不同的存储设备,可联系 ST 窗口获取烧录工程源码。" s& A5 Y$ }, k: j0 E/ z+ W

) z6 r6 o# E$ z) e6 z- }
将需要烧录的两个文件拷贝到 External_Loader 目录下,与烧录工程的两个文件存放在相同位置,然后修改 tsv 文件。完成后,目录中文件列表和 tsv 文件内容如图所示。
/ P# O$ F; A$ o 32.png
2 Y: `9 {1 u* y5 T' G; F
▲ 图 31 烧录文件列表, M* j( M3 K$ D; v
33.png 0 S/ A/ w0 l! ^( F. `% P
▲ 图 32 tsv 文件内容9 f+ M) C) C) r1 y8 P$ j3 a
, j0 [  c1 O& ], F" a* `

8 X2 P7 S9 C/ o接下来,即可使用 STM32CubeProg 进行镜像烧录。可支持通过 USB 或 UART 连接,不支持通过 ST-LINK 连接。这里以 UART 连接为例:/ ?* `5 [* \; [% a: w
1. 开发板跳线设置到 000 并上电
' {# K) F0 o0 [' n  Q2. 连接 MicroUSB 口,查看 COM 号。注意通过串口连接时需要断开 USB OTG
# W% Y  W2 ^7 S: M1 j; L; x3. STM32CubeProgrammer 选择连接方式为 UART,选择相应 COM 口+ X$ T2 i$ b& [
4. 点击 Connect 连接0 c7 {# Q0 N& e& x+ d$ Y
34.png
  ^" V# @" Y# _7 V; \
# }# h. d1 H5 g9 t% G; F 35.png 4 y! b* Y6 G9 A( g5 e5 C
5. 点击 Open File,选择 FlashLayout_OpenBL_ExtLoaderSDMMC_SerialBoot.tsv 文件4 a: ^/ n2 u  W" }4 N/ }' V- y" b
6. 点击 Browse,选择目标文件夹:\Projects\STM32MP135C DK\External_Loader\SD_Ext_Loader/ U  J, _' G; B/ Y4 U
7. 点击 Download,开始下载镜像
: Y( h; |6 |& e$ V 36.png 9 ~; B; E& B# O+ B9 c  w
  i3 W2 L1 R  B
37.png
+ e/ \* {! n8 s& M7 z7 D+ B: i7 c5 S4 S, |" r
8. 等待烧录完成
' \, ^. g) y. J1 T) [( @3 r9. 将板子断电,boot mode 切换至 SDCard 启动
8 j$ N$ K$ Q, l' p! _8 ?10. 重新上电,即可引导启动/ N  ]& W" _' q! Q
38.png $ d- }6 S% D; }* r! K8 ^/ Z# [

% b0 _8 y: f# t/ ]1 p  O7 ?转载自:STM32. B( G: h: T9 Q- D: V- z; g& t0 y8 H
6 a" {4 t/ {; d3 ^' ?: F
- s/ x4 C4 s3 n9 I$ @8 Z
收藏 评论0 发布时间:2024-11-22 19:09

举报

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