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

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

[复制链接]
STMCU小助手 发布时间:2024-11-22 19:09
01 引言5 w8 \' D2 o  x/ n) T
STM32MP13x 系列 MPU 是 STM32 Arm®Cortex® MPU 家族中的一部分,它拥有单核Cortex®-A7 核心,支持核心频率 650MHz~1GHz,不仅能够轻松运行 Linux 操作系统,还同时提供官方 HAL 库,用于支持基于 RTOS 或无 OS 的项目方案,即裸跑应用程序。/ J- v0 w( b* c# k! h9 O

' P1 a. H% E* x  k
本应用文档将就以下几个部分简述如何在 STM32MP13 系列 MPU 上开始无 OS 项目的开发:
+ m9 a& G( o+ ~9 ]• STM32MP13x Baremetal 开发环境简介
4 x: u: x* n7 k/ F- G# W( s0 R3 j• STM32MP13x 工程的创建
! Q; b* O6 m5 i, y4 Y0 B• STM32MP13x 工程的在线调试* a9 {1 @8 s: J6 \. I7 p; J
• 镜像烧录及从外部 Flash 启动
( N' M- z* r- i8 }3 h) Y6 e8 I3 p

( Z& j1 v1 W5 i; ^2 Q8 F! f02 STM32MP13x Baremetal 开发环境简介& J& y8 W/ q. Z0 p$ u
2.1 开发工具及环境% x, r9 y9 Q5 J9 U
STM32MP13x Baremetal 开发工具主要包括:7 \4 n7 K2 t& d6 B8 U6 p* m
1. 烧录工具:STM32CubeProg ( 版本大于 v2.15.0)
" U  ^+ d* E0 x2. 配置工具:STM32CubeMX (版本大于 v6.10.0)' S" L) N* S( d3 ~
3. 开发调试工具:IAR(版本大于 v9.50),或 STM32CubeIDE(版本大于 v1.14)0 p6 ?6 Z; u1 \6 B5 N0 m5 z
本文示例基于 STM32CubeIDE 开发调试工具。
6 F" _8 k$ [( m% q/ a/ I- x4 f6 \5 y' X+ T4 L

, R4 ^: o5 D: U2.2 STM32CubeMP13 开发包
# t4 R5 _* i# @1 ASTM32CubeMP13 开发包同步发布于 ST 官网 www.st.com 和 github.com,可通过如下方式下载:
8 t4 ?+ u7 f; K1 W) i# T8 a( J. i* d1. ST 官网下载链接
1 Z& z- H* @% i* l2. Github 仓库链接2 E" Q, \2 Z* W# Q9 u6 d
3. 通过 STM32CubeMx 软件下载+ Q7 ^1 _2 a: m- C. L

+ r2 ~3 C: v) `) Y0 |' ?2 x
2.2.1. STM32CubeMP13 开发包总览' C* V( U$ V- P+ c6 Q9 C
STM32CubeMP13 开发包运行在 Arm® Cortex®-A7 处理器上,由以下三部分组成:8 z1 X/ h4 i% o$ g! H- \3 ~7 U
• Level 0:驱动程序,包含 HAL、LL、BSP、CMSIS# d3 U  j% y* A% P
• Level 1:中间件,包含 Eclipse ThreadX(原 AzureRTOS),USB Host & Device 库$ K2 k) V: C  ~( y7 w
• Level 2:包含各种板级示例程序
+ k% X: s/ _  @* s2 G1 @/ J除此之外,还包括一些工具助手等。
/ s) x/ U6 z8 n9 A6 e3 y
; Q. r3 {+ _( H6 y! H) L- t

1 E/ F$ b5 I. @- n* J 1.png " m% ^) H8 b2 ^8 w4 i
▲ 图 1 Baremetal 开发包源码框架
1 j  r& [8 G" r& K$ y% a; A. |# u8 e/ Z9 q5 m; @  F6 b# l
7 l" x1 I# V: p* C$ \
2.2.2. 源码目录结构
! n, c& ^  g% `" Y  k8 r" c 2.png 8 w8 m; f- }; ~4 \+ [
▲ 图 2 Baremetal 开发包源码目录6 ~2 o  P# h  m$ o" v
0 m" d  S) n7 ]$ L. T) s
2.2.3. 开发包支持模块列表( R& h9 r- ~; u. O& M
已支持的 HAL drivers :
/ s8 R2 h+ S0 @- d/ G7 e. i• 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* I" P, R5 O  f3 U* {5 Z* y: o5 Q

' w; b* ~$ o  _2 w2 u0 Y6 r' Z' A! i
已支持的 LL drivers :) u+ `! s  a" W( q; B# z- p: H! t
• ADC, DMA/DMAMUX, EXTI, ETZPC, GPIO, I2C, LPTIM, MDMA, PWR, RCC & BUS, RTC, SPI, TIM, USART
) k/ ]+ s, g* C% u' J8 C; |) I  a
BSP 与 BSP 组件:
$ }: C7 B& J$ z" w" N! Y* }% C4 n• 基于 HAL 封装了更高一级的 API,为 LED、按钮、相机、LCD、SD 卡和 COM 端口提供 API,包含了以下一些外围器件的驱动:GC2145, LAN8742, MCP23x17, RK043FN48H, STMIPID02
! T1 m) M$ g; I; S; M# [& r! i, o
: K( L  Y  ~1 Z! w4 U
中间件程序:; a# [1 n3 P* J: B" ]6 b" P$ C
• 包含一系列支持某种服务的库文件及接口文件,目前已支持:Eclipse ThreadX(原 AzureRTOS),STM32_USB_Device_Library,
% C# d& A  k9 M5 a. \, v# F, p/ USTM32_USB_Host_Library
+ @/ s, g6 l% e8 j- f1 m7 M3 \- z0 H* L1 T
项目工程:, a, o8 n- v; y. K4 {
• Examples:基于 HAL 接口的简单示例,没有中间件功能。
$ K' \6 k. S$ a0 X# f0 y• Applications:较完整的工程应用实例,包含中间件功能。- K9 v* y' U& b5 h7 G5 F3 A
• External_Loader: 烧录镜像及从外部存储器启动的应用示例。
1 x) @$ O7 P* n+ D- q• Template: 板级工程应用框架。
3 K( T, d& Q* O# N3 @$ P0 u8 L" u+ X9 U
实用工具:
# Z; j6 k5 H: Z$ `' L• Imageheader:用于添加 stm32 头,支持存储设备启动。
; H/ H* ^  V* q" b( Z  D/ N• Fonts:提供了一组用于显示的标准字体,包括 font8,font12,font16,font20,font24
) [* g6 V, K2 I# l9 M, x5 g2 v2 g
8 e0 P2 U# V- w' W

5 I$ Y& u$ x. i6 n: P* e6 F/ P! p03 STM32MP13x 工程的创建
! R1 ^$ W* O3 I+ V# @. oSTM32MP13x 工程创建,可通过以下两种方式:
. u5 Q  h3 i9 V! t8 p; m1. 使用 STM32CubeMx 配置并生成项目框架代码,并基于该框架代码开发应用。
) R. ^2 N4 n% d" U7 O( c2. 导入 STM32CubeMP13 开发包示例工程代码,并基于该示例代码开发应用。
9 A$ l0 o9 a7 ^. Z3 w5 D
6 Y4 H/ M1 w! S9 y7 a, [3.1. 从 STM32CubeMX 创建工程0 w8 [9 \2 m7 S- e
STM32CubeMX 是 STM32Cube 工具家族中的一员,它采用简单易用的图形界面,可以帮助开发者快速配置硬件和软件。可支持从 MCU/MPU 选型,引脚配置,系统时钟以及外设时钟设置,到外设参数配置,中间件参数配置等,并可生成适用的 C 代码项目。
" A% Q, W# N3 C* W: p. N1 a
) s9 ^$ p7 l. A5 C0 U9 t4 ?# t7 o
本章节简述如何通过 STM32CubeMx 生成适用于 STM32MP13x 的裸跑应用框架。使用该方式无需提前下载 STM32CubeMP13 开发包,STM32CubeMx 可自动联网下载。, ?) l- [( h$ e* d+ x$ L
1. 打开 STM32CubeMX,点击 ACCESS TO MCU SELECTOR,
; B2 p5 ?, k0 T2. 在搜索框中输入 STM32MP13 相应料号,如:STM32MP135FAF7,双击打开配置窗口) H, B- N3 d5 D( \" v- m0 h) w$ y
3. 弹框选择 MP13 Bare Metal,将生成 bare metal 工程框架。. u% W# M+ Q% C  \1 ]& F( f% `
3.png
  r; g4 r1 _: q2 @$ Z0 X) X1 e

' N/ E. R1 p! J1 v, N. A2 h! N" e▲ 图 3 STM32CubeMx 选择器件. ~  u8 }6 C  C* q  |
4.png
- B! J$ x4 ^7 H' @" T7 _' q

7 }$ {; G$ C. y5 y( F: i% i/ c▲ 图 4 STM32CubeMx 选择工程类型. e7 G  n% z2 V6 S+ p4 h

% I# D# T3 K# ^2 s; E

1 ~( Z; d9 X7 g4. 切换到 Project Manager 标签页,输入工程名称。
$ C+ e) Y; T* `2 z. U2 [5 J: K5. 在此页进行项目选项配置,可保持默认。  S' K4 I4 I; H" f. }
5.png . D4 \1 K3 }! k: g8 g
0 d5 V! G# m! X; h
▲ 图 5 STM32CubeMx 工程设置页面/ ]& Q) B$ G" G4 ]

1 r4 H; C! A- g  V4 l
( y6 k# u: k) h
6. 回到 Pinout & Configuration 标签页。
* |2 k0 x6 z' @) @7. 使能 RCC 和 DDR。& V. {4 j+ b- J) w0 d" Q
8. 配置各外设总线,配置方法与其他 STM32 MCU 相同(也可参考 Help -> Docs & Resources)+ s, s) {& m, U
( N3 e/ {9 T: c% J5 G$ h- @

$ D, Y% U: G0 g
- L* g7 K% C% R3 B+ ^# Z% i3 M  E+ _+ g
6.png
3 x6 e! b0 [8 x9 p# a2 ?

& I8 b" G4 s' }% }4 [/ W* e3 s5 ?▲ 图 6 STM32CubeMx 外设配置页面
8 H* S% {. x9 }( ~* b$ |
% P. s; s% X5 {- n( U7 v
9 z% H! |+ G& Z
9. 切换到 Clock Configuration 标签页。' a& S' u0 g- k, A$ \
10. 若软件报告时钟错误,可点击 Yes 自动修复。% y$ `2 e' {6 P, W; L
11. 输入 CPU、DDR、总线等的工作频率,系统会自动匹配合适参数。
7 p* d  }/ n; _- X: v8 L9 L6 l& I! J% Y- {
7.png 7 X7 K$ l$ n" O9 ^+ S( h1 W
▲ 图 7 STM32CubeMx 时钟配置页面
3 g) |3 @( F  E7 f2 x  x& ]! C' \; W' Y& Y) q6 _8 _/ N" `

; ?5 D  Z7 s. l3 q+ f12. 所有外设配置完成,即可点击 GENERATE CODE,开始生成工程代码。: b; E5 X% \7 p9 h8 Q/ n4 D
13. 若第一次使用,软件将提示是否下载 STM32CubeMP13 开发包,可点击“yes”,软件自动联网下载前述 STM32CubeMP13 开发包。
) L: o  u3 I  L5 g- k14. 生成完成后,可直接点击 Open Project,将打开 STM32CubeIDE 工程。
7 l( G) F" h! }7 ?1 t9 I* _- N 8.png
. G- W: _4 G+ L1 P2 T: m( p
- z# ~0 C$ e  n
▲ 图 8 STM32CubeMx 代码生成页面
" A& [4 B6 h  i' y, R 9.png   i0 N" ]% M1 A7 f  I, P* g, P
▲ 图 9 STM32CubeMx 完成代码生成页面
+ X2 a6 b; K" C% u! ^ 10.png
7 ?; b. G/ r! o
▲ 图 10 STM32CubeMx 生成工程代码示例" N" X8 S( p/ U' y2 P5 t

2 w: d+ [* K! D( a/ Z$ ^# B3 w
15. 至此,工程框架已生成,可通过 STM32CubeIDE 进行用户代码的编辑、编译、调试。! K; E, L9 c6 x. V) y
+ q' I9 K4 v+ c6 x

# m  s4 t* |4 G+ \, b3.2. 从 STM32CubeMP13 开发包导入工程
7 U! \- h- }$ f$ k若已事先通过 ST 官方网站或 Github 下载了 STM32CubeMP13 软件开发包,也可导入开发包中的工程示例代码,从示例代码开始进行项目开发。
( B  }" a8 w$ {/ w+ t
2 N$ @( E; \, C  _% }; F
这里以 FSBLA_Sdmmc1 工程为例。: j; k, M  \; s/ s5 G2 A! T# s- h
项目路径:\Projects\STM32MP135C-DK\Applications\FSBLA\FSBLA_Sdmmc1
) \% t9 H  U( o9 N7 Z4 C; X7 ~0 U1. 打开 STM32CubeIDE,导入 project" [7 g8 j& r* T
2. 点击 Files -> Import…
3 |6 s, @' O" m5 u1 f3 y7 r, { 11.png
. S8 @- g/ k0 j
▲ 图 11 STM32CubeIDE 右键项目菜单8 G8 o1 c+ g3 L

* i3 f! B+ ]- W: R+ Y

/ B. j3 C; G9 q4 S2 o5 Y3. 选择 Existing Projects into Workspace2 |/ W) g3 {! m! P) `$ M
4. 点击 Next>
3 \4 J* E. x0 V( ?% S 12.png + V1 W( n/ j3 q9 A2 v$ Y- _6 B) X

8 G( }, O0 D1 n( u- \4 K▲ 图 12 STM32CubeIDE 导入已存在项目
+ q+ u4 R+ b5 ?/ t! S# Y( ^. R& q
) f5 c6 G% L1 z# V  S4 I- V
5.点击 Browse…,找到目录 \Projects\STM32MP135C-DK\Applications\FSBLA( R8 g- ?5 A3 r! Q7 i
6. 选中 FSBLA_Sdmmc1_A7 工程: a4 P4 S- W! @, W$ q8 S
7. 点击 Finish,导入 Project
1 G+ m* G9 k/ v- U5 E( b. ? 13.png
: z- y4 ]! B$ C0 K3 v' Q
) A. y3 ]- F& B* w
▲ 图 13 STM32CubeIDE 选择导入项目
1 o9 Z6 B& J2 h8 [5 e2 V+ Z4 ^
3 x& |7 z! L* r# u# ?6 r/ j% c

, O" t, K, ?' e+ h8. 工程导入完成。: E  _" P) C9 @' d( o8 Y5 u+ A0 l' m
) U+ z( u* }7 T) G+ B; z  g5 ?
( \( H1 T' U7 l1 Z: a
04 STM32MP13x 工程的在线调试! Q/ P$ l$ v1 Z3 {1 n: u" b' x7 b" \
工程创建完成后,接下来本章节将介绍如何基于 STM32CubeIDE 进行工程编译及在线调试。7 ]- y6 i, d% s6 J. S
- U. N4 e6 p* _8 H* Q
STM32MP135 内部包含 128KByte SYSRAM,若代码小于 128KByte,可直接运行于内部SYSRAM 中,适用于验证一些简单的外设实例。若代码大于 128KByte,则需要将程序运行于DDR 中。下面将分别阐述。
" D3 d2 u' U3 |) C' P

. D) m+ |7 V9 @5 Y, i2 a+ g4.1. 在 SYSRAM 中调试程序) ?& k$ X- o) x6 q% T
仍以前述导入的 FSBLA_Sdmmc1_A7 工程为例。
+ {: Q' X* |% l% U/ B. G1. 首先,将开发板切换到工程模式
+ Q4 t& V% h/ d. c6 {( X2. 连接 Type-C 电源3. 连接 MicroUSB,这里板载已支持 ST-Link+ U2 d! X2 l* z# v- @8 |
14.png , L0 E8 J9 U7 R! r  n; \2 ?' `

  b, [% Y: }. K8 |& q, |▲ 图 14 开发板切换工程模式
3 O0 H3 H. `6 z- B" w
6 S" D8 ]- R/ X/ d
4. 右键项目工程名称,选择 Build Project,完成编译。. N8 h$ [6 l2 k' E
15.png
. U; f- ?9 P- d. p

( h; H3 {9 Z! P▲ 图 15 选择编译工程. h4 [, b  p* Y) Z2 j

! o/ j4 n) [0 k& w. U8 V) F
$ m+ }3 j% f+ \- G  E$ B
5. 右键工程名称,选择 Debug As -> STM32 C/C++ Application: }3 E- ^" O: ~/ F  j
16.png " [5 p5 o4 Q" a. l* P7 @

' s0 K, e  }% w1 s" l8 v! {7 H) I▲ 图 16 选择调试项目方法 1
1 ~& Y. l+ I/ R* L6. 或点击 Debug 图标1 Y* q) k2 T5 ^- F9 Q, I: h6 v
7. 进入 Debug Configurations….( `7 x9 U/ @0 P: q
17.png . d9 }$ y5 H& {& `& z; p
% U0 c! k( i6 H
▲图 17 选择调试项目方法 2- }( E: S) f$ V" }7 Q: F, s

! `  W. P) o3 d( L! y
: Y2 s% D: k  X5 f( p& b( T
8. 进入调试配置菜单
5 b- |* [9 ~6 m) M3 |; { 18.png
3 W/ f1 B8 i  ~9 ?& `
! M/ [4 {0 O  |+ k( K  u4 T9 n# q
▲图 18 调试配置页面0 S' c' r% Q- z$ @6 F8 c

$ y3 t6 ?# z2 }- \/ |) V7 }
$ N6 a2 r( |( z
19.png
& I. w- W' s. _" \; [

; c) X' V8 h) q' o: r5 i/ b8 `4 G( `7 e
3 m+ i7 L6 }" ^& C

6 x/ v6 F  A* ~( L0 I! w9. 即可像 MCU 一样调试您的代码。" a& Z! g8 h8 D
20.png
1 G* E8 K; ^3 s- n
. O$ V" ?! Q' {" j
▲图 19 项目调试窗口+ P* q. v+ K3 c9 N& f$ l
! r, M/ e8 r0 [
4.2. 在 DDR 中调试程序
# q/ J; H% O* B/ u3 F当代码量超过 SYSRAM(128KB)的大小时,需要将程序运行在 DDR。这里以 BSP_BasicTemplates 工程为例展示如何开发运行于 DDR 的用户程序、
' `' W7 N/ O  ~) x4 U/ m- z
! @, I3 T% ^- }( Y
1. 首先,按照前述方法导入项目工程$ k3 w# T5 K( ~
21.png - P" a/ N9 ]  L. A) H

7 A" L# O  a1 {3 V▲图 20 导入 Templates 工程; ^) c$ R$ t" ?* L( Z- X6 X
  ^0 |8 h4 E" C, ?" P. I4 a, \

! _, h3 B1 e; p2 K( }+ N; J& B2. 打开 C/C++ Build 配置% x  I! U" Z$ K% w
3. 在 Preprocessor 中添加 USE_DDR 宏定义# r# G% z* g( ~- ?
22.png / x& r, x  d, u3 ?$ M

" Z- |3 k4 ~4 x/ y$ r+ y▲图 21 使能 DDR 宏
; S( |/ y2 V5 f8 s
! U8 T  q6 w- r( u- P+ |

5 X; ~. O6 ?4 @, g( Z. y4. 修改链接文件,重命名为 “stm32mp13xx_a7_ddr.ld”1 w+ @. b) \. ~2 L
5. 修改 REGION_ALIAS 定义到 DDR 区域:  t. G9 p: G8 }9 g0 }
6. 重新编译后,目标文件将链接到 DDR
7 O& G9 A: \. |' A; ? 23.png
) h# K5 R* s3 I" h$ O1 y: Q
! {+ K( A2 m: G3 p+ z
▲图 22 修改链接空间$ V; F; K% |1 Y. ?* H: R
24.png + ?  O+ n' x# S! z* |) ^9 m
7 C3 d  k2 E9 t
▲图 23 选择链接文件
3 V, d2 b2 O. C7 ], p  J) K& s3 ^3 q" E
7. 在调试之前需要先运行 DDR_Init 对 DDR 进行初始化8 z- U2 k2 P) v
8. 按照前述方法导入 DDR_Init 工程,编译后全速运行一次,并保持开发板不掉电项目路径:\STM32MP135C-DK\Examples\DDR\DDR_Init
7 s+ f2 ~2 |5 L" q9 G 25.png 2 q# e, v% l% {& \
3 u8 X2 D* ?5 m4 L) K8 j2 b; q
▲ 图 24 运行 DDR 初始化
: y$ W0 @1 X0 J3 h3 X- e
4 t& f8 B& z# J" @
6 Y) M3 V( F7 Z+ A& R6 j
9. 回到 BSP_BasicTemplates 工程。$ t, {$ P2 H, z) a5 e# S
10. 在 Debug configuration 对话框中,将 Startup 页面的 monitor reset 删除。
/ Q2 i7 b% M' h; s, { 26.png
& X/ \- T% h. [9 |
% b! _- j7 ?7 C% v4 X
▲ 图 25 修改调试参数, |! m$ k) {; {2 A5 n, s! `+ M
4 B) \: [' y8 _; x6 P: ]9 p

% M7 Z2 J& p* E11. 点击 Debug 进入调试
( E% X: S' _/ e" l/ d/ c12. 可以看到当前 main 函数的地址已经为 0xC000 开头的 DDR 位置7 _. I! H4 K& @' Z! W4 F

3 [# d2 W( h" F1 ?: Z8 b! W6 s

$ D! r2 }* p6 j! r1 y" i4 M% H5 B 27.png 2 Z: s* M9 ~: W; t/ q
9 d* Y3 L- H( G7 b! `. K, m. l; X  w
▲ 图 26 在 DDR 中调试工程
5 k+ d; _" p' m# M; A) ~: f, j! ^9 ^2 X) }- a- t
- ^8 f: y, q  r. H; Z1 O0 K
05 从外部 Flash 启动
- l' b$ ^* u2 D% ]9 ?' ? 28.png
: k- k" V5 `5 P, e0 ]
: ?0 r: ?/ P- n
▲ 图 27 STM32MP13 启动流程
8 t3 u0 l9 v: M; G- `2 H$ i2 W( \4 K
从外部 flash 引导 STM32MP13, 一般需要包含两个部分源码。如上图所示,芯片上电后,首先运行内部固化的一段 ROM CODE,ROM CODE 从用户配置的启动器件中寻找 FSBLA,并将其拷贝至 SYSRAM 中,FSBLA 运行后,执行 DDR 初始化及用户代码(CUBE EXAMPLE)拷贝到 DDR 中,最终实现跳转到 DDR 中运行用户程序的目的。* G% q. L4 A* K9 w

' u4 l5 k3 x( m1 ^
这里以 SDCard 启动为例,在第三章节中,我们编译调试的 FSBLA_Sdmmc1_A7 工程,即实现了 FSBLA 部分的功能,BSP_BasicTemplates 工程为实际开发的用户项目。完成启动需要将这两个工程生成的镜像文件都烧录到 SDCard 中。
% W: l7 H5 Q1 X
; F$ ^5 g0 g0 l0 Y3 d1 _
• FSBLA 需烧录到 SDCard 的固定位置 LBA128 或 LBA640,ROM CODE 固定从这两个位置寻找 FSBLA。
/ e: {* O4 f! ^( f; z# B& ^• CUBE EXAMPLE 的存放位置可在 FSBLA 程序中修改,默认为 SDCard 的 LBA640。4 C* Z9 {8 {, g2 }, z* x1 o
• 如果有烧录过 OpenSTLinux 的卡,需先格式化。原因是 ROM Code 优先从 GPT 分区表中寻找 FSBLA,若分区表存在,新烧录到 LBA128 位置的 FSBLA 将会被忽略。
# q9 O' d9 W# b" w( n( _, t 29.png
" n2 x1 P+ T6 R4 p
▲ 图 28 镜像在 SDCard 中的 Layout  Y' _" S& D+ _/ P" n/ S
6 z/ ^2 `: G" U3 a
需要注意的是,FSBLA 和 CUBE EXAMPLE 都需要加入 STM32 Header,才能被系统识别。STM32 Header 是 ROM CODE 加载二进制文件的必要格式,每一个被 ROM CODE 加载的二进制文件都需要在头部添加特定的 STM32 Header。STM32CubeMP13 开发包中提供了ImageHeader 工具,用于为项目二进制文件添加 STM32 Header。开发者不需要深究 STM32Header 的详细内容。
( g; b5 J" B* Y) b; y( u 30.png 9 R% X9 k' O" q  E# r- e# k
▲ 图 29 STM32 Header 信息' H3 `9 ^7 h5 A

8 g; P, M( g, G# I1 j
为用户程序加入 STM32 Header,可在工程配置的 post-build steps 中加入如下命令:& {& ^' b! |; Z6 M' @7 p
“(path_to_STM32CubeMP13
7 \2 C: e1 G8 Y; q3 @Package)/Utilities/ImageHeader/postbuild_STM32MP13.sh"
$ e+ S2 C, K; y7 u) i/ i"${gnu_tools_for_stm32_compiler_path}"
% p6 x  C  ]0 ^4 H2 y% P"${BuildArtifactFileBaseName}"
7 y! E  D$ @. a; t
7 J  Y. Q# |7 g6 [! H3 T% z/ Z

. P# t  ~$ l4 U9 k, h8 Z重新编译完成后,即可生成打上 STM32 Header 的目标文件。
# h9 l5 j7 Q% f! P$ K8 F1 N) X6 k2 ` 31.png 0 r- Z3 ?/ Z7 d( a2 u6 _
▲ 图 30 添加 Post-build 命令" K, m, O: P2 F2 T) i
2 t8 S) A2 \: {1 _; N, W
注:path_to_STM32CubeMP13 Package 为 STM32CubeMP13 开发包的存放路径。
' g: f0 p; f7 `8 b* p( C1 n
" S- X( r. c8 n+ u
至此,已准备好待烧入 SDCard 的目标文件:
- ?9 [, ^  T, o' K8 N1. 已添加 STM32 Header 的 FSBLA_Sdmmc 目标文件:FSBLA_Sdmmc1_A7_Signed.bin (即 FSBL)
0 s  S- B3 C" H; D# l$ A2. 已添加 STM32 Header 的 CUBE EXAMPLE 目标文件:MP13_BSP_BasicTemplates.stm32(即用户工程)& a  }, v7 D2 r+ I

3 b2 k8 h" o2 v
烧录工程位于 STM32CubeMP13 开发包的如下目录:
! I. B9 G- r8 e2 n\Projects\STM32MP135C-DK\External_Loader,以二进制的方式提供了烧录时需要的两个引导文件,包括:# o8 I1 c; G, C4 X, a0 \: o" E
1.STM32PRGFW_UTIL_MP13xx_CP_Serial_Boot.stm32
) r5 R8 s' Q& y7 |$ {1 E( E2.SD_Ext_Loader.bin其中,STM32PRGFW_UTIL_MP13xx_CP_Serial_Boot.stm32 为基于开源工程。
& ?- N8 t9 D2 {( ?/ c3 V, _4 l* A7 N4 c+ T: d
% z4 V5 p) F* G. ]) f- v8 Y
Openbootloader 实现的一套 IAP 应用,执行烧录流程管理。SD_Ext_Loader.bin 工程执行SDCard 设备的实际擦写操作。
/ X" W/ c& p' j& f6 {; B% Z, b6 p. Y; ~$ N/ `4 }) `" F5 _
8 g! \$ P" B- y' e9 O! J
目前,引导设备可支持 SDCard,QSPI NOR FLASH、EMMC 等,若项目开发中需要修改适配不同的存储设备,可联系 ST 窗口获取烧录工程源码。
: v# U) I# p9 t( y' [
9 ?, d+ T# _. Y( D: j
将需要烧录的两个文件拷贝到 External_Loader 目录下,与烧录工程的两个文件存放在相同位置,然后修改 tsv 文件。完成后,目录中文件列表和 tsv 文件内容如图所示。
. @2 ^  ]8 W* K8 U# b 32.png
8 Q! E+ n/ `2 g% r
▲ 图 31 烧录文件列表* C1 _/ x. Z  r$ |# q: b( I
33.png
" I3 L8 l/ X1 I9 U6 ], P- I+ z% t
▲ 图 32 tsv 文件内容5 O# ]4 W4 D3 Z1 v( [

. D: C* b, s6 Q: d! {
$ @4 g( ?, r6 n) S) }4 M2 E
接下来,即可使用 STM32CubeProg 进行镜像烧录。可支持通过 USB 或 UART 连接,不支持通过 ST-LINK 连接。这里以 UART 连接为例:" r5 U/ F! s+ V7 Y
1. 开发板跳线设置到 000 并上电
+ c2 b( X( S- a# e2. 连接 MicroUSB 口,查看 COM 号。注意通过串口连接时需要断开 USB OTG
5 Q3 S  a* y7 c8 h9 U/ f3. STM32CubeProgrammer 选择连接方式为 UART,选择相应 COM 口
( C  B" w9 A- _1 ^- S4. 点击 Connect 连接/ g0 e* X9 _* N1 _) {6 \1 r
34.png 1 k+ o& P+ Q) ?" s3 r$ D% S
# q; x5 e( `% }2 U' q: N
35.png
/ Z3 c1 U* }* _1 G( k* L: S5. 点击 Open File,选择 FlashLayout_OpenBL_ExtLoaderSDMMC_SerialBoot.tsv 文件2 K/ P$ k- D/ l3 N: h6 }9 o2 N) U7 l
6. 点击 Browse,选择目标文件夹:\Projects\STM32MP135C DK\External_Loader\SD_Ext_Loader
7 h( q9 c1 Z% y% I4 ~7. 点击 Download,开始下载镜像
  Z/ b9 y. b; \/ b 36.png 9 @& W6 i. J( m
& @# _: M2 O- A! f
37.png 4 {- C/ J% @/ Z
2 U7 P; U: Z& u, W/ I5 a
8. 等待烧录完成
) j+ V* I4 F. t7 W& C0 R: i' T% p9. 将板子断电,boot mode 切换至 SDCard 启动3 ^  O1 i( d# r8 g) D8 ?& y
10. 重新上电,即可引导启动
# w' u8 A' M0 V$ F6 A1 ?. f 38.png $ L" ]7 Z6 ]" D- R( @
% R5 R4 b: [# n# k8 ]
转载自:STM32
' a) k9 Y. s& V' ]
# A* g" v! T/ J* H  c, ?7 S: [6 j2 a; o* B9 t7 v! Z; ], `! w$ R
赞 收藏 评论0 发布时间:2024-11-22 19:09

举报

0个回答

所属标签

相似技术帖

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