
01 引言 STM32MP13x 系列 MPU 是 STM32 Arm®Cortex® MPU 家族中的一部分,它拥有单核Cortex®-A7 核心,支持核心频率 650MHz~1GHz,不仅能够轻松运行 Linux 操作系统,还同时提供官方 HAL 库,用于支持基于 RTOS 或无 OS 的项目方案,即裸跑应用程序。 4 |) K2 {8 H7 f9 S% F 本应用文档将就以下几个部分简述如何在 STM32MP13 系列 MPU 上开始无 OS 项目的开发: • STM32MP13x Baremetal 开发环境简介4 m; q5 |8 @0 S. R) ^ • STM32MP13x 工程的创建 • STM32MP13x 工程的在线调试+ l. d' I! e5 L. f. z; W • 镜像烧录及从外部 Flash 启动 02 STM32MP13x Baremetal 开发环境简介 2.1 开发工具及环境9 t) V- a" n6 X: e STM32MP13x Baremetal 开发工具主要包括:0 H e- k' H3 }! F( w# S' ~ 1. 烧录工具:STM32CubeProg ( 版本大于 v2.15.0)7 g, C+ s* ]0 E 2. 配置工具:STM32CubeMX (版本大于 v6.10.0) 3. 开发调试工具:IAR(版本大于 v9.50),或 STM32CubeIDE(版本大于 v1.14) 本文示例基于 STM32CubeIDE 开发调试工具。$ j' P# e% @# U% {# J . Z" J- Y$ `6 O# c! R 2.2 STM32CubeMP13 开发包4 C1 G$ Q, D/ q' } STM32CubeMP13 开发包同步发布于 ST 官网 www.st.com 和 github.com,可通过如下方式下载:* w' W5 m) {# b7 Y$ C3 F6 [$ { 1. ST 官网下载链接! M* a+ P( H3 B! j, k ? 2. Github 仓库链接7 \! ^, ^; J+ j4 A# f 3. 通过 STM32CubeMx 软件下载 2.2.1. STM32CubeMP13 开发包总览9 b' ^) L; j s# W' e3 w6 I6 Z5 n STM32CubeMP13 开发包运行在 Arm® Cortex®-A7 处理器上,由以下三部分组成:7 s; o9 V, S8 \$ f • Level 0:驱动程序,包含 HAL、LL、BSP、CMSIS" U: Q3 R, e8 z5 _" u" O7 v • Level 1:中间件,包含 Eclipse ThreadX(原 AzureRTOS),USB Host & Device 库* c. @- ^/ k. f • Level 2:包含各种板级示例程序5 k, u6 R3 N [- ~ 除此之外,还包括一些工具助手等。 7 j/ k2 k2 l; Q: e/ y' v ![]() ▲ 图 1 Baremetal 开发包源码框架0 R# \6 I: w+ c! P4 o" C , L( O/ ?. t+ J; W 2.2.2. 源码目录结构4 {, v: ^! A3 }8 ^ ![]() ▲ 图 2 Baremetal 开发包源码目录1 L6 ^) n5 k1 {& O% H 2.2.3. 开发包支持模块列表 已支持的 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, USB2 x& ?/ j& S2 l* R 已支持的 LL drivers : • ADC, DMA/DMAMUX, EXTI, ETZPC, GPIO, I2C, LPTIM, MDMA, PWR, RCC & BUS, RTC, SPI, TIM, USART BSP 与 BSP 组件: • 基于 HAL 封装了更高一级的 API,为 LED、按钮、相机、LCD、SD 卡和 COM 端口提供 API,包含了以下一些外围器件的驱动:GC2145, LAN8742, MCP23x17, RK043FN48H, STMIPID02 中间件程序: • 包含一系列支持某种服务的库文件及接口文件,目前已支持:Eclipse ThreadX(原 AzureRTOS),STM32_USB_Device_Library, STM32_USB_Host_Library 项目工程: • Examples:基于 HAL 接口的简单示例,没有中间件功能。 • Applications:较完整的工程应用实例,包含中间件功能。+ Y$ Z, i& q; [" B • External_Loader: 烧录镜像及从外部存储器启动的应用示例。 • Template: 板级工程应用框架。 实用工具: • Imageheader:用于添加 stm32 头,支持存储设备启动。 • Fonts:提供了一组用于显示的标准字体,包括 font8,font12,font16,font20,font24 " b6 q9 n: Z, S) f0 o4 |; u9 _ 3 Z) u+ y4 h* q0 |* }" y 03 STM32MP13x 工程的创建 STM32MP13x 工程创建,可通过以下两种方式:$ ~' {1 |) p3 r/ t9 j; Y 1. 使用 STM32CubeMx 配置并生成项目框架代码,并基于该框架代码开发应用。 2. 导入 STM32CubeMP13 开发包示例工程代码,并基于该示例代码开发应用。 3.1. 从 STM32CubeMX 创建工程( P; {! m& Z$ m% d0 L/ b STM32CubeMX 是 STM32Cube 工具家族中的一员,它采用简单易用的图形界面,可以帮助开发者快速配置硬件和软件。可支持从 MCU/MPU 选型,引脚配置,系统时钟以及外设时钟设置,到外设参数配置,中间件参数配置等,并可生成适用的 C 代码项目。 2 Y3 J6 v8 @! Q$ j1 Y 本章节简述如何通过 STM32CubeMx 生成适用于 STM32MP13x 的裸跑应用框架。使用该方式无需提前下载 STM32CubeMP13 开发包,STM32CubeMx 可自动联网下载。5 J" Q6 c0 S0 u$ C0 _: g' s 1. 打开 STM32CubeMX,点击 ACCESS TO MCU SELECTOR, 2. 在搜索框中输入 STM32MP13 相应料号,如:STM32MP135FAF7,双击打开配置窗口 3. 弹框选择 MP13 Bare Metal,将生成 bare metal 工程框架。 ![]() ▲ 图 3 STM32CubeMx 选择器件 ![]() ▲ 图 4 STM32CubeMx 选择工程类型8 t, N3 i% k# H 4. 切换到 Project Manager 标签页,输入工程名称。 5. 在此页进行项目选项配置,可保持默认。& B; q9 q# U" F! I5 D: w7 X% @ ![]() * K( ] A3 J) ?8 |# ?( W9 L1 S ▲ 图 5 STM32CubeMx 工程设置页面 / o& U& N- \( D2 x0 b2 j; w/ p8 \$ ^ 6. 回到 Pinout & Configuration 标签页。4 f& L0 {& O! R2 h 7. 使能 RCC 和 DDR。) W/ z% y- b! A% b 8. 配置各外设总线,配置方法与其他 STM32 MCU 相同(也可参考 Help -> Docs & Resources)8 y: {( [. Z7 i R0 t ![]() ▲ 图 6 STM32CubeMx 外设配置页面0 ^. r/ P+ ]7 W" h! F$ H : i. w" J e, h n* f; y ) I6 [8 H: U g% T% ?/ k5 l! z& ~1 t 9. 切换到 Clock Configuration 标签页。 10. 若软件报告时钟错误,可点击 Yes 自动修复。6 c% o# }/ L' v# @0 s9 M 11. 输入 CPU、DDR、总线等的工作频率,系统会自动匹配合适参数。 ![]() ▲ 图 7 STM32CubeMx 时钟配置页面/ _) N Y0 c6 q4 ~1 u1 B6 o& z Q ; ~+ E- i7 M6 ^# E% f 12. 所有外设配置完成,即可点击 GENERATE CODE,开始生成工程代码。 13. 若第一次使用,软件将提示是否下载 STM32CubeMP13 开发包,可点击“yes”,软件自动联网下载前述 STM32CubeMP13 开发包。( ]/ y! i7 ~5 ^) K) q 14. 生成完成后,可直接点击 Open Project,将打开 STM32CubeIDE 工程。 ![]() # @; Z0 X- t) f+ ]' i8 G+ m v. y ▲ 图 8 STM32CubeMx 代码生成页面* K+ X4 _7 N1 ?, m. R+ D" D7 q: b7 O h ![]() ▲ 图 9 STM32CubeMx 完成代码生成页面1 T& ?. q$ u( t6 J" d ![]() ▲ 图 10 STM32CubeMx 生成工程代码示例% j3 q* X8 z A' h; w9 _1 Y5 e* p 15. 至此,工程框架已生成,可通过 STM32CubeIDE 进行用户代码的编辑、编译、调试。 4 n/ ^& e. W5 P: d4 Q2 W1 m - D a0 U, z# e: J: ]" w 3.2. 从 STM32CubeMP13 开发包导入工程 若已事先通过 ST 官方网站或 Github 下载了 STM32CubeMP13 软件开发包,也可导入开发包中的工程示例代码,从示例代码开始进行项目开发。! M: Q2 b$ H9 j% F 这里以 FSBLA_Sdmmc1 工程为例。1 }$ o" l; h- B" b) w8 b 项目路径:\Projects\STM32MP135C-DK\Applications\FSBLA\FSBLA_Sdmmc15 Q& O8 ~/ i4 h; B) Y 1. 打开 STM32CubeIDE,导入 project% H$ t5 X: ]- r6 {0 W/ }2 b5 t 2. 点击 Files -> Import… ![]() ▲ 图 11 STM32CubeIDE 右键项目菜单- Z4 [. S( e- V0 @+ ~( R2 ^ ! k' l4 `2 B$ b 3. 选择 Existing Projects into Workspace3 }" n$ M T- \ ^# p: l: y 4. 点击 Next>+ e# E w" B1 f! u ![]() 7 O+ e+ |: h% A8 a& `; X ▲ 图 12 STM32CubeIDE 导入已存在项目 5.点击 Browse…,找到目录 \Projects\STM32MP135C-DK\Applications\FSBLA- z! @% {' A) e( a0 {1 C 6. 选中 FSBLA_Sdmmc1_A7 工程 7. 点击 Finish,导入 Project ![]() ! L2 n |9 D& z6 F+ t2 c) ]4 O ▲ 图 13 STM32CubeIDE 选择导入项目' Q4 ]0 u) u$ u. ~1 R 5 v* A& C; v1 i: ~1 j 8. 工程导入完成。! X7 x" F# B# s: t 5 T/ s) M+ _2 C5 W6 L7 c 04 STM32MP13x 工程的在线调试1 b7 {9 {* v+ b 工程创建完成后,接下来本章节将介绍如何基于 STM32CubeIDE 进行工程编译及在线调试。 STM32MP135 内部包含 128KByte SYSRAM,若代码小于 128KByte,可直接运行于内部SYSRAM 中,适用于验证一些简单的外设实例。若代码大于 128KByte,则需要将程序运行于DDR 中。下面将分别阐述。$ t+ B4 l* m7 M3 x# r% Y 4.1. 在 SYSRAM 中调试程序 仍以前述导入的 FSBLA_Sdmmc1_A7 工程为例。, R2 b1 V6 W J0 g 1. 首先,将开发板切换到工程模式 2. 连接 Type-C 电源3. 连接 MicroUSB,这里板载已支持 ST-Link ![]() $ A; e: G0 ?/ s ▲ 图 14 开发板切换工程模式 4. 右键项目工程名称,选择 Build Project,完成编译。 ![]() ▲ 图 15 选择编译工程 ) Z% s3 j# f4 i/ {4 f2 }+ Z 5. 右键工程名称,选择 Debug As -> STM32 C/C++ Application+ x: k9 e# E7 L( g$ ]$ G ![]() 5 r% R9 x! h& Q4 ?6 N ▲ 图 16 选择调试项目方法 1# }$ V2 r, B9 `6 q0 g4 z 6. 或点击 Debug 图标 7. 进入 Debug Configurations….3 z1 R* T( q0 `% D- D7 ?" p ![]() 4 e7 q0 d& R. L( q" |9 t! C3 h ▲图 17 选择调试项目方法 2 8. 进入调试配置菜单 ![]() & [7 P. m2 y3 i3 A- |1 Z ▲图 18 调试配置页面4 v5 v2 u+ f* [9 `8 P ![]() 9 P4 l8 d: |) [) v4 T 8 P! T2 M( M: U2 U % q$ u# ^! p- ~ 9. 即可像 MCU 一样调试您的代码。% f! Q- O7 _- p) B ![]() 9 D; r/ a6 o( [# n5 x" D' \ ▲图 19 项目调试窗口3 }* B5 F; A0 A: }- \8 q 4.2. 在 DDR 中调试程序 当代码量超过 SYSRAM(128KB)的大小时,需要将程序运行在 DDR。这里以 BSP_BasicTemplates 工程为例展示如何开发运行于 DDR 的用户程序、 / j ]5 Q Y) a; z! C2 j' c 1. 首先,按照前述方法导入项目工程( f, }$ i3 _) X4 i- j ![]() ▲图 20 导入 Templates 工程8 z, ~8 T( l3 m3 ?% l x 2. 打开 C/C++ Build 配置' M+ }1 t$ x8 L' j+ w: D/ Y 3. 在 Preprocessor 中添加 USE_DDR 宏定义) ?! }+ ?$ w, v7 z5 A ![]() ▲图 21 使能 DDR 宏' l) y$ P# h1 B3 W+ P8 ]* ^ 7 X7 ] ]9 [, J8 K& W$ T& I5 q' C o3 D7 R$ ]% G* s" U, o3 F, @! r 4. 修改链接文件,重命名为 “stm32mp13xx_a7_ddr.ld” 5. 修改 REGION_ALIAS 定义到 DDR 区域: 6. 重新编译后,目标文件将链接到 DDR ![]() ' u; G& G. {) _( b ▲图 22 修改链接空间4 ^, J" D2 M* _+ Y ![]() ▲图 23 选择链接文件' K7 C1 I. ]- ~0 \# h/ \( s 7. 在调试之前需要先运行 DDR_Init 对 DDR 进行初始化 8. 按照前述方法导入 DDR_Init 工程,编译后全速运行一次,并保持开发板不掉电项目路径:\STM32MP135C-DK\Examples\DDR\DDR_Init ![]() * S* t) u+ X4 M# C! } p' O ▲ 图 24 运行 DDR 初始化& |8 E; k5 ^& a; g% \+ _: |' Z5 [4 i+ n 9. 回到 BSP_BasicTemplates 工程。 10. 在 Debug configuration 对话框中,将 Startup 页面的 monitor reset 删除。 ![]() ▲ 图 25 修改调试参数" h! I- F3 ^3 D+ r + G& B; S2 j5 F2 \" z8 U9 N ) q0 {. F+ U$ i: C( Z 11. 点击 Debug 进入调试 12. 可以看到当前 main 函数的地址已经为 0xC000 开头的 DDR 位置 # }" X5 S- S' s9 {6 I ![]() / a' n3 L" p6 l2 e2 a ▲ 图 26 在 DDR 中调试工程 05 从外部 Flash 启动5 e( u# B& m" l6 N! x ![]() 8 o/ r1 k+ |* w1 D1 V ▲ 图 27 STM32MP13 启动流程 4 ^$ l) M2 c' @; J' W E1 n 从外部 flash 引导 STM32MP13, 一般需要包含两个部分源码。如上图所示,芯片上电后,首先运行内部固化的一段 ROM CODE,ROM CODE 从用户配置的启动器件中寻找 FSBLA,并将其拷贝至 SYSRAM 中,FSBLA 运行后,执行 DDR 初始化及用户代码(CUBE EXAMPLE)拷贝到 DDR 中,最终实现跳转到 DDR 中运行用户程序的目的。 这里以 SDCard 启动为例,在第三章节中,我们编译调试的 FSBLA_Sdmmc1_A7 工程,即实现了 FSBLA 部分的功能,BSP_BasicTemplates 工程为实际开发的用户项目。完成启动需要将这两个工程生成的镜像文件都烧录到 SDCard 中。4 B: T% i& l( j2 g) | 2 e6 p( `: X' e* B; {% f • FSBLA 需烧录到 SDCard 的固定位置 LBA128 或 LBA640,ROM CODE 固定从这两个位置寻找 FSBLA。 • CUBE EXAMPLE 的存放位置可在 FSBLA 程序中修改,默认为 SDCard 的 LBA640。+ s# S& l& G- e4 r; B( ?1 H# X, r Y • 如果有烧录过 OpenSTLinux 的卡,需先格式化。原因是 ROM Code 优先从 GPT 分区表中寻找 FSBLA,若分区表存在,新烧录到 LBA128 位置的 FSBLA 将会被忽略。 ![]() ▲ 图 28 镜像在 SDCard 中的 Layout/ Y/ r. s" z' J* O, K # l2 k- [5 y" b9 A) Z2 t# k1 Q 需要注意的是,FSBLA 和 CUBE EXAMPLE 都需要加入 STM32 Header,才能被系统识别。STM32 Header 是 ROM CODE 加载二进制文件的必要格式,每一个被 ROM CODE 加载的二进制文件都需要在头部添加特定的 STM32 Header。STM32CubeMP13 开发包中提供了ImageHeader 工具,用于为项目二进制文件添加 STM32 Header。开发者不需要深究 STM32Header 的详细内容。 ![]() ▲ 图 29 STM32 Header 信息 8 G; q) B; L$ ]# i 为用户程序加入 STM32 Header,可在工程配置的 post-build steps 中加入如下命令:9 @1 S( ~8 k- k# b1 }$ ^7 E “(path_to_STM32CubeMP13/ B$ N f! }7 X1 C Package)/Utilities/ImageHeader/postbuild_STM32MP13.sh"1 p0 v) g& A8 E7 Y* g7 k) q "${gnu_tools_for_stm32_compiler_path}" , c* v) p; `* p "${BuildArtifactFileBaseName}"7 q/ V1 Q( K/ C: e ; y3 M6 F4 | p* t7 \; ? 重新编译完成后,即可生成打上 STM32 Header 的目标文件。1 ~% F6 U7 j& Z9 [% G ![]() ▲ 图 30 添加 Post-build 命令 注:path_to_STM32CubeMP13 Package 为 STM32CubeMP13 开发包的存放路径。 4 Z, [# F, c U$ ^( G 至此,已准备好待烧入 SDCard 的目标文件:8 }/ S, }$ R* F9 w& |- V) j 1. 已添加 STM32 Header 的 FSBLA_Sdmmc 目标文件:FSBLA_Sdmmc1_A7_Signed.bin (即 FSBL)8 ?: ]; y2 K2 Q. E! L V 2. 已添加 STM32 Header 的 CUBE EXAMPLE 目标文件:MP13_BSP_BasicTemplates.stm32(即用户工程) 烧录工程位于 STM32CubeMP13 开发包的如下目录: \Projects\STM32MP135C-DK\External_Loader,以二进制的方式提供了烧录时需要的两个引导文件,包括:% T7 @9 n0 L9 A. J/ u* v 1.STM32PRGFW_UTIL_MP13xx_CP_Serial_Boot.stm32 2.SD_Ext_Loader.bin其中,STM32PRGFW_UTIL_MP13xx_CP_Serial_Boot.stm32 为基于开源工程。; H* V. o; J5 Q+ a - o. v8 f. d* @/ D Openbootloader 实现的一套 IAP 应用,执行烧录流程管理。SD_Ext_Loader.bin 工程执行SDCard 设备的实际擦写操作。 ( R! T( C1 t4 p# \2 g ) R! K" V/ {! x) \ 目前,引导设备可支持 SDCard,QSPI NOR FLASH、EMMC 等,若项目开发中需要修改适配不同的存储设备,可联系 ST 窗口获取烧录工程源码。) I- x6 Q1 X9 F" V* u! S! q: {1 T 将需要烧录的两个文件拷贝到 External_Loader 目录下,与烧录工程的两个文件存放在相同位置,然后修改 tsv 文件。完成后,目录中文件列表和 tsv 文件内容如图所示。$ N- t& d" f* ]7 n5 n ![]() ▲ 图 31 烧录文件列表/ `! J( ~, R! v' [* {; k: `3 Z ![]() ▲ 图 32 tsv 文件内容& ~. r# r) x0 I8 }3 S6 N8 n0 n2 o % V. p" Y* h5 N! {7 W- F 接下来,即可使用 STM32CubeProg 进行镜像烧录。可支持通过 USB 或 UART 连接,不支持通过 ST-LINK 连接。这里以 UART 连接为例: 1. 开发板跳线设置到 000 并上电 2. 连接 MicroUSB 口,查看 COM 号。注意通过串口连接时需要断开 USB OTG' j! B1 j% Y* m/ W4 N8 h4 v4 E# x9 \ 3. STM32CubeProgrammer 选择连接方式为 UART,选择相应 COM 口 4. 点击 Connect 连接5 y# h: f# T+ x- n/ Z% w- _7 ] ![]() ![]() 5. 点击 Open File,选择 FlashLayout_OpenBL_ExtLoaderSDMMC_SerialBoot.tsv 文件' [, ^2 E' I6 d$ d/ l/ I0 C3 y 6. 点击 Browse,选择目标文件夹:\Projects\STM32MP135C DK\External_Loader\SD_Ext_Loader9 [1 E3 R6 O3 {" i; T$ A* B 7. 点击 Download,开始下载镜像0 y9 G' w# e( |9 u. l- L8 _# e% e ![]() 7 n& }; ~. ?. }! K) i$ k ![]() 5 U! C. g: L' N: o* G6 f 8. 等待烧录完成0 @% L) W; Y* v; t- ~" x 9. 将板子断电,boot mode 切换至 SDCard 启动 10. 重新上电,即可引导启动 ![]() , O, ]8 v4 _. _ 转载自:STM32 7 c G* P* l, q, B5 M # V# X1 `' Q* W6 D* e1 e' T |
拷打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开发板,响应硬实时需求