
01 引言9 K6 G! r, ]% I7 m STM32MP13x 系列 MPU 是 STM32 Arm®Cortex® MPU 家族中的一部分,它拥有单核Cortex®-A7 核心,支持核心频率 650MHz~1GHz,不仅能够轻松运行 Linux 操作系统,还同时提供官方 HAL 库,用于支持基于 RTOS 或无 OS 的项目方案,即裸跑应用程序。) J- N% k' d3 f9 {, W) f # R/ t' B' ^. A( G 本应用文档将就以下几个部分简述如何在 STM32MP13 系列 MPU 上开始无 OS 项目的开发: • STM32MP13x Baremetal 开发环境简介 • STM32MP13x 工程的创建6 y U4 Y, b9 S |/ J6 M% i% \* C • STM32MP13x 工程的在线调试 • 镜像烧录及从外部 Flash 启动( t) n. L6 O6 q. S8 K+ e 02 STM32MP13x Baremetal 开发环境简介. X2 ]0 m0 j5 T6 {9 f/ f 2.1 开发工具及环境7 s9 w8 b0 Z' H0 I* ?: e* X q5 _ STM32MP13x Baremetal 开发工具主要包括: 1. 烧录工具:STM32CubeProg ( 版本大于 v2.15.0)# H5 G( o) |/ `" K$ _: u 2. 配置工具:STM32CubeMX (版本大于 v6.10.0)% q, s# k# {. }3 j( R1 l 3. 开发调试工具:IAR(版本大于 v9.50),或 STM32CubeIDE(版本大于 v1.14), Y0 @* G7 p' f2 ]& ?# j, O 本文示例基于 STM32CubeIDE 开发调试工具。4 F$ l' c8 D& s! s7 S- H ! B9 X" }' I$ M4 ^; Z4 q 2.2 STM32CubeMP13 开发包 s/ e4 H, O5 f& b STM32CubeMP13 开发包同步发布于 ST 官网 www.st.com 和 github.com,可通过如下方式下载:5 o* h1 V0 p" a' w' v 1. ST 官网下载链接: v) m G& O6 ]' \) T8 s3 y 2. Github 仓库链接6 J; ? U, U- U$ C3 P 3. 通过 STM32CubeMx 软件下载3 W' l2 Q4 K# o/ @ 2.2.1. STM32CubeMP13 开发包总览" y! e1 {, N2 c; Q& ^& K9 d7 A* ^ STM32CubeMP13 开发包运行在 Arm® Cortex®-A7 处理器上,由以下三部分组成:+ U& o" I* |6 l8 Q, R$ a! Q& x% V • Level 0:驱动程序,包含 HAL、LL、BSP、CMSIS • Level 1:中间件,包含 Eclipse ThreadX(原 AzureRTOS),USB Host & Device 库5 o- T; X; e; A/ O; v6 m • Level 2:包含各种板级示例程序 除此之外,还包括一些工具助手等。# q1 k# R1 s& ?! S/ u* B & }+ E o" J0 d; ~( o; h- @ ; \% G8 h3 @/ e: q3 {) a ![]() ▲ 图 1 Baremetal 开发包源码框架7 e9 ^6 A! D% u1 y " ?" X* M/ w+ D$ J# y, {3 t 2.2.2. 源码目录结构/ `# z+ F+ W# [3 N ![]() ▲ 图 2 Baremetal 开发包源码目录 2.2.3. 开发包支持模块列表, T* k1 G1 a# }6 N 已支持的 HAL drivers : • 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+ y3 ~7 R9 ~5 s5 L: h2 w 已支持的 LL drivers :. B8 r: G2 R: y: I • ADC, DMA/DMAMUX, EXTI, ETZPC, GPIO, I2C, LPTIM, MDMA, PWR, RCC & BUS, RTC, SPI, TIM, USART/ G+ e* D; L" s' w, U - H7 w: H3 Q4 s) U9 a* z/ H BSP 与 BSP 组件:4 x1 X. u9 S9 S • 基于 HAL 封装了更高一级的 API,为 LED、按钮、相机、LCD、SD 卡和 COM 端口提供 API,包含了以下一些外围器件的驱动:GC2145, LAN8742, MCP23x17, RK043FN48H, STMIPID02+ k1 ^$ _5 F# |' H8 B+ B- E& a8 Q 中间件程序:' z3 Q, V/ }1 }7 o • 包含一系列支持某种服务的库文件及接口文件,目前已支持:Eclipse ThreadX(原 AzureRTOS),STM32_USB_Device_Library,& p! @/ P3 }+ X; N STM32_USB_Host_Library $ p) i, p5 Q( N) d9 u7 W# A 项目工程: • Examples:基于 HAL 接口的简单示例,没有中间件功能。 • Applications:较完整的工程应用实例,包含中间件功能。 • External_Loader: 烧录镜像及从外部存储器启动的应用示例。 • Template: 板级工程应用框架。6 a0 K, ~( ^% a% Z 2 I* @& _8 N5 b c/ W0 o 实用工具:/ U9 L: i! O! F • Imageheader:用于添加 stm32 头,支持存储设备启动。: a, f9 Y! x w • Fonts:提供了一组用于显示的标准字体,包括 font8,font12,font16,font20,font24 03 STM32MP13x 工程的创建 STM32MP13x 工程创建,可通过以下两种方式: 1. 使用 STM32CubeMx 配置并生成项目框架代码,并基于该框架代码开发应用。) R1 [2 g2 i& J+ ^8 j! e 2. 导入 STM32CubeMP13 开发包示例工程代码,并基于该示例代码开发应用。 3.1. 从 STM32CubeMX 创建工程7 o. x6 _1 }. ^ k/ g: u7 i STM32CubeMX 是 STM32Cube 工具家族中的一员,它采用简单易用的图形界面,可以帮助开发者快速配置硬件和软件。可支持从 MCU/MPU 选型,引脚配置,系统时钟以及外设时钟设置,到外设参数配置,中间件参数配置等,并可生成适用的 C 代码项目。8 c. I k! Z- i9 z * c. n. H: |, f% j 本章节简述如何通过 STM32CubeMx 生成适用于 STM32MP13x 的裸跑应用框架。使用该方式无需提前下载 STM32CubeMP13 开发包,STM32CubeMx 可自动联网下载。 1. 打开 STM32CubeMX,点击 ACCESS TO MCU SELECTOR,: P/ S% k5 u, b7 T% S 2. 在搜索框中输入 STM32MP13 相应料号,如:STM32MP135FAF7,双击打开配置窗口9 `6 m* k! ]6 B7 V& p 3. 弹框选择 MP13 Bare Metal,将生成 bare metal 工程框架。" y: Q' e% ]$ R m7 {0 n ![]() ▲ 图 3 STM32CubeMx 选择器件! H; b4 T" G& ]% x R ![]() ' }7 l9 g0 e$ q/ U7 s2 F* N ▲ 图 4 STM32CubeMx 选择工程类型 4. 切换到 Project Manager 标签页,输入工程名称。4 B; j% T- r5 ]- G" @; @1 P% F 5. 在此页进行项目选项配置,可保持默认。 ![]() ; }2 K0 G1 ]& y/ Q Y ▲ 图 5 STM32CubeMx 工程设置页面* x$ y) q4 ?+ p: J# m# f0 M: s: O0 ~ 2 K2 o/ z& Q9 s5 y 6. 回到 Pinout & Configuration 标签页。/ M9 J; @4 ~: P, X 7. 使能 RCC 和 DDR。 8. 配置各外设总线,配置方法与其他 STM32 MCU 相同(也可参考 Help -> Docs & Resources) 4 H) [& @5 S9 f ![]() ▲ 图 6 STM32CubeMx 外设配置页面 9. 切换到 Clock Configuration 标签页。: t( c3 e; P* k2 C9 h; p 10. 若软件报告时钟错误,可点击 Yes 自动修复。 11. 输入 CPU、DDR、总线等的工作频率,系统会自动匹配合适参数。 ![]() ▲ 图 7 STM32CubeMx 时钟配置页面* x7 g, V* E! d( ~( i3 A& _+ G, a 12. 所有外设配置完成,即可点击 GENERATE CODE,开始生成工程代码。6 m) m( d. b2 p4 T# B 13. 若第一次使用,软件将提示是否下载 STM32CubeMP13 开发包,可点击“yes”,软件自动联网下载前述 STM32CubeMP13 开发包。% g' R5 Y) ^5 \0 @& v 14. 生成完成后,可直接点击 Open Project,将打开 STM32CubeIDE 工程。; [4 U6 P, P" j+ j0 \/ e ![]() ▲ 图 8 STM32CubeMx 代码生成页面 ![]() ▲ 图 9 STM32CubeMx 完成代码生成页面/ v5 W, _2 g: G4 [9 W O% v ![]() ▲ 图 10 STM32CubeMx 生成工程代码示例 1 A- n+ M* h% c" K W7 Y 15. 至此,工程框架已生成,可通过 STM32CubeIDE 进行用户代码的编辑、编译、调试。$ G- ~( t7 g, u* Y 2 f: w s7 b: M2 m6 ~ 3.2. 从 STM32CubeMP13 开发包导入工程6 X9 H* q, }2 X1 Z$ U+ C 若已事先通过 ST 官方网站或 Github 下载了 STM32CubeMP13 软件开发包,也可导入开发包中的工程示例代码,从示例代码开始进行项目开发。6 W( J6 x; l; u3 ~0 j 这里以 FSBLA_Sdmmc1 工程为例。) f' c6 E6 H6 N 项目路径:\Projects\STM32MP135C-DK\Applications\FSBLA\FSBLA_Sdmmc1# j2 @# _3 B1 M# L/ A( @- D1 ` 1. 打开 STM32CubeIDE,导入 project: ^, `1 X; L. u' @; z 2. 点击 Files -> Import… ![]() ▲ 图 11 STM32CubeIDE 右键项目菜单 ( W; g* }3 [$ D" X& [' g' s ! W& O# t# k9 l6 \8 @ 3. 选择 Existing Projects into Workspace 4. 点击 Next> ![]() ; H# u! S, ?6 m0 O ▲ 图 12 STM32CubeIDE 导入已存在项目 N, V0 Y/ K4 Y6 E9 n: C0 J ! M3 k5 r o: H4 u8 U( z6 s3 B% h 5.点击 Browse…,找到目录 \Projects\STM32MP135C-DK\Applications\FSBLA 6. 选中 FSBLA_Sdmmc1_A7 工程 7. 点击 Finish,导入 Project6 Z' r, @9 \ h0 I7 U6 @9 m ![]() ) g* h- v- y) y, M! J* j7 H3 H ▲ 图 13 STM32CubeIDE 选择导入项目# S9 _0 M1 c. Y 0 Q7 ^; E, x0 i3 u8 G8 o) C2 f 8. 工程导入完成。 / X* k* [" X) t: d9 |1 }4 n 4 P5 j0 `" K& R( s 04 STM32MP13x 工程的在线调试$ r3 h6 n' i3 g% {5 Y& O% h) T 工程创建完成后,接下来本章节将介绍如何基于 STM32CubeIDE 进行工程编译及在线调试。: K: M/ s. m* s" p3 R) | STM32MP135 内部包含 128KByte SYSRAM,若代码小于 128KByte,可直接运行于内部SYSRAM 中,适用于验证一些简单的外设实例。若代码大于 128KByte,则需要将程序运行于DDR 中。下面将分别阐述。 4.1. 在 SYSRAM 中调试程序4 I: T( n, e( p0 u/ h [# B) I 仍以前述导入的 FSBLA_Sdmmc1_A7 工程为例。 1. 首先,将开发板切换到工程模式 2. 连接 Type-C 电源3. 连接 MicroUSB,这里板载已支持 ST-Link ![]() ▲ 图 14 开发板切换工程模式. }* F- b" ~7 m) L- C0 n& H 4. 右键项目工程名称,选择 Build Project,完成编译。9 k& G) d7 o- D ![]() ▲ 图 15 选择编译工程* c# ^1 b j. P) Z ' V1 J7 a9 F3 H7 T! R 5. 右键工程名称,选择 Debug As -> STM32 C/C++ Application ![]() ▲ 图 16 选择调试项目方法 1 6. 或点击 Debug 图标 C3 x3 u5 }. h4 y( r* ?' N& }/ O: ]5 z 7. 进入 Debug Configurations…. ![]() ▲图 17 选择调试项目方法 2 % r$ Z3 O; k* A/ G2 d% K, U " u( y7 R/ {4 b5 p5 {% M# \ 8. 进入调试配置菜单 ![]() . @* y' s) e6 g- f ▲图 18 调试配置页面; {& \- S. G8 z ![]() E8 W$ a2 Z3 H 6 @$ Y# \' u4 K3 D6 s 9. 即可像 MCU 一样调试您的代码。; [7 ]4 w* I; E/ _* Y$ {+ | ![]() . M7 B1 ?! C! } ▲图 19 项目调试窗口+ T5 {' O* j1 d8 c- E: n d 0 Y; J: P* q; S' Z0 W2 T6 X4 h/ c 4.2. 在 DDR 中调试程序 当代码量超过 SYSRAM(128KB)的大小时,需要将程序运行在 DDR。这里以 BSP_BasicTemplates 工程为例展示如何开发运行于 DDR 的用户程序、" X0 r+ u, v+ @ 0 w+ w' `6 ]/ x2 V6 B 1. 首先,按照前述方法导入项目工程/ a' L2 n* F1 ]. R5 b: g/ Z ![]() 0 L9 J2 }$ n2 g6 O6 ?0 N; z% G ▲图 20 导入 Templates 工程. z& R0 c: L T9 M( Q * H7 M* P n5 f$ R 2. 打开 C/C++ Build 配置# [/ F0 a/ ?, r1 e6 p 3. 在 Preprocessor 中添加 USE_DDR 宏定义* k2 _6 m, V: `4 e) W* n ![]() % ~0 }0 N+ j5 A4 {) U" G( Z ▲图 21 使能 DDR 宏# S& Y' M, ]; h$ C 9 P! M; Q2 v$ |" S) _ 4. 修改链接文件,重命名为 “stm32mp13xx_a7_ddr.ld”; l# p" l; [' o3 f5 ?' |) {, ] 5. 修改 REGION_ALIAS 定义到 DDR 区域:) ~' U" P2 H4 y. M, C' b& E+ n- m 6. 重新编译后,目标文件将链接到 DDR ![]() ▲图 22 修改链接空间- F1 X. P; a& }; R2 o) ^ ![]() ▲图 23 选择链接文件 \" a" V; }( r% | 7 ~; n3 r( T& v& n5 A0 y+ Z+ v 7. 在调试之前需要先运行 DDR_Init 对 DDR 进行初始化; _" m' e7 f! r: k* K* ? 8. 按照前述方法导入 DDR_Init 工程,编译后全速运行一次,并保持开发板不掉电项目路径:\STM32MP135C-DK\Examples\DDR\DDR_Init1 _" e Z4 }- T. f7 k' t ![]() $ b6 X# y: @/ n" S3 |5 L: w ▲ 图 24 运行 DDR 初始化 Y- O T6 E4 T" n/ u0 D1 x' C 9. 回到 BSP_BasicTemplates 工程。8 H& A4 P6 Q7 K 10. 在 Debug configuration 对话框中,将 Startup 页面的 monitor reset 删除。5 e' N3 x0 e3 z( h ![]() ▲ 图 25 修改调试参数 . o' i/ D7 h( r" m 11. 点击 Debug 进入调试6 S1 c1 f: t4 m& {4 l3 |; v% d4 h 12. 可以看到当前 main 函数的地址已经为 0xC000 开头的 DDR 位置6 p# {. r5 c+ C) w2 M 5 |/ @+ D4 O0 I3 D ![]() ' J: ~3 b- N0 J: K( S" H ▲ 图 26 在 DDR 中调试工程2 P6 s4 O2 ^! g% a$ H" g4 g, { $ u* B+ r$ k8 E. o; @ 05 从外部 Flash 启动 ![]() ▲ 图 27 STM32MP13 启动流程' K8 Q0 b. l" k- o- ^ " K+ p9 P8 F6 `7 H' H, J! I 从外部 flash 引导 STM32MP13, 一般需要包含两个部分源码。如上图所示,芯片上电后,首先运行内部固化的一段 ROM CODE,ROM CODE 从用户配置的启动器件中寻找 FSBLA,并将其拷贝至 SYSRAM 中,FSBLA 运行后,执行 DDR 初始化及用户代码(CUBE EXAMPLE)拷贝到 DDR 中,最终实现跳转到 DDR 中运行用户程序的目的。 这里以 SDCard 启动为例,在第三章节中,我们编译调试的 FSBLA_Sdmmc1_A7 工程,即实现了 FSBLA 部分的功能,BSP_BasicTemplates 工程为实际开发的用户项目。完成启动需要将这两个工程生成的镜像文件都烧录到 SDCard 中。& y5 g6 v+ C" G8 s* A • FSBLA 需烧录到 SDCard 的固定位置 LBA128 或 LBA640,ROM CODE 固定从这两个位置寻找 FSBLA。 • CUBE EXAMPLE 的存放位置可在 FSBLA 程序中修改,默认为 SDCard 的 LBA640。 • 如果有烧录过 OpenSTLinux 的卡,需先格式化。原因是 ROM Code 优先从 GPT 分区表中寻找 FSBLA,若分区表存在,新烧录到 LBA128 位置的 FSBLA 将会被忽略。 ![]() ▲ 图 28 镜像在 SDCard 中的 Layout# n# e, W5 c" i0 `0 ]4 [# Y 需要注意的是,FSBLA 和 CUBE EXAMPLE 都需要加入 STM32 Header,才能被系统识别。STM32 Header 是 ROM CODE 加载二进制文件的必要格式,每一个被 ROM CODE 加载的二进制文件都需要在头部添加特定的 STM32 Header。STM32CubeMP13 开发包中提供了ImageHeader 工具,用于为项目二进制文件添加 STM32 Header。开发者不需要深究 STM32Header 的详细内容。 ![]() ▲ 图 29 STM32 Header 信息 为用户程序加入 STM32 Header,可在工程配置的 post-build steps 中加入如下命令: “(path_to_STM32CubeMP13 Package)/Utilities/ImageHeader/postbuild_STM32MP13.sh" "${gnu_tools_for_stm32_compiler_path}" " R2 f U+ x6 b* ]( v% ? "${BuildArtifactFileBaseName}" 7 U4 C' Z1 z/ I/ o 重新编译完成后,即可生成打上 STM32 Header 的目标文件。 ![]() ▲ 图 30 添加 Post-build 命令3 p7 |- P+ t. v8 ~1 F 注:path_to_STM32CubeMP13 Package 为 STM32CubeMP13 开发包的存放路径。 至此,已准备好待烧入 SDCard 的目标文件: 1. 已添加 STM32 Header 的 FSBLA_Sdmmc 目标文件:FSBLA_Sdmmc1_A7_Signed.bin (即 FSBL)) y: q2 ]: s9 Y$ E' R) C 2. 已添加 STM32 Header 的 CUBE EXAMPLE 目标文件:MP13_BSP_BasicTemplates.stm32(即用户工程) & F; D% m6 _: @1 l/ O% B 烧录工程位于 STM32CubeMP13 开发包的如下目录:/ _! N/ ~# m2 f( _) z" E5 g5 ^ \Projects\STM32MP135C-DK\External_Loader,以二进制的方式提供了烧录时需要的两个引导文件,包括:; {( ^& z* I0 K# I1 l' o$ s- O* s2 Q 1.STM32PRGFW_UTIL_MP13xx_CP_Serial_Boot.stm32* T# I6 S# G% M 2.SD_Ext_Loader.bin其中,STM32PRGFW_UTIL_MP13xx_CP_Serial_Boot.stm32 为基于开源工程。 ( e; N6 \4 [* H+ w6 b 4 v8 [4 e* {3 g( L/ O- E( E9 t Openbootloader 实现的一套 IAP 应用,执行烧录流程管理。SD_Ext_Loader.bin 工程执行SDCard 设备的实际擦写操作。6 O h; r& ]: \% B . W6 ]7 |7 e# H5 v' A 目前,引导设备可支持 SDCard,QSPI NOR FLASH、EMMC 等,若项目开发中需要修改适配不同的存储设备,可联系 ST 窗口获取烧录工程源码。 将需要烧录的两个文件拷贝到 External_Loader 目录下,与烧录工程的两个文件存放在相同位置,然后修改 tsv 文件。完成后,目录中文件列表和 tsv 文件内容如图所示。 ![]() ▲ 图 31 烧录文件列表3 `9 T$ v; j* @1 q$ ~" G8 C: ^) I ![]() ▲ 图 32 tsv 文件内容. U3 `! F0 F9 ^( D 4 r9 M& y& n( P9 |8 D$ K 接下来,即可使用 STM32CubeProg 进行镜像烧录。可支持通过 USB 或 UART 连接,不支持通过 ST-LINK 连接。这里以 UART 连接为例:5 |, N7 i& x F5 h9 k e# [- Z 1. 开发板跳线设置到 000 并上电 2. 连接 MicroUSB 口,查看 COM 号。注意通过串口连接时需要断开 USB OTG 3. STM32CubeProgrammer 选择连接方式为 UART,选择相应 COM 口* X6 ?" R7 E! n 4. 点击 Connect 连接9 ~% J9 M" g& `) F3 J: g ![]() 2 [0 [; l0 i }: d" Z" S ![]() 5. 点击 Open File,选择 FlashLayout_OpenBL_ExtLoaderSDMMC_SerialBoot.tsv 文件 6. 点击 Browse,选择目标文件夹:\Projects\STM32MP135C DK\External_Loader\SD_Ext_Loader 7. 点击 Download,开始下载镜像 ![]() ![]() 8. 等待烧录完成 9. 将板子断电,boot mode 切换至 SDCard 启动 10. 重新上电,即可引导启动 ![]() % u7 [% {* l. {4 U; N% C5 Y# p( k 转载自:STM32; z3 H& c. Z/ y6 s. @" p / |/ B6 p: k3 w % K0 A( g. x6 l4 g3 `. v |
拷打cubemx【001】——艰难的选型路
linux eclipse编译后自动更新程序
eclipse编写stm32mp135配置
eclipse编写stm32mp135程序
STM32MP135F-DK 开箱测试
openSTlinux系统搭建过程分享
《STM32MPU安全启动》学习笔记之uboot如何校验kernel和如何使能校验
《STM32MPU安全启动》学习笔记 1.0 介绍
聊聊 STM32 MPU OpenSTLinux 实时扩展包 X-LINUX-RT
STM32开发板推荐 | 支持裸跑的米尔STM32MP135开发板,响应硬实时需求