01 引言$ L; G- q( D, x STM32MP13x 系列 MPU 是 STM32 Arm®Cortex® MPU 家族中的一部分,它拥有单核Cortex®-A7 核心,支持核心频率 650MHz~1GHz,不仅能够轻松运行 Linux 操作系统,还同时提供官方 HAL 库,用于支持基于 RTOS 或无 OS 的项目方案,即裸跑应用程序。 8 A/ I9 Q) E& x& e3 w1 J- D( o$ j 本应用文档将就以下几个部分简述如何在 STM32MP13 系列 MPU 上开始无 OS 项目的开发:# d1 m+ Y/ z5 o/ b, g, E1 V • STM32MP13x Baremetal 开发环境简介 • STM32MP13x 工程的创建- G8 b8 P" ^1 N$ H5 i7 s • STM32MP13x 工程的在线调试 • 镜像烧录及从外部 Flash 启动 02 STM32MP13x Baremetal 开发环境简介 2.1 开发工具及环境 STM32MP13x Baremetal 开发工具主要包括: 1. 烧录工具:STM32CubeProg ( 版本大于 v2.15.0)& _/ ]! q$ V# K" ^ 2. 配置工具:STM32CubeMX (版本大于 v6.10.0)2 r+ g9 J& @ l1 A' V8 d; Y8 Y' s 3. 开发调试工具:IAR(版本大于 v9.50),或 STM32CubeIDE(版本大于 v1.14); F, I% j( \9 Y2 Q) \ 本文示例基于 STM32CubeIDE 开发调试工具。9 H) a/ M4 F0 n8 e. m* o 3 Q& r2 ^' F% N! @2 E 2.2 STM32CubeMP13 开发包 STM32CubeMP13 开发包同步发布于 ST 官网 www.st.com 和 github.com,可通过如下方式下载:' v' b. B" r& \! R4 I 1. ST 官网下载链接! Z, I0 w( _) H2 g! u1 R+ q 2. Github 仓库链接 3. 通过 STM32CubeMx 软件下载 1 L1 S2 L1 f$ W- j! @ F 2.2.1. STM32CubeMP13 开发包总览 STM32CubeMP13 开发包运行在 Arm® Cortex®-A7 处理器上,由以下三部分组成:& T) n0 l3 C+ H • Level 0:驱动程序,包含 HAL、LL、BSP、CMSIS5 F2 v. j( D8 c( U* I$ L) } • Level 1:中间件,包含 Eclipse ThreadX(原 AzureRTOS),USB Host & Device 库. m# n) ~) m9 H • Level 2:包含各种板级示例程序: \% I! r) ~6 ] R& V. K% m+ f- S4 J 除此之外,还包括一些工具助手等。 4 c& E9 K/ w) U ▲ 图 1 Baremetal 开发包源码框架, s4 I' ?( [ |6 G3 ?! ~ ' u6 l+ ~) s4 _; ]/ Z2 \+ W 2.2.2. 源码目录结构, c1 d" {) h+ L% k3 A2 R& l# H( O8 p ▲ 图 2 Baremetal 开发包源码目录# x' Y$ m* ]4 |* ^* o( h 2.2.3. 开发包支持模块列表 已支持的 HAL drivers :. _) Y1 f& Y6 t' T1 C+ g" g • 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 :% e% q9 ~( _. _6 H4 ]# I" O • ADC, DMA/DMAMUX, EXTI, ETZPC, GPIO, I2C, LPTIM, MDMA, PWR, RCC & BUS, RTC, SPI, TIM, USART. m$ `( H/ C1 Y% R" P- J BSP 与 BSP 组件: • 基于 HAL 封装了更高一级的 API,为 LED、按钮、相机、LCD、SD 卡和 COM 端口提供 API,包含了以下一些外围器件的驱动:GC2145, LAN8742, MCP23x17, RK043FN48H, STMIPID02$ {$ l! y+ e% i X' B 中间件程序: • 包含一系列支持某种服务的库文件及接口文件,目前已支持:Eclipse ThreadX(原 AzureRTOS),STM32_USB_Device_Library, STM32_USB_Host_Library7 o6 @5 Y" j5 j. n. V' i6 f" Y* J S8 ^+ C' r2 U3 h: L+ f! | 项目工程: • Examples:基于 HAL 接口的简单示例,没有中间件功能。 • Applications:较完整的工程应用实例,包含中间件功能。 • External_Loader: 烧录镜像及从外部存储器启动的应用示例。' V+ u+ o: y4 a+ p3 A • Template: 板级工程应用框架。$ ]9 \- `! z' s/ t2 h 实用工具:" ]! I; S/ s+ Y9 b! @ • Imageheader:用于添加 stm32 头,支持存储设备启动。 • Fonts:提供了一组用于显示的标准字体,包括 font8,font12,font16,font20,font24 ( }. Y7 V1 H0 ] W8 `9 Y5 U 03 STM32MP13x 工程的创建 STM32MP13x 工程创建,可通过以下两种方式:: G* b' k& ^; s7 M( X 1. 使用 STM32CubeMx 配置并生成项目框架代码,并基于该框架代码开发应用。' C+ T8 {. R( N7 g 2. 导入 STM32CubeMP13 开发包示例工程代码,并基于该示例代码开发应用。& n& M- u, k: g3 K- {4 H" K: ^ 3.1. 从 STM32CubeMX 创建工程: x& C! |, `0 C z STM32CubeMX 是 STM32Cube 工具家族中的一员,它采用简单易用的图形界面,可以帮助开发者快速配置硬件和软件。可支持从 MCU/MPU 选型,引脚配置,系统时钟以及外设时钟设置,到外设参数配置,中间件参数配置等,并可生成适用的 C 代码项目。* n3 q6 B. M$ ]. |' I0 l8 ] 2 X1 T* A) ]3 R9 `# s 本章节简述如何通过 STM32CubeMx 生成适用于 STM32MP13x 的裸跑应用框架。使用该方式无需提前下载 STM32CubeMP13 开发包,STM32CubeMx 可自动联网下载。 1. 打开 STM32CubeMX,点击 ACCESS TO MCU SELECTOR,2 I( x' M6 h* m. r' T$ i/ H 2. 在搜索框中输入 STM32MP13 相应料号,如:STM32MP135FAF7,双击打开配置窗口* x* B4 D( Y u1 x 3. 弹框选择 MP13 Bare Metal,将生成 bare metal 工程框架。 ▲ 图 3 STM32CubeMx 选择器件2 V5 |/ i/ J2 M8 w: Z5 d4 h ▲ 图 4 STM32CubeMx 选择工程类型 4. 切换到 Project Manager 标签页,输入工程名称。4 g, g8 Q7 b" S, t4 w8 ~ 5. 在此页进行项目选项配置,可保持默认。; O/ _4 ?0 X5 q- W: v ▲ 图 5 STM32CubeMx 工程设置页面% Q0 h# X5 l# `1 _& g% H2 b$ E0 c " d# P8 _3 A( o( X8 H% |7 V 6 m/ p4 [3 V' x 6. 回到 Pinout & Configuration 标签页。" [, f( n/ T) \3 d$ c 7. 使能 RCC 和 DDR。 8. 配置各外设总线,配置方法与其他 STM32 MCU 相同(也可参考 Help -> Docs & Resources)* u* @! ^7 C8 e/ @' I0 _ 8 w P8 |. ^" V h ▲ 图 6 STM32CubeMx 外设配置页面 $ N5 A0 z4 S/ Y! o/ M 9 H3 u5 F' m2 Q C3 M6 k1 {2 m# I 9. 切换到 Clock Configuration 标签页。 10. 若软件报告时钟错误,可点击 Yes 自动修复。 11. 输入 CPU、DDR、总线等的工作频率,系统会自动匹配合适参数。 2 Z' v/ B! S6 a1 V' o5 K ▲ 图 7 STM32CubeMx 时钟配置页面9 |& h# p" }( e; P + E6 I- f& A/ |! _& F6 f. ]2 l' r ( L* r. c, H* Q3 P7 L# x ~: Z! L 12. 所有外设配置完成,即可点击 GENERATE CODE,开始生成工程代码。 13. 若第一次使用,软件将提示是否下载 STM32CubeMP13 开发包,可点击“yes”,软件自动联网下载前述 STM32CubeMP13 开发包。 14. 生成完成后,可直接点击 Open Project,将打开 STM32CubeIDE 工程。, V# @1 Q) T( d( \9 y( ^/ N ▲ 图 8 STM32CubeMx 代码生成页面 ▲ 图 9 STM32CubeMx 完成代码生成页面8 H# U2 l3 ^5 ~ ▲ 图 10 STM32CubeMx 生成工程代码示例9 }# _6 \0 |, l: p 15. 至此,工程框架已生成,可通过 STM32CubeIDE 进行用户代码的编辑、编译、调试。# g% O& E+ \$ ]* I! m% M 0 Z; J6 d% S- y( a" f6 `7 s 3.2. 从 STM32CubeMP13 开发包导入工程5 r9 h2 N3 U0 y, m) l6 n 若已事先通过 ST 官方网站或 Github 下载了 STM32CubeMP13 软件开发包,也可导入开发包中的工程示例代码,从示例代码开始进行项目开发。8 }3 P E* ^0 M# C5 C 这里以 FSBLA_Sdmmc1 工程为例。; h: K5 {4 @' J6 D 项目路径:\Projects\STM32MP135C-DK\Applications\FSBLA\FSBLA_Sdmmc1 1. 打开 STM32CubeIDE,导入 project 2. 点击 Files -> Import… ▲ 图 11 STM32CubeIDE 右键项目菜单 3. 选择 Existing Projects into Workspace/ _, c- [& ?4 D5 `3 m 4. 点击 Next> ▲ 图 12 STM32CubeIDE 导入已存在项目 & o& n9 w* @" ?8 {& u0 |* A+ w 5.点击 Browse…,找到目录 \Projects\STM32MP135C-DK\Applications\FSBLA8 I1 r- X9 g3 t! t8 S 6. 选中 FSBLA_Sdmmc1_A7 工程! O# W6 [+ w, i# } 7. 点击 Finish,导入 Project ▲ 图 13 STM32CubeIDE 选择导入项目 & v, d9 y: u a R 8. 工程导入完成。2 x. j. j9 l1 e 4 O2 i( C W5 h; S8 R* u + ]' \. ]6 @. l) n( W& A# V 04 STM32MP13x 工程的在线调试 工程创建完成后,接下来本章节将介绍如何基于 STM32CubeIDE 进行工程编译及在线调试。 9 n& d3 ?$ r; v3 W# }, o STM32MP135 内部包含 128KByte SYSRAM,若代码小于 128KByte,可直接运行于内部SYSRAM 中,适用于验证一些简单的外设实例。若代码大于 128KByte,则需要将程序运行于DDR 中。下面将分别阐述。+ ]* {/ W+ h2 v9 b; d( c. f 4.1. 在 SYSRAM 中调试程序: ]! Z" l- a6 r 仍以前述导入的 FSBLA_Sdmmc1_A7 工程为例。 1. 首先,将开发板切换到工程模式 2. 连接 Type-C 电源3. 连接 MicroUSB,这里板载已支持 ST-Link ▲ 图 14 开发板切换工程模式 3 M/ P1 P4 h# G& s 4. 右键项目工程名称,选择 Build Project,完成编译。 3 c& s1 }4 w. X5 [9 y+ m+ D ▲ 图 15 选择编译工程$ ^2 |+ ^1 P9 ]% o0 p 5. 右键工程名称,选择 Debug As -> STM32 C/C++ Application . x% o3 }) \4 U0 g# J+ R ▲ 图 16 选择调试项目方法 1 6. 或点击 Debug 图标& X g7 O8 |2 i) |' X3 f 7. 进入 Debug Configurations…. * x! v( W9 i% `9 x: F' s! Z2 b ▲图 17 选择调试项目方法 2& a/ g: c e" l8 R$ O: c % q1 C# h9 }% W& U: {0 A1 y' W 8. 进入调试配置菜单 ▲图 18 调试配置页面1 ]" K5 p+ A/ \/ I( ~$ [ \ 9 `- P) V# t# Y. a( b+ m8 c* i 6 R `/ ?% l z/ ?; F 5 q6 W( ^: `0 s. B& A! X 9. 即可像 MCU 一样调试您的代码。5 V7 ]: T; g- e) J( `& A 1 h6 {$ s3 s+ s0 J7 s3 z ▲图 19 项目调试窗口 4.2. 在 DDR 中调试程序. c' O2 C! {5 n* i# x: B9 z 当代码量超过 SYSRAM(128KB)的大小时,需要将程序运行在 DDR。这里以 BSP_BasicTemplates 工程为例展示如何开发运行于 DDR 的用户程序、+ C4 i( M. L+ @( T( I 5 H6 M$ O7 c9 A7 ^% k 1. 首先,按照前述方法导入项目工程 ▲图 20 导入 Templates 工程 1 u8 D: k1 G" B4 i! j- I 2. 打开 C/C++ Build 配置: v+ O0 ~6 |5 K1 F 3. 在 Preprocessor 中添加 USE_DDR 宏定义 & C: ? r l! U ▲图 21 使能 DDR 宏! ?5 q. L/ ]0 D* e6 c2 l* ~ 4. 修改链接文件,重命名为 “stm32mp13xx_a7_ddr.ld”2 M q1 |- e4 ?' ]1 U 5. 修改 REGION_ALIAS 定义到 DDR 区域: 6. 重新编译后,目标文件将链接到 DDR ▲图 22 修改链接空间 ▲图 23 选择链接文件* J) F. G. G) ]/ r# K" ~ _) j; \+ J2 ?& u 7. 在调试之前需要先运行 DDR_Init 对 DDR 进行初始化 8. 按照前述方法导入 DDR_Init 工程,编译后全速运行一次,并保持开发板不掉电项目路径:\STM32MP135C-DK\Examples\DDR\DDR_Init( v9 n1 W) h: D1 F+ s% _! d 9 G$ }7 u/ P) I ▲ 图 24 运行 DDR 初始化 $ n9 {6 R, e' L2 y; U 9. 回到 BSP_BasicTemplates 工程。* I* O4 v% \) k! Y8 z 10. 在 Debug configuration 对话框中,将 Startup 页面的 monitor reset 删除。 ▲ 图 25 修改调试参数 8 R; C9 z3 q6 N% L 11. 点击 Debug 进入调试 12. 可以看到当前 main 函数的地址已经为 0xC000 开头的 DDR 位置; _6 a) Q( g# k7 s: f7 g " f; `4 ~2 X+ E L7 h7 I/ l3 Y % T% ~" n6 r" L. ?" g4 e) z ▲ 图 26 在 DDR 中调试工程 # v! G4 _, u! U8 @ j9 {* | $ `% B4 o: m6 P/ k# j! j/ N 05 从外部 Flash 启动/ i" _, T, |5 s' H& N( D# \4 r " R0 g/ K, k* Z& j# @/ a ▲ 图 27 STM32MP13 启动流程 % ^$ s/ G9 u$ b: N( s! f8 ~ 从外部 flash 引导 STM32MP13, 一般需要包含两个部分源码。如上图所示,芯片上电后,首先运行内部固化的一段 ROM CODE,ROM CODE 从用户配置的启动器件中寻找 FSBLA,并将其拷贝至 SYSRAM 中,FSBLA 运行后,执行 DDR 初始化及用户代码(CUBE EXAMPLE)拷贝到 DDR 中,最终实现跳转到 DDR 中运行用户程序的目的。* N3 w4 C* T, R# n V " { n+ I4 d" d9 j! ] 这里以 SDCard 启动为例,在第三章节中,我们编译调试的 FSBLA_Sdmmc1_A7 工程,即实现了 FSBLA 部分的功能,BSP_BasicTemplates 工程为实际开发的用户项目。完成启动需要将这两个工程生成的镜像文件都烧录到 SDCard 中。! W- t) g& N% q. F 2 }1 m% @2 Y0 p4 \. F+ a _ • FSBLA 需烧录到 SDCard 的固定位置 LBA128 或 LBA640,ROM CODE 固定从这两个位置寻找 FSBLA。: G3 U# F+ G2 [. X* p2 Z n+ s1 R6 F% T • CUBE EXAMPLE 的存放位置可在 FSBLA 程序中修改,默认为 SDCard 的 LBA640。 • 如果有烧录过 OpenSTLinux 的卡,需先格式化。原因是 ROM Code 优先从 GPT 分区表中寻找 FSBLA,若分区表存在,新烧录到 LBA128 位置的 FSBLA 将会被忽略。 ▲ 图 28 镜像在 SDCard 中的 Layout t6 N6 k; q- Y9 Z7 c3 \3 x 7 |: l, _( g/ ]- v$ _1 t3 c9 G, 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}" "${BuildArtifactFileBaseName}" 重新编译完成后,即可生成打上 STM32 Header 的目标文件。7 a; x3 X' C8 H- D) x ▲ 图 30 添加 Post-build 命令% T; ]9 R. M; R( c* _3 d 注:path_to_STM32CubeMP13 Package 为 STM32CubeMP13 开发包的存放路径。 至此,已准备好待烧入 SDCard 的目标文件:" a4 u! v) ]5 l9 V' K$ v 1. 已添加 STM32 Header 的 FSBLA_Sdmmc 目标文件:FSBLA_Sdmmc1_A7_Signed.bin (即 FSBL) 2. 已添加 STM32 Header 的 CUBE EXAMPLE 目标文件:MP13_BSP_BasicTemplates.stm32(即用户工程)9 \/ Z' i* g9 e7 f' y8 p ( v; B' w) u8 b8 W( q) s 烧录工程位于 STM32CubeMP13 开发包的如下目录: \Projects\STM32MP135C-DK\External_Loader,以二进制的方式提供了烧录时需要的两个引导文件,包括:, } K$ o' }3 f+ l 1.STM32PRGFW_UTIL_MP13xx_CP_Serial_Boot.stm32 2.SD_Ext_Loader.bin其中,STM32PRGFW_UTIL_MP13xx_CP_Serial_Boot.stm32 为基于开源工程。" m9 V* w v* `6 g9 E* m . l2 E: u, E2 q7 o p' m* l ! z' c& q0 `7 e/ Y5 A9 Q7 g6 K Openbootloader 实现的一套 IAP 应用,执行烧录流程管理。SD_Ext_Loader.bin 工程执行SDCard 设备的实际擦写操作。 |( x I; K/ r- s6 @ 3 C2 W d) `6 M# K0 Y# u 目前,引导设备可支持 SDCard,QSPI NOR FLASH、EMMC 等,若项目开发中需要修改适配不同的存储设备,可联系 ST 窗口获取烧录工程源码。% {) d3 w4 f- w2 a, E 将需要烧录的两个文件拷贝到 External_Loader 目录下,与烧录工程的两个文件存放在相同位置,然后修改 tsv 文件。完成后,目录中文件列表和 tsv 文件内容如图所示。. R4 O7 T# O. R0 @0 S% x( I ▲ 图 31 烧录文件列表5 i5 L6 @; O" L& L6 ] ▲ 图 32 tsv 文件内容1 ~4 b) @ ]' F8 L6 }4 e 0 h# {4 ~3 n. P' ` 接下来,即可使用 STM32CubeProg 进行镜像烧录。可支持通过 USB 或 UART 连接,不支持通过 ST-LINK 连接。这里以 UART 连接为例:3 |+ x v0 r9 E. i" h: D 1. 开发板跳线设置到 000 并上电7 a* [' }2 k7 p( { 2. 连接 MicroUSB 口,查看 COM 号。注意通过串口连接时需要断开 USB OTG* S, G; j% c7 s+ d( |' B3 z3 ` 3. STM32CubeProgrammer 选择连接方式为 UART,选择相应 COM 口 4. 点击 Connect 连接( {; b' o! X N3 S9 d1 K/ T4 | 1 j" y4 ~/ p: N1 s 5. 点击 Open File,选择 FlashLayout_OpenBL_ExtLoaderSDMMC_SerialBoot.tsv 文件 6. 点击 Browse,选择目标文件夹:\Projects\STM32MP135C DK\External_Loader\SD_Ext_Loader, l! B5 R( k) H# Q! I* } 7. 点击 Download,开始下载镜像# h! I0 x- G2 r7 C, Z 6 ~% `) k9 M4 X4 A 8. 等待烧录完成 9. 将板子断电,boot mode 切换至 SDCard 启动 10. 重新上电,即可引导启动 转载自:STM322 ~* ?2 J& l# b' D. A. x ) a5 j! x% N" p* O/ d |
《STM32MPU安全启动》学习笔记 1.0 介绍
聊聊 STM32 MPU OpenSTLinux 实时扩展包 X-LINUX-RT
STM32开发板推荐 | 支持裸跑的米尔STM32MP135开发板,响应硬实时需求
最新消息:意法半导体最具性价比、速度最快的单核MPU STM32MP13现已支持运行RTOS!意法半导体兑现了之前的承诺!
STM32MP135F-DK开发板 -- wifi连接网络
STM32MP135F-DK开发板 -- 搭建交叉编译环境
STM32MP135F-DK开发板评测-开箱亮屏
【STM32MP135-DK】裸机开发适配Llittlefs
STM32MP135F-DK 开箱&开发环境搭建&硬件设计分析
意法半导体扩展STM32Cube开发环境,简化单核STM32MP1裸机软件开发