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

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

[复制链接]
STMCU小助手 发布时间:2024-11-22 19:09
01 引言
: }/ d' R1 ?3 a, R3 d& q: ~STM32MP13x 系列 MPU 是 STM32 Arm®Cortex® MPU 家族中的一部分,它拥有单核Cortex®-A7 核心,支持核心频率 650MHz~1GHz,不仅能够轻松运行 Linux 操作系统,还同时提供官方 HAL 库,用于支持基于 RTOS 或无 OS 的项目方案,即裸跑应用程序。/ A8 P" }: [4 w

) R0 c7 d3 ]6 F" Y0 n" Z2 t$ ~# Z
本应用文档将就以下几个部分简述如何在 STM32MP13 系列 MPU 上开始无 OS 项目的开发:) J/ ~2 G/ `3 }3 C, O* U; a% a% k3 w
• STM32MP13x Baremetal 开发环境简介
0 M' U( M1 f; n/ m• STM32MP13x 工程的创建
; C8 M# ?5 \# y& I• STM32MP13x 工程的在线调试8 ]: R7 v; S2 L
• 镜像烧录及从外部 Flash 启动
  b1 e% o5 z: ?+ E) _+ G
  P, C: E) q+ ^* Z$ n6 X
02 STM32MP13x Baremetal 开发环境简介( f6 i. P( m; H& i+ W0 ]* N  X! R
2.1 开发工具及环境
* f+ v1 i& f' u' \STM32MP13x Baremetal 开发工具主要包括:
8 G% v# N. ?: H: W# r( j; L1. 烧录工具:STM32CubeProg ( 版本大于 v2.15.0)
  t) q5 c+ F( X. b4 Z2. 配置工具:STM32CubeMX (版本大于 v6.10.0)) L$ m# k8 z; D  _
3. 开发调试工具:IAR(版本大于 v9.50),或 STM32CubeIDE(版本大于 v1.14), N, a" X8 ?/ W3 u3 d8 A* u5 K! P
本文示例基于 STM32CubeIDE 开发调试工具。5 C" V( b6 u9 M  l4 }$ Q
' ?2 Z3 t* A* f+ p( ^) f. i  [
! C" F2 h/ [9 V8 k$ D
2.2 STM32CubeMP13 开发包
0 q% x" r) w7 G9 A1 e8 O; _. H8 BSTM32CubeMP13 开发包同步发布于 ST 官网 www.st.com 和 github.com,可通过如下方式下载:
# B0 C9 {* S! u- B* ~3 P; Y6 Z1. ST 官网下载链接3 k. n8 D2 D; m. U+ j8 N: r; K
2. Github 仓库链接
* R2 C$ [( R" K1 j3. 通过 STM32CubeMx 软件下载% G, P  t. L9 v1 n9 |

2 B  F! E' f8 ~- b4 T3 r
2.2.1. STM32CubeMP13 开发包总览$ @- w# N7 r% _! ]
STM32CubeMP13 开发包运行在 Arm® Cortex®-A7 处理器上,由以下三部分组成:
8 {+ C# y* u# b. J" Q) H* Y/ z• Level 0:驱动程序,包含 HAL、LL、BSP、CMSIS
! d' a. Z# `5 u• Level 1:中间件,包含 Eclipse ThreadX(原 AzureRTOS),USB Host & Device 库
. t( R4 \7 l/ ^/ H3 ]• Level 2:包含各种板级示例程序
$ a+ l' \  O& I& k* G/ a1 M除此之外,还包括一些工具助手等。- w  g8 o5 c' l

, V, _5 ^. o" W! X7 x7 w5 ]6 {" k- i

. ^" K5 u( k4 Z. `/ L 1.png
9 j" ]/ \1 k( d5 d& N
▲ 图 1 Baremetal 开发包源码框架
3 X7 n' P0 D; I2 j9 `; Q! L
3 {* j- Z% M- L( I8 U
9 H" w* a: C0 v
2.2.2. 源码目录结构
2 t& Y1 J. ?% e' u 2.png 7 H' i0 L* @0 R; {8 W+ \; y
▲ 图 2 Baremetal 开发包源码目录
$ _5 x! d) p& a3 u6 x! n7 k' j% X) ^$ S: L) Q
2.2.3. 开发包支持模块列表
# }0 A. Y2 A; |6 ]  h已支持的 HAL drivers :
/ Y- r# V$ H3 K7 g0 ~• 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
' H4 w9 K8 A; o' n6 f
  H, N- o9 N% }. d
已支持的 LL drivers :% Z# T) o; @4 ~% Y
• ADC, DMA/DMAMUX, EXTI, ETZPC, GPIO, I2C, LPTIM, MDMA, PWR, RCC & BUS, RTC, SPI, TIM, USART
- g! t- d- W! u; N. o# [
, N2 e" X2 ?$ A8 c* Z5 Q3 j/ N
BSP 与 BSP 组件:
- i3 e+ R+ K4 q2 C• 基于 HAL 封装了更高一级的 API,为 LED、按钮、相机、LCD、SD 卡和 COM 端口提供 API,包含了以下一些外围器件的驱动:GC2145, LAN8742, MCP23x17, RK043FN48H, STMIPID020 D0 c8 L; x7 F4 Z

) J9 R0 |, _. u- @, u/ h6 _
中间件程序:
- p/ e# f, F/ z: D0 B' X+ C• 包含一系列支持某种服务的库文件及接口文件,目前已支持:Eclipse ThreadX(原 AzureRTOS),STM32_USB_Device_Library,
: J4 T2 [# j3 X4 S+ LSTM32_USB_Host_Library
. L* S0 O( F8 X6 d" g% m9 ?  N) ?& c
项目工程:
0 {7 P& Y% h/ t0 {) c) l• Examples:基于 HAL 接口的简单示例,没有中间件功能。
" C, O4 W  Z$ ?4 S- y# {• Applications:较完整的工程应用实例,包含中间件功能。
" L, G0 \; n* s& P5 f• External_Loader: 烧录镜像及从外部存储器启动的应用示例。, i5 g8 W9 R# @; |6 R: _
• Template: 板级工程应用框架。8 p) I+ S  m0 c, X" l

" R8 X2 x4 S. w6 M% p! V
实用工具:8 o: b" b: `; u) J2 P+ }3 l
• Imageheader:用于添加 stm32 头,支持存储设备启动。& s2 x& ?3 c9 K& C! h' a
• Fonts:提供了一组用于显示的标准字体,包括 font8,font12,font16,font20,font248 w+ @( Y! y+ U1 `  A- G% ~
/ l' v0 w7 n, Q  e

" X% W6 g  O8 e( x03 STM32MP13x 工程的创建
- R! N7 q" L& Q4 s& YSTM32MP13x 工程创建,可通过以下两种方式:
7 u/ m/ r+ Y; ~5 W. }6 Z1. 使用 STM32CubeMx 配置并生成项目框架代码,并基于该框架代码开发应用。
$ y6 A. Z) z0 h2 n8 j2. 导入 STM32CubeMP13 开发包示例工程代码,并基于该示例代码开发应用。5 ^' r. ]+ w0 X4 A0 k

2 @$ }/ u/ {) x3 U$ X8 q# l5 A3.1. 从 STM32CubeMX 创建工程
: H+ t% w9 P: x+ P0 o7 B0 e1 \( NSTM32CubeMX 是 STM32Cube 工具家族中的一员,它采用简单易用的图形界面,可以帮助开发者快速配置硬件和软件。可支持从 MCU/MPU 选型,引脚配置,系统时钟以及外设时钟设置,到外设参数配置,中间件参数配置等,并可生成适用的 C 代码项目。
  s, v) F. L: }' l( P# Q
5 Q$ x1 U5 }6 b, q$ h$ l
本章节简述如何通过 STM32CubeMx 生成适用于 STM32MP13x 的裸跑应用框架。使用该方式无需提前下载 STM32CubeMP13 开发包,STM32CubeMx 可自动联网下载。
( Y6 D, S& H; z: }1. 打开 STM32CubeMX,点击 ACCESS TO MCU SELECTOR,
  v- F9 x1 y) {- R; x  `, f2. 在搜索框中输入 STM32MP13 相应料号,如:STM32MP135FAF7,双击打开配置窗口
3 O) g5 I& a4 g1 Y, D; q9 s3 O3. 弹框选择 MP13 Bare Metal,将生成 bare metal 工程框架。! s, ~! N; L2 ?: @
3.png 4 G0 r' I& P: u+ q
/ `- [  E+ \* d  g/ Q$ I* m8 {
▲ 图 3 STM32CubeMx 选择器件
# S  L- n9 K3 x% _8 Y( d: I 4.png
6 w; T, G3 ^5 p4 X1 D9 U8 l
; s' t; k- ]4 @# C5 x& B
▲ 图 4 STM32CubeMx 选择工程类型8 N9 x1 q5 {. Y! ^$ ^# K3 D- }9 r
& i" z* a; f) W  u8 I

' R. d, f+ P9 [- H8 l9 C) |4. 切换到 Project Manager 标签页,输入工程名称。
8 x- D$ o0 k* \( d5. 在此页进行项目选项配置,可保持默认。; Q5 O$ S1 s1 D* ^6 K) [3 n2 a% r' k
5.png
+ T& Q. m; |$ D. @

4 ?; \$ J! ?4 ?' C& w, z$ \6 D▲ 图 5 STM32CubeMx 工程设置页面  T( g) ?3 a4 ?3 T4 j
1 ]0 l7 W1 N" A$ I
/ N* V& q- C' T1 W& Y( m( S6 |
6. 回到 Pinout & Configuration 标签页。
0 R$ R  U- i9 ?) C: L0 [, z7. 使能 RCC 和 DDR。
; }9 A1 m' G' D4 |* h# H8. 配置各外设总线,配置方法与其他 STM32 MCU 相同(也可参考 Help -> Docs & Resources)
% W: b; s( ^) f) i" l- n8 v9 Z. n: B
6 s; V% p! }7 i6 B" k

, w: ~! F3 g# G 6.png 1 l$ N, |' r, {- U5 e- I: _6 [
. p" x# Z  R4 e$ ^
▲ 图 6 STM32CubeMx 外设配置页面
5 ?7 t6 E! o: x7 l* ^! r( C+ g% q  n5 B, ]

" l: A) l9 j+ a4 J3 S* W) |/ N! b' A9. 切换到 Clock Configuration 标签页。
+ {; Z* I" D3 F, ~' F8 c6 t. D10. 若软件报告时钟错误,可点击 Yes 自动修复。
3 y  b0 t0 k* P11. 输入 CPU、DDR、总线等的工作频率,系统会自动匹配合适参数。# k* q: `( _# W

+ t% S0 N0 q3 E6 @
7.png % }7 a! S6 K8 L3 T5 W& \$ J+ l" i
▲ 图 7 STM32CubeMx 时钟配置页面
' X% I9 {/ z+ m3 v! K" O7 R5 V" n1 M- N& N
- Y  n5 G& W1 m. |1 H) d/ O% i
12. 所有外设配置完成,即可点击 GENERATE CODE,开始生成工程代码。
) \: C8 ~6 B% D1 z13. 若第一次使用,软件将提示是否下载 STM32CubeMP13 开发包,可点击“yes”,软件自动联网下载前述 STM32CubeMP13 开发包。1 z$ [7 W; ^) v# U- n# S' Z4 a8 u
14. 生成完成后,可直接点击 Open Project,将打开 STM32CubeIDE 工程。% b2 Z; x2 L# q7 J  P
8.png 2 k! Z+ t3 U8 G! ~
6 D1 H0 i2 C$ v( S& P$ Q
▲ 图 8 STM32CubeMx 代码生成页面( I0 {- Y# E9 t
9.png / w2 M, f7 X" C. T
▲ 图 9 STM32CubeMx 完成代码生成页面
4 r, L+ w# F+ I' I0 j8 e 10.png $ {3 K. _( h$ [7 |- ~* ~
▲ 图 10 STM32CubeMx 生成工程代码示例( y) y4 b7 X: B( [

5 b* R3 o2 S4 X, \5 F; _% E
15. 至此,工程框架已生成,可通过 STM32CubeIDE 进行用户代码的编辑、编译、调试。
) z) U! F8 \; e9 I8 a5 V- R( V9 `( d' D' r+ x, J

& e8 _' i1 F# W5 M2 V7 g3.2. 从 STM32CubeMP13 开发包导入工程
; |2 \1 o) i# c* j! n/ i& d若已事先通过 ST 官方网站或 Github 下载了 STM32CubeMP13 软件开发包,也可导入开发包中的工程示例代码,从示例代码开始进行项目开发。' Z) ~6 V6 e7 {6 [/ A$ U" ^( o

  d* w% j$ P, d) B0 J6 h
这里以 FSBLA_Sdmmc1 工程为例。
; c- ^  m0 \5 G2 g5 [项目路径:\Projects\STM32MP135C-DK\Applications\FSBLA\FSBLA_Sdmmc1
( A0 _6 O8 s/ b7 {- t1. 打开 STM32CubeIDE,导入 project
3 s3 E+ M; k" _/ ]  M( h, ~2. 点击 Files -> Import…
! W1 d0 n8 Z: [3 H% m 11.png
; f0 c! @5 `5 Z( I
▲ 图 11 STM32CubeIDE 右键项目菜单
6 \( h+ Y$ R- h7 L* A  P% H6 ~- q# A( @) m* s

$ r) G( d" q  J7 Y9 ^' }3. 选择 Existing Projects into Workspace
3 J6 @; \, i( P3 g" j! _4. 点击 Next>4 o% h7 s7 c, W6 N' v& j1 H8 N
12.png 9 {, m0 J2 x5 L' K, B
8 O5 ]( y( }# y) e' M) Y) c
▲ 图 12 STM32CubeIDE 导入已存在项目
2 H) |, g- J) w
7 Y. T: Z9 D6 {2 m+ J
/ n# w8 H+ L* C% c& |" V% `
5.点击 Browse…,找到目录 \Projects\STM32MP135C-DK\Applications\FSBLA% }( g/ {* T+ b. V7 k7 b
6. 选中 FSBLA_Sdmmc1_A7 工程
4 E" v' @( o$ B% U' i7. 点击 Finish,导入 Project
, \0 k; p$ A! u4 C2 b$ w 13.png 2 B0 e  S3 ?1 V: c( p

$ Z0 a8 Z7 ?1 [" x. `▲ 图 13 STM32CubeIDE 选择导入项目
7 ]7 Q6 E6 }  m$ Q( R: {/ n# d: ^( U& _6 `

" E9 |* g/ @6 L8. 工程导入完成。
# C1 V3 \+ U# h6 k8 ~- o7 T/ E' i8 B+ X" ~7 r

+ I" ]5 P# g, j: D  ?04 STM32MP13x 工程的在线调试
: ^/ p/ T9 h; @8 z2 Z0 J工程创建完成后,接下来本章节将介绍如何基于 STM32CubeIDE 进行工程编译及在线调试。
" E9 H& }& }1 m; J, J2 K" K/ ?7 r7 L) X: ?- E
STM32MP135 内部包含 128KByte SYSRAM,若代码小于 128KByte,可直接运行于内部SYSRAM 中,适用于验证一些简单的外设实例。若代码大于 128KByte,则需要将程序运行于DDR 中。下面将分别阐述。& m; L3 x/ d! N7 p+ B" I( w+ f( e

& v+ M5 ?9 t9 _  Y( g4.1. 在 SYSRAM 中调试程序
* {* @' O1 H0 J. w) t仍以前述导入的 FSBLA_Sdmmc1_A7 工程为例。, W2 K- b- T! D1 J6 D* |
1. 首先,将开发板切换到工程模式+ ]5 j7 A0 ]( X% V3 P
2. 连接 Type-C 电源3. 连接 MicroUSB,这里板载已支持 ST-Link2 n. Z; |+ n9 p7 a2 h8 Z& m1 M
14.png 7 q% f9 O+ w5 \# Z  y
+ \% v( ]8 ]) d" n9 D' d
▲ 图 14 开发板切换工程模式
7 Y( K9 s- `& v" ^, d" P# A# ^. O* |! N" O) O) r/ c- [
4. 右键项目工程名称,选择 Build Project,完成编译。# P, w% Q$ u. N* k; J' b
15.png ; ]! M' }& _) v* V$ W) n' q2 _6 z

7 v) q0 |* W9 I& v: }+ u▲ 图 15 选择编译工程
7 A; i+ X+ e  f" d! a5 R
8 \2 y% W8 n$ w/ S  V) P- B2 h
8 c; c- w2 e; d* x
5. 右键工程名称,选择 Debug As -> STM32 C/C++ Application
9 C& }' O7 Q2 A( s! @8 G6 q 16.png $ B5 z& v5 p! h6 T
! g1 [3 l& A6 o3 Q4 p
▲ 图 16 选择调试项目方法 1
0 M' `2 y" Z) V- Q6. 或点击 Debug 图标
! ]0 R. H! a: R: X7. 进入 Debug Configurations….; @1 v, b2 U, |; Y# N  L
17.png & I0 A! p1 Z* y5 Z
8 ?$ R& @6 A- v1 b: a7 N$ b
▲图 17 选择调试项目方法 25 y) U! g! p3 U) _) S' a
+ M  t1 l2 V8 ]* @2 w
1 O0 ~! Z* i7 ~1 l
8. 进入调试配置菜单
# p! p& e% |# k- z 18.png
1 U! n* t- o" J3 i  I/ `
& v' x" O0 n" z. \
▲图 18 调试配置页面+ Y2 G" F4 `+ m+ t' `4 v
8 n3 D' J# b  S( A/ O
" J  J1 U. k  F$ }8 d3 o/ A
19.png ) D$ O  [9 D7 n7 O

+ k8 U" J$ ?8 r  c+ |  Y6 v8 I. {# K% Q- C

/ F7 t) @. G$ E6 Q+ H2 ^4 L9. 即可像 MCU 一样调试您的代码。
* B+ B& }4 s- @: @ 20.png ( |( q( {$ M: A0 Q/ ^
! s+ c$ K' B9 f+ O4 _" p
▲图 19 项目调试窗口
. `5 _7 d" h; W* [: n6 }) [* @+ c
7 n! n  N+ g+ ^( [8 ^& w" _( l% U7 T4.2. 在 DDR 中调试程序
- w  m: d9 v+ V. |9 J  _  H2 g当代码量超过 SYSRAM(128KB)的大小时,需要将程序运行在 DDR。这里以 BSP_BasicTemplates 工程为例展示如何开发运行于 DDR 的用户程序、5 S/ y8 n  l* u) L, [2 H% H* O
. x+ ?+ F# _% G5 I2 G$ o! g0 E2 R
1. 首先,按照前述方法导入项目工程% m/ v5 X- w: w# _* Y* C% r* N/ X
21.png
0 |8 @0 u, n( J( ^

1 G6 B' }3 h* q7 F& o8 }( v$ R▲图 20 导入 Templates 工程
& J: Z9 Z0 x! |4 \
. X( e1 N1 e, Z/ h6 h4 l
" }- @( q3 q$ R6 s7 W
2. 打开 C/C++ Build 配置# p" r5 `! `1 s
3. 在 Preprocessor 中添加 USE_DDR 宏定义
, S8 c: F9 `# u; @. V3 Y& U 22.png
% c1 |. U+ l+ O( _$ ]

: F2 J" A- G9 G, r▲图 21 使能 DDR 宏
0 K' G9 T# v: L
" \' A" D1 z" t4 `3 M  u
/ f1 p* D! d; o, ~4 B1 ^& I- l$ H
4. 修改链接文件,重命名为 “stm32mp13xx_a7_ddr.ld”8 t9 K2 p9 Q1 s" J9 K% {
5. 修改 REGION_ALIAS 定义到 DDR 区域:6 b3 K$ P" I( N& C- z1 p
6. 重新编译后,目标文件将链接到 DDR3 T& A/ k( X9 t' ?4 a
23.png 1 M3 \1 N3 t3 R% K
0 x9 n/ s( V* r% R+ ]
▲图 22 修改链接空间
' h2 m5 y/ Q/ r+ q5 X5 L* Z8 M 24.png
8 {0 L( _. K7 R
7 y6 V+ H+ W, A
▲图 23 选择链接文件
' G/ ]6 `* \) E6 u
6 b) ~. H: n5 H+ e! M
7. 在调试之前需要先运行 DDR_Init 对 DDR 进行初始化$ \* M' ^2 G  U2 d9 c. L
8. 按照前述方法导入 DDR_Init 工程,编译后全速运行一次,并保持开发板不掉电项目路径:\STM32MP135C-DK\Examples\DDR\DDR_Init
1 C$ x) W* ~0 M* e: |0 r 25.png / q$ x" {3 R" k7 G5 ^  J. u$ L' a: X+ P
& s9 b9 o2 u/ U. L) U$ m5 F; P5 \
▲ 图 24 运行 DDR 初始化
5 `9 F& T6 R+ b7 a- j/ ~# o9 m. u' w+ f+ Z4 U4 q6 J
: O4 L( G6 K  h) O. V
9. 回到 BSP_BasicTemplates 工程。
- t* k9 \; J/ P* r! C9 K$ K4 B10. 在 Debug configuration 对话框中,将 Startup 页面的 monitor reset 删除。
/ P: \4 ]# `; w1 _2 ~# ~ 26.png * y% v, `* k# B1 T% q
  Y2 I7 @! w( K; x+ u
▲ 图 25 修改调试参数) \9 H' Q& f6 r- L* w. p( p2 s

: g# ~6 P- [% I2 _* D& e! [3 A" I
7 [$ r6 W; x. A4 w) J1 F
11. 点击 Debug 进入调试
9 k. @, d+ p+ ^" h3 n12. 可以看到当前 main 函数的地址已经为 0xC000 开头的 DDR 位置) J1 y, W$ r5 L) E. Y" G

& n9 x6 m& d  D% T

% `2 b5 e& `4 b0 H, `5 X 27.png
* t, m. K# Z7 K* ]" }1 {7 \

( _; Y) W( b- u3 U/ C& N$ |: ]: c# n▲ 图 26 在 DDR 中调试工程+ w' B- @$ C1 W: }

; a. [1 ?! `, I9 B- `% P! t5 n: }

9 x5 Q4 e( s, I1 a1 G8 y5 C$ [, R2 D05 从外部 Flash 启动
0 I, i1 C, d- Q- K 28.png
# D2 ~' b+ L' F. @% E1 A

9 R  K# w4 _( t1 Q1 O▲ 图 27 STM32MP13 启动流程
' }7 g  d/ w5 O- l. I% ^& _$ g9 |" |0 ^8 @+ e
从外部 flash 引导 STM32MP13, 一般需要包含两个部分源码。如上图所示,芯片上电后,首先运行内部固化的一段 ROM CODE,ROM CODE 从用户配置的启动器件中寻找 FSBLA,并将其拷贝至 SYSRAM 中,FSBLA 运行后,执行 DDR 初始化及用户代码(CUBE EXAMPLE)拷贝到 DDR 中,最终实现跳转到 DDR 中运行用户程序的目的。
& M# b# J% I5 S+ N8 l+ ?0 e0 W8 }* f' t1 X( P& C8 Z
这里以 SDCard 启动为例,在第三章节中,我们编译调试的 FSBLA_Sdmmc1_A7 工程,即实现了 FSBLA 部分的功能,BSP_BasicTemplates 工程为实际开发的用户项目。完成启动需要将这两个工程生成的镜像文件都烧录到 SDCard 中。
2 y/ u+ d) n1 ]8 B# G& p4 ~
5 q4 S- W2 S! K9 ?+ y* D& @
• FSBLA 需烧录到 SDCard 的固定位置 LBA128 或 LBA640,ROM CODE 固定从这两个位置寻找 FSBLA。
  u2 Y4 f% g3 N3 b( z* J• CUBE EXAMPLE 的存放位置可在 FSBLA 程序中修改,默认为 SDCard 的 LBA640。
0 ?- L% R$ U: n4 M1 g• 如果有烧录过 OpenSTLinux 的卡,需先格式化。原因是 ROM Code 优先从 GPT 分区表中寻找 FSBLA,若分区表存在,新烧录到 LBA128 位置的 FSBLA 将会被忽略。; {$ f- I0 X; A" f0 h" A
29.png ; l: V3 r/ C+ t3 m) l
▲ 图 28 镜像在 SDCard 中的 Layout$ k9 u7 J9 B& X* @/ R% Y
- _; B" k4 [) z. m9 \* _
需要注意的是,FSBLA 和 CUBE EXAMPLE 都需要加入 STM32 Header,才能被系统识别。STM32 Header 是 ROM CODE 加载二进制文件的必要格式,每一个被 ROM CODE 加载的二进制文件都需要在头部添加特定的 STM32 Header。STM32CubeMP13 开发包中提供了ImageHeader 工具,用于为项目二进制文件添加 STM32 Header。开发者不需要深究 STM32Header 的详细内容。& I  i3 H1 [  I" ?7 @
30.png ' H5 a+ w- T: B5 z' k$ D- n* W. E
▲ 图 29 STM32 Header 信息
, T1 J  ~0 r3 _1 D$ `
! i$ B5 y2 \4 r3 c
为用户程序加入 STM32 Header,可在工程配置的 post-build steps 中加入如下命令:5 x- e9 L' E  ]2 G2 l
“(path_to_STM32CubeMP132 o4 c! w3 f6 P- m2 B5 n; k6 {
Package)/Utilities/ImageHeader/postbuild_STM32MP13.sh"
' c" t' h& B3 s  x& r"${gnu_tools_for_stm32_compiler_path}"
9 o/ y) o1 ]1 e0 a3 ~2 y"${BuildArtifactFileBaseName}"
8 N* @0 v  ]1 Z1 x7 I+ @+ K' `2 O& N5 s* q- H0 Q  N
6 m* `! ?' p8 s: U" ]
重新编译完成后,即可生成打上 STM32 Header 的目标文件。
: j) j, C' I+ _4 [  z8 k8 T1 u/ y3 K1 H 31.png ! h+ D: T" S5 z7 G: r
▲ 图 30 添加 Post-build 命令# l: Y; f  Y4 D1 u7 A: b+ Q$ x2 q) B
$ [, r2 W/ c! p/ X1 X" v( j
注:path_to_STM32CubeMP13 Package 为 STM32CubeMP13 开发包的存放路径。5 M4 O6 D" k" H! w* i! h

( v$ \" U1 N. P& j9 w
至此,已准备好待烧入 SDCard 的目标文件:
" M' F$ G, p* `9 y6 J) r+ [2 {1. 已添加 STM32 Header 的 FSBLA_Sdmmc 目标文件:FSBLA_Sdmmc1_A7_Signed.bin (即 FSBL)! m% m) i: U- h2 Y$ ]
2. 已添加 STM32 Header 的 CUBE EXAMPLE 目标文件:MP13_BSP_BasicTemplates.stm32(即用户工程)
4 |9 T4 r( `" j; o
  D2 {, j& u9 g( v$ x4 i4 G
烧录工程位于 STM32CubeMP13 开发包的如下目录:
( \3 |4 |/ N0 T$ ?5 `3 w\Projects\STM32MP135C-DK\External_Loader,以二进制的方式提供了烧录时需要的两个引导文件,包括:
1 X  R% m2 D8 T% h1.STM32PRGFW_UTIL_MP13xx_CP_Serial_Boot.stm32
2 a. c. b( U' X2 _. o2.SD_Ext_Loader.bin其中,STM32PRGFW_UTIL_MP13xx_CP_Serial_Boot.stm32 为基于开源工程。- J# R0 I  l' |
& [" n) D, ]  P) d

6 q- K" [( W( m" q+ tOpenbootloader 实现的一套 IAP 应用,执行烧录流程管理。SD_Ext_Loader.bin 工程执行SDCard 设备的实际擦写操作。3 G  B* c' b, S' T7 s

* ^3 h; m: u) \7 O) m: H. w2 a

9 x% G+ @/ U0 ^: t目前,引导设备可支持 SDCard,QSPI NOR FLASH、EMMC 等,若项目开发中需要修改适配不同的存储设备,可联系 ST 窗口获取烧录工程源码。* f0 s6 a3 e! b' F5 q

- ?- |% g- V) T; r! H; O1 w
将需要烧录的两个文件拷贝到 External_Loader 目录下,与烧录工程的两个文件存放在相同位置,然后修改 tsv 文件。完成后,目录中文件列表和 tsv 文件内容如图所示。) I0 x$ i7 D" {. D) E& o1 T+ ]! T, ~
32.png
0 G8 m% Y2 W% P+ c$ I' z, Z0 I9 x
▲ 图 31 烧录文件列表
$ r- O9 S9 z& f 33.png 8 }/ T! E1 K, a3 k* I
▲ 图 32 tsv 文件内容& u. p# ^$ c# J( D: [  O. b( C
: f7 [' E& n2 `+ ?

3 c/ j' {& r. F8 q接下来,即可使用 STM32CubeProg 进行镜像烧录。可支持通过 USB 或 UART 连接,不支持通过 ST-LINK 连接。这里以 UART 连接为例:
; O, e+ \9 l' m3 L1. 开发板跳线设置到 000 并上电
% ?6 S3 C/ [  \- j/ z' b2. 连接 MicroUSB 口,查看 COM 号。注意通过串口连接时需要断开 USB OTG. q+ V2 l3 j% L) i- J" ]; J* u6 c
3. STM32CubeProgrammer 选择连接方式为 UART,选择相应 COM 口. p9 d% \# v- e
4. 点击 Connect 连接
% v0 ?0 f' p& `$ P! P 34.png
, o9 m  j0 Z8 g- }9 m
& \6 w5 _1 F7 d/ S9 g+ D; y0 E 35.png # K( {7 c$ Q! |2 Y# v6 k+ N, \3 I; P6 K
5. 点击 Open File,选择 FlashLayout_OpenBL_ExtLoaderSDMMC_SerialBoot.tsv 文件+ r) ?* T( l# k9 v9 W
6. 点击 Browse,选择目标文件夹:\Projects\STM32MP135C DK\External_Loader\SD_Ext_Loader( B3 Q/ \- ^1 @3 G, w
7. 点击 Download,开始下载镜像8 C; ?7 L9 V. r  X7 z
36.png
6 j* B" O+ J* r

, o+ B. c3 R, ?; P8 n 37.png
' ~3 W& S. J6 U+ f, s" r- q& j- V
: E, A$ `8 \4 `3 p5 h4 M; W8. 等待烧录完成! j7 S7 Z7 E' J" p
9. 将板子断电,boot mode 切换至 SDCard 启动
, B& R, W: `3 x$ Z4 G% t. p& [  w- W10. 重新上电,即可引导启动
' ^- i- o  A6 M 38.png
9 H8 |# }# `' T4 W' [+ F! e. V" c
转载自:STM32
/ m6 h) C( B# P- x8 B- T. _) _7 P+ F1 Q) B* H2 `$ c+ ]
) f; Y: E8 n+ O6 X+ U0 a& L
赞 收藏 评论0 发布时间:2024-11-22 19:09

举报

0个回答

所属标签

相似技术帖

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