
01 引言1 U$ H0 ]8 h- h" {+ J$ W9 {" R" G" c5 k STM32MP13x 系列 MPU 是 STM32 Arm®Cortex® MPU 家族中的一部分,它拥有单核Cortex®-A7 核心,支持核心频率 650MHz~1GHz,不仅能够轻松运行 Linux 操作系统,还同时提供官方 HAL 库,用于支持基于 RTOS 或无 OS 的项目方案,即裸跑应用程序。; u/ K0 P% v7 p 本应用文档将就以下几个部分简述如何在 STM32MP13 系列 MPU 上开始无 OS 项目的开发: • STM32MP13x Baremetal 开发环境简介 • STM32MP13x 工程的创建 • STM32MP13x 工程的在线调试, \" F! o3 N6 X# `0 o. Z • 镜像烧录及从外部 Flash 启动 : v, B9 g* o% K 02 STM32MP13x Baremetal 开发环境简介# F+ W! g( ] a: t7 g. {4 ^4 F5 w 2.1 开发工具及环境 STM32MP13x Baremetal 开发工具主要包括: 1. 烧录工具:STM32CubeProg ( 版本大于 v2.15.0)2 M& x6 c" W2 @, j 2. 配置工具:STM32CubeMX (版本大于 v6.10.0): t. R! @. L4 c2 f+ F2 A) h 3. 开发调试工具:IAR(版本大于 v9.50),或 STM32CubeIDE(版本大于 v1.14)' w K9 Q* F# h& C! `# c5 X2 h 本文示例基于 STM32CubeIDE 开发调试工具。 . `8 ^( j* d5 T4 K" ~ 2.2 STM32CubeMP13 开发包 STM32CubeMP13 开发包同步发布于 ST 官网 www.st.com 和 github.com,可通过如下方式下载: 1. ST 官网下载链接0 R2 X% T7 B% E. d$ Y% U3 d7 k 2. Github 仓库链接0 P8 |# L0 D: \6 M7 q6 K! v& A 3. 通过 STM32CubeMx 软件下载1 t) U" r- M3 x7 s . E7 ~0 f) k. A8 b2 ^ 2.2.1. STM32CubeMP13 开发包总览 STM32CubeMP13 开发包运行在 Arm® Cortex®-A7 处理器上,由以下三部分组成: • Level 0:驱动程序,包含 HAL、LL、BSP、CMSIS • Level 1:中间件,包含 Eclipse ThreadX(原 AzureRTOS),USB Host & Device 库+ B, P, g9 C8 R! \4 Y& F" v) z7 T • Level 2:包含各种板级示例程序, d6 _. W0 v% x9 ^0 F; y5 S 除此之外,还包括一些工具助手等。$ J' x# G& U* q/ U% \$ h * \8 L8 h+ V" Z% V4 _9 p+ w 5 T4 a$ u6 X0 o( B ![]() ▲ 图 1 Baremetal 开发包源码框架 5 _' i, Y9 R4 [+ j9 E * S% V: X0 |! b4 `, ~; [ 2.2.2. 源码目录结构# k# \% j, _; S. [: u4 ]1 z ![]() ▲ 图 2 Baremetal 开发包源码目录" i6 n. W9 Q' J( |7 m . E1 W) O0 f# O5 s9 p5 j 2.2.3. 开发包支持模块列表; P9 d0 G: z3 n. `* ]4 r, {4 \) } 已支持的 HAL drivers :! E+ t8 q, ^9 q • 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 已支持的 LL drivers :) P: m( @; ]2 y, O' D! U$ F: z( Q • ADC, DMA/DMAMUX, EXTI, ETZPC, GPIO, I2C, LPTIM, MDMA, PWR, RCC & BUS, RTC, SPI, TIM, USART BSP 与 BSP 组件:! N, N! Q) M, c; K. J! B • 基于 HAL 封装了更高一级的 API,为 LED、按钮、相机、LCD、SD 卡和 COM 端口提供 API,包含了以下一些外围器件的驱动:GC2145, LAN8742, MCP23x17, RK043FN48H, STMIPID02 中间件程序: • 包含一系列支持某种服务的库文件及接口文件,目前已支持:Eclipse ThreadX(原 AzureRTOS),STM32_USB_Device_Library,, B( [2 i( h4 R A+ q0 X1 Y, ~0 w$ } STM32_USB_Host_Library 3 T8 w' i8 k; J 项目工程: • Examples:基于 HAL 接口的简单示例,没有中间件功能。 • Applications:较完整的工程应用实例,包含中间件功能。 • External_Loader: 烧录镜像及从外部存储器启动的应用示例。 • Template: 板级工程应用框架。( m- G0 e- ~ h2 L 0 S2 r9 l7 x* v 实用工具: • Imageheader:用于添加 stm32 头,支持存储设备启动。 • Fonts:提供了一组用于显示的标准字体,包括 font8,font12,font16,font20,font24 03 STM32MP13x 工程的创建+ c, b, M Q5 [/ p% \ STM32MP13x 工程创建,可通过以下两种方式:3 |/ |" q3 g+ |0 T- |* b" d" ]( R( y 1. 使用 STM32CubeMx 配置并生成项目框架代码,并基于该框架代码开发应用。 2. 导入 STM32CubeMP13 开发包示例工程代码,并基于该示例代码开发应用。 % H& w, M9 L# y1 H 3.1. 从 STM32CubeMX 创建工程, n6 f$ f; I0 ?- f$ H STM32CubeMX 是 STM32Cube 工具家族中的一员,它采用简单易用的图形界面,可以帮助开发者快速配置硬件和软件。可支持从 MCU/MPU 选型,引脚配置,系统时钟以及外设时钟设置,到外设参数配置,中间件参数配置等,并可生成适用的 C 代码项目。; f) E: l+ o+ b' Z$ s . r" c7 @: y& a4 S/ u0 L 本章节简述如何通过 STM32CubeMx 生成适用于 STM32MP13x 的裸跑应用框架。使用该方式无需提前下载 STM32CubeMP13 开发包,STM32CubeMx 可自动联网下载。8 E% A4 v/ b: g" f* G* ^$ f 1. 打开 STM32CubeMX,点击 ACCESS TO MCU SELECTOR,1 g0 _/ |; c9 { p# A: G. U: l' y 2. 在搜索框中输入 STM32MP13 相应料号,如:STM32MP135FAF7,双击打开配置窗口 3. 弹框选择 MP13 Bare Metal,将生成 bare metal 工程框架。% ?5 u4 X, h5 W& [' z0 N; O ![]() ▲ 图 3 STM32CubeMx 选择器件 ![]() ▲ 图 4 STM32CubeMx 选择工程类型 ! @! ]9 \/ D" A* y 4. 切换到 Project Manager 标签页,输入工程名称。 g& D" P0 C0 I7 @3 F 5. 在此页进行项目选项配置,可保持默认。& O. N5 h. Y% f ![]() ▲ 图 5 STM32CubeMx 工程设置页面 D$ k0 `1 O* E! o. f* T9 ? 6. 回到 Pinout & Configuration 标签页。 7. 使能 RCC 和 DDR。, d7 U+ \$ }$ ~3 T3 W7 W: e9 A) l 8. 配置各外设总线,配置方法与其他 STM32 MCU 相同(也可参考 Help -> Docs & Resources) : @+ [+ z3 a( E$ P% x . u: x6 l! F/ d$ L ![]() % g$ A4 F0 {0 g T ▲ 图 6 STM32CubeMx 外设配置页面3 H A# H$ L& c. k: ? 7 \ B( D0 i2 a3 D 9. 切换到 Clock Configuration 标签页。% b# w* Q( k3 v 10. 若软件报告时钟错误,可点击 Yes 自动修复。 11. 输入 CPU、DDR、总线等的工作频率,系统会自动匹配合适参数。. B8 C* J% M; _: Q7 D# Z/ u/ l 6 B6 e" g& b* Y; ^/ V ![]() ▲ 图 7 STM32CubeMx 时钟配置页面5 k6 c- t; @- V7 r) D1 X 12. 所有外设配置完成,即可点击 GENERATE CODE,开始生成工程代码。 13. 若第一次使用,软件将提示是否下载 STM32CubeMP13 开发包,可点击“yes”,软件自动联网下载前述 STM32CubeMP13 开发包。" z. z2 q, O6 m 14. 生成完成后,可直接点击 Open Project,将打开 STM32CubeIDE 工程。 ![]() ▲ 图 8 STM32CubeMx 代码生成页面9 A V% g+ [8 d0 v! n ![]() ▲ 图 9 STM32CubeMx 完成代码生成页面 ![]() ▲ 图 10 STM32CubeMx 生成工程代码示例 15. 至此,工程框架已生成,可通过 STM32CubeIDE 进行用户代码的编辑、编译、调试。 5 F V H) @1 `7 ] P3 V4 G* p 9 N8 z- ^2 ~* O8 z- J8 \# r! j/ j 3.2. 从 STM32CubeMP13 开发包导入工程 若已事先通过 ST 官方网站或 Github 下载了 STM32CubeMP13 软件开发包,也可导入开发包中的工程示例代码,从示例代码开始进行项目开发。6 q( \% a) g2 I' S P- K 这里以 FSBLA_Sdmmc1 工程为例。* F2 m( s9 ~) u0 f 项目路径:\Projects\STM32MP135C-DK\Applications\FSBLA\FSBLA_Sdmmc1 1. 打开 STM32CubeIDE,导入 project0 X( `; w6 O. I5 A3 Q5 t+ G7 K 2. 点击 Files -> Import… ![]() ▲ 图 11 STM32CubeIDE 右键项目菜单! Z# _1 o2 o$ @/ E, h0 ~; ^ ! F$ n. j' _& ^2 _, a& N! g& V 3. 选择 Existing Projects into Workspace0 E: F, B0 ~" R! r. z- H; l 4. 点击 Next> ![]() ▲ 图 12 STM32CubeIDE 导入已存在项目% j! H/ B, F# J s9 _& ^# w* G7 ^/ T% ~ 5.点击 Browse…,找到目录 \Projects\STM32MP135C-DK\Applications\FSBLA 6. 选中 FSBLA_Sdmmc1_A7 工程 7. 点击 Finish,导入 Project; L% F0 {9 z; D) W" l' q ![]() ▲ 图 13 STM32CubeIDE 选择导入项目 $ t. B+ F2 f- z% z" F* Y V* D8 V N 8. 工程导入完成。 5 q$ T0 }, A6 G2 X% g8 D) j2 w 04 STM32MP13x 工程的在线调试 工程创建完成后,接下来本章节将介绍如何基于 STM32CubeIDE 进行工程编译及在线调试。- B ~2 D) v( D/ \( ^ g STM32MP135 内部包含 128KByte SYSRAM,若代码小于 128KByte,可直接运行于内部SYSRAM 中,适用于验证一些简单的外设实例。若代码大于 128KByte,则需要将程序运行于DDR 中。下面将分别阐述。 V, w! `9 `" |) Q# Y 4.1. 在 SYSRAM 中调试程序$ p, R0 u! E/ u3 g 仍以前述导入的 FSBLA_Sdmmc1_A7 工程为例。 1. 首先,将开发板切换到工程模式9 `/ }) J& O8 o0 l$ w1 J' C- N 2. 连接 Type-C 电源3. 连接 MicroUSB,这里板载已支持 ST-Link ![]() 0 e0 e7 L$ k, k8 M2 `" m ▲ 图 14 开发板切换工程模式 4. 右键项目工程名称,选择 Build Project,完成编译。 ![]() ▲ 图 15 选择编译工程 ' `+ z/ J: ]8 Z |! P& p ; Y8 c5 T F1 @! A" f 5. 右键工程名称,选择 Debug As -> STM32 C/C++ Application ![]() ▲ 图 16 选择调试项目方法 1 6. 或点击 Debug 图标6 {! e0 K# r8 H& Z* j2 W 7. 进入 Debug Configurations….' m2 ~: W( e; ?' F ![]() ▲图 17 选择调试项目方法 2; e+ W/ l9 ~ X ; o! i% `( r# z: n0 M+ ? 8. 进入调试配置菜单 ![]() ▲图 18 调试配置页面 * ^, y: p m/ t0 @* W+ F + _- {: ?& d+ W, ? ![]() 5 {0 p9 X# p( x, n ; Q0 u) f8 k5 l s8 ~2 M 5 ?/ M4 `5 N( s; J2 y( { 9. 即可像 MCU 一样调试您的代码。 ![]() 6 s; @1 B/ H+ O8 g% ] ▲图 19 项目调试窗口 & a# b6 x8 }: }" W2 A7 J, { 4.2. 在 DDR 中调试程序 当代码量超过 SYSRAM(128KB)的大小时,需要将程序运行在 DDR。这里以 BSP_BasicTemplates 工程为例展示如何开发运行于 DDR 的用户程序、3 t5 M: R" u9 _# a9 x! k' m; R 1. 首先,按照前述方法导入项目工程 ![]() ▲图 20 导入 Templates 工程 & l& @# S3 L# G- n1 \- M * N' p9 i a8 |5 a 2. 打开 C/C++ Build 配置 3. 在 Preprocessor 中添加 USE_DDR 宏定义: j/ S7 T+ j( G/ D+ f ![]() + I; `. O" A. i9 P8 B& H+ ^, w ▲图 21 使能 DDR 宏( C" v0 n; u! f+ z3 H t 4. 修改链接文件,重命名为 “stm32mp13xx_a7_ddr.ld” 5. 修改 REGION_ALIAS 定义到 DDR 区域: 6. 重新编译后,目标文件将链接到 DDR# I; b. n ^5 a ~; [, k ![]() ▲图 22 修改链接空间 ![]() ▲图 23 选择链接文件# k, r7 R; x$ H; c4 {9 x* _8 R : V" e6 d$ V0 d/ A 7. 在调试之前需要先运行 DDR_Init 对 DDR 进行初始化0 E: J& b* v# D, b" k8 h1 @7 f j, M 8. 按照前述方法导入 DDR_Init 工程,编译后全速运行一次,并保持开发板不掉电项目路径:\STM32MP135C-DK\Examples\DDR\DDR_Init' V5 n- o }' |1 x0 l% m4 w ![]() / \+ c! V3 b3 Z8 D: C ▲ 图 24 运行 DDR 初始化; n1 s4 v: ^1 u# i 9. 回到 BSP_BasicTemplates 工程。 10. 在 Debug configuration 对话框中,将 Startup 页面的 monitor reset 删除。 ![]() ▲ 图 25 修改调试参数 6 G3 {; x8 {+ l 11. 点击 Debug 进入调试. v$ w2 ~: L$ c L/ E$ t1 Q' F 12. 可以看到当前 main 函数的地址已经为 0xC000 开头的 DDR 位置% F1 @1 G3 R4 z; c+ |+ @6 ]$ }8 o, C9 \ + @1 S+ f6 F% F ( A% _& `: B; j7 `/ L ![]() 2 P- e! \) D. V9 _ ▲ 图 26 在 DDR 中调试工程 05 从外部 Flash 启动0 _$ q+ l9 A5 y% z. E ![]() # Y8 j1 M$ l8 V9 K! z ▲ 图 27 STM32MP13 启动流程1 N9 N/ b7 m0 t' D3 e! G& E. [; b * M4 Z) G. u8 L" M 从外部 flash 引导 STM32MP13, 一般需要包含两个部分源码。如上图所示,芯片上电后,首先运行内部固化的一段 ROM CODE,ROM CODE 从用户配置的启动器件中寻找 FSBLA,并将其拷贝至 SYSRAM 中,FSBLA 运行后,执行 DDR 初始化及用户代码(CUBE EXAMPLE)拷贝到 DDR 中,最终实现跳转到 DDR 中运行用户程序的目的。 * r' ~3 m+ ?! j8 ]6 j 这里以 SDCard 启动为例,在第三章节中,我们编译调试的 FSBLA_Sdmmc1_A7 工程,即实现了 FSBLA 部分的功能,BSP_BasicTemplates 工程为实际开发的用户项目。完成启动需要将这两个工程生成的镜像文件都烧录到 SDCard 中。0 N# o) r& c& w7 i, N! V 1 y7 d1 A% I+ r4 l6 ? • FSBLA 需烧录到 SDCard 的固定位置 LBA128 或 LBA640,ROM CODE 固定从这两个位置寻找 FSBLA。' K. T: g9 f# a; l6 b5 e • CUBE EXAMPLE 的存放位置可在 FSBLA 程序中修改,默认为 SDCard 的 LBA640。 • 如果有烧录过 OpenSTLinux 的卡,需先格式化。原因是 ROM Code 优先从 GPT 分区表中寻找 FSBLA,若分区表存在,新烧录到 LBA128 位置的 FSBLA 将会被忽略。1 e- X% s. S; i, F& N2 X$ E# U1 I$ b5 n( n2 Y ![]() ▲ 图 28 镜像在 SDCard 中的 Layout5 R$ B4 J l% D' H$ D R ; H6 j6 ^! R6 k6 l" |7 Y { 需要注意的是,FSBLA 和 CUBE EXAMPLE 都需要加入 STM32 Header,才能被系统识别。STM32 Header 是 ROM CODE 加载二进制文件的必要格式,每一个被 ROM CODE 加载的二进制文件都需要在头部添加特定的 STM32 Header。STM32CubeMP13 开发包中提供了ImageHeader 工具,用于为项目二进制文件添加 STM32 Header。开发者不需要深究 STM32Header 的详细内容。 ![]() ▲ 图 29 STM32 Header 信息 " _- S' s# v9 C 为用户程序加入 STM32 Header,可在工程配置的 post-build steps 中加入如下命令:+ ]- A4 y: A( q% w! G “(path_to_STM32CubeMP13/ Y/ R7 b X( P! C3 x# _ Package)/Utilities/ImageHeader/postbuild_STM32MP13.sh"9 A. M. k9 Q/ g# r "${gnu_tools_for_stm32_compiler_path}" "${BuildArtifactFileBaseName}") }& g: P2 ]1 \3 { 重新编译完成后,即可生成打上 STM32 Header 的目标文件。# Y o. N: p7 O% ]) Y ![]() ▲ 图 30 添加 Post-build 命令 5 {9 B9 p, P# h 注:path_to_STM32CubeMP13 Package 为 STM32CubeMP13 开发包的存放路径。2 h0 S3 N+ U& d 至此,已准备好待烧入 SDCard 的目标文件:" e7 g9 F5 h* e, [ 1. 已添加 STM32 Header 的 FSBLA_Sdmmc 目标文件:FSBLA_Sdmmc1_A7_Signed.bin (即 FSBL) 2. 已添加 STM32 Header 的 CUBE EXAMPLE 目标文件:MP13_BSP_BasicTemplates.stm32(即用户工程) 烧录工程位于 STM32CubeMP13 开发包的如下目录: \Projects\STM32MP135C-DK\External_Loader,以二进制的方式提供了烧录时需要的两个引导文件,包括: 1.STM32PRGFW_UTIL_MP13xx_CP_Serial_Boot.stm321 o ]+ F2 D8 g. ~4 B7 M& w 2.SD_Ext_Loader.bin其中,STM32PRGFW_UTIL_MP13xx_CP_Serial_Boot.stm32 为基于开源工程。4 J! L8 _2 S) P' p: v& f * x) `& m% p2 D, a Openbootloader 实现的一套 IAP 应用,执行烧录流程管理。SD_Ext_Loader.bin 工程执行SDCard 设备的实际擦写操作。% q5 A4 J. D' x3 B9 o ( ~ I# ]0 u- D* X J 9 W# I9 e1 I0 H# F" r6 h1 D 目前,引导设备可支持 SDCard,QSPI NOR FLASH、EMMC 等,若项目开发中需要修改适配不同的存储设备,可联系 ST 窗口获取烧录工程源码。 " }* f: ]( }& A 将需要烧录的两个文件拷贝到 External_Loader 目录下,与烧录工程的两个文件存放在相同位置,然后修改 tsv 文件。完成后,目录中文件列表和 tsv 文件内容如图所示。/ \. _. D. ?& J: q/ }# I ![]() ▲ 图 31 烧录文件列表 ![]() ▲ 图 32 tsv 文件内容 ) y0 F. c5 o+ r6 d 接下来,即可使用 STM32CubeProg 进行镜像烧录。可支持通过 USB 或 UART 连接,不支持通过 ST-LINK 连接。这里以 UART 连接为例:/ I* m l6 U! ^ 1. 开发板跳线设置到 000 并上电 2. 连接 MicroUSB 口,查看 COM 号。注意通过串口连接时需要断开 USB OTG0 V/ \4 y$ V0 w/ m* m% s" r 3. STM32CubeProgrammer 选择连接方式为 UART,选择相应 COM 口 4. 点击 Connect 连接 ![]() ![]() 5. 点击 Open File,选择 FlashLayout_OpenBL_ExtLoaderSDMMC_SerialBoot.tsv 文件 6. 点击 Browse,选择目标文件夹:\Projects\STM32MP135C DK\External_Loader\SD_Ext_Loader% b1 ^5 n6 Z( `0 f# j& d* s 7. 点击 Download,开始下载镜像' t/ T) v) s9 \, S) W, B ![]() ![]() 8. 等待烧录完成 9. 将板子断电,boot mode 切换至 SDCard 启动; C" U) {/ q; ?- J7 o$ r U9 G8 Z 10. 重新上电,即可引导启动! h1 w% C, [) E$ V- l8 K ![]() 转载自:STM32 f9 d. D! }' U- t , Z4 l9 G4 Y! g( s! F% B+ D6 g |
拷打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开发板,响应硬实时需求