01 引言) K3 x6 M8 v( Y* L, y9 L STM32MP13x 系列 MPU 是 STM32 Arm®Cortex® MPU 家族中的一部分,它拥有单核Cortex®-A7 核心,支持核心频率 650MHz~1GHz,不仅能够轻松运行 Linux 操作系统,还同时提供官方 HAL 库,用于支持基于 RTOS 或无 OS 的项目方案,即裸跑应用程序。5 A( T" G9 W4 _+ d - [! N( `7 i* I( v0 h+ k9 R 本应用文档将就以下几个部分简述如何在 STM32MP13 系列 MPU 上开始无 OS 项目的开发:5 e/ I1 l3 K2 X4 @, m* R2 h • STM32MP13x Baremetal 开发环境简介 • STM32MP13x 工程的创建" R$ {+ R/ C9 f3 ?3 c3 ~ • STM32MP13x 工程的在线调试+ R" E0 y9 ?* s" _ • 镜像烧录及从外部 Flash 启动5 ^$ Y% _" Y# e1 C & M/ }: J' c4 I4 k7 m1 T 02 STM32MP13x Baremetal 开发环境简介 2.1 开发工具及环境4 W* Q' P! R7 n9 e5 C STM32MP13x Baremetal 开发工具主要包括: 1. 烧录工具:STM32CubeProg ( 版本大于 v2.15.0) 2. 配置工具:STM32CubeMX (版本大于 v6.10.0)5 f! ]4 p: h: H$ J$ R6 j' m 3. 开发调试工具:IAR(版本大于 v9.50),或 STM32CubeIDE(版本大于 v1.14)0 x4 H. ?) [9 u7 l( H 本文示例基于 STM32CubeIDE 开发调试工具。2 ] I. c' \! z- B4 W+ g % q' i3 B( P+ D' E- h& {- _ 2.2 STM32CubeMP13 开发包+ m s! S r" X0 H; r% |' w STM32CubeMP13 开发包同步发布于 ST 官网 www.st.com 和 github.com,可通过如下方式下载:+ o3 p8 M: I3 s! Z 1. ST 官网下载链接 2. Github 仓库链接3 E% [6 p% ]1 R0 e3 b( P 3. 通过 STM32CubeMx 软件下载7 i% q7 n/ V5 v 2.2.1. STM32CubeMP13 开发包总览 STM32CubeMP13 开发包运行在 Arm® Cortex®-A7 处理器上,由以下三部分组成:* C% _# ?- C9 C3 h. S: o8 ^( p8 V/ S • Level 0:驱动程序,包含 HAL、LL、BSP、CMSIS; j: Z H: d1 H: G3 _ • Level 1:中间件,包含 Eclipse ThreadX(原 AzureRTOS),USB Host & Device 库 • Level 2:包含各种板级示例程序3 }* k& F0 {, N% v 除此之外,还包括一些工具助手等。 ▲ 图 1 Baremetal 开发包源码框架3 v" g" b5 B- B: V8 \7 N / X# `- |4 F( r- ~& E* b& |; O3 x 2.2.2. 源码目录结构+ a! Y6 j5 H y' N. |: K ▲ 图 2 Baremetal 开发包源码目录 2.2.3. 开发包支持模块列表: E+ v& p4 _! r/ J& \! @* e 已支持的 HAL drivers :8 T) ?, y5 q! D1 J. x6 t$ K • 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 7 I8 m$ Q2 c! V+ O 已支持的 LL drivers : • ADC, DMA/DMAMUX, EXTI, ETZPC, GPIO, I2C, LPTIM, MDMA, PWR, RCC & BUS, RTC, SPI, TIM, USART2 h& u: Y3 x9 ~3 ] BSP 与 BSP 组件: • 基于 HAL 封装了更高一级的 API,为 LED、按钮、相机、LCD、SD 卡和 COM 端口提供 API,包含了以下一些外围器件的驱动:GC2145, LAN8742, MCP23x17, RK043FN48H, STMIPID02 中间件程序: • 包含一系列支持某种服务的库文件及接口文件,目前已支持:Eclipse ThreadX(原 AzureRTOS),STM32_USB_Device_Library,- h" [- z, P* T: n2 s STM32_USB_Host_Library 7 s# l' w) j: K0 E( G: g 项目工程:# w3 m- O% R4 E* t# L4 j • Examples:基于 HAL 接口的简单示例,没有中间件功能。 • Applications:较完整的工程应用实例,包含中间件功能。 • External_Loader: 烧录镜像及从外部存储器启动的应用示例。 • Template: 板级工程应用框架。& Z9 H5 i' O, q& v: U3 E & d: K8 j- J! F6 _4 |) L: } 实用工具: O) c6 d/ @/ }. H) [ • Imageheader:用于添加 stm32 头,支持存储设备启动。( {& q8 r" Z: d! r4 p • Fonts:提供了一组用于显示的标准字体,包括 font8,font12,font16,font20,font24 03 STM32MP13x 工程的创建7 N5 Z& |1 {" i1 N, w* {7 @" ~ STM32MP13x 工程创建,可通过以下两种方式:5 F7 V) S2 l4 j+ [- S. M( i( r) d1 b 1. 使用 STM32CubeMx 配置并生成项目框架代码,并基于该框架代码开发应用。: a6 `( A- k7 }+ R2 M6 `! F# U0 P 2. 导入 STM32CubeMP13 开发包示例工程代码,并基于该示例代码开发应用。 ( \3 z/ {9 j3 n3 r: w u4 [ 3.1. 从 STM32CubeMX 创建工程 STM32CubeMX 是 STM32Cube 工具家族中的一员,它采用简单易用的图形界面,可以帮助开发者快速配置硬件和软件。可支持从 MCU/MPU 选型,引脚配置,系统时钟以及外设时钟设置,到外设参数配置,中间件参数配置等,并可生成适用的 C 代码项目。 4 [$ {3 j+ p" }+ d1 |5 b 本章节简述如何通过 STM32CubeMx 生成适用于 STM32MP13x 的裸跑应用框架。使用该方式无需提前下载 STM32CubeMP13 开发包,STM32CubeMx 可自动联网下载。; w, V7 s- {& \) ~1 L) n$ } 1. 打开 STM32CubeMX,点击 ACCESS TO MCU SELECTOR, 2. 在搜索框中输入 STM32MP13 相应料号,如:STM32MP135FAF7,双击打开配置窗口6 q ~ N4 b" r' ~) B- g* c" o 3. 弹框选择 MP13 Bare Metal,将生成 bare metal 工程框架。- c, o" z3 q( n2 _ ▲ 图 3 STM32CubeMx 选择器件 + y6 Q6 k6 Z& w+ U; ? ▲ 图 4 STM32CubeMx 选择工程类型 4. 切换到 Project Manager 标签页,输入工程名称。2 D& F* b. r8 t3 X# W6 H E! Y3 g3 a 5. 在此页进行项目选项配置,可保持默认。; x- {8 F# J) y3 [) I8 `$ D. r. y- Z 7 m0 m1 F v X- T# ? ▲ 图 5 STM32CubeMx 工程设置页面( e: c& W+ D& l' e0 [ ( r0 @0 x d6 z 6. 回到 Pinout & Configuration 标签页。" v! q- b8 j; U2 _+ b# G' w 7. 使能 RCC 和 DDR。4 t0 f: ]9 A) W0 M8 j3 r" _( d5 i1 U' z 8. 配置各外设总线,配置方法与其他 STM32 MCU 相同(也可参考 Help -> Docs & Resources)6 Y& E3 e1 K3 ?: l0 s& I 6 M- a2 p* m- Q2 Y V" j& V- M2 ^ % n" a/ f4 Q5 s: y$ \ 5 L1 @3 E( V" T! K, J( d. } ▲ 图 6 STM32CubeMx 外设配置页面% u4 _0 C0 V9 }+ G; P4 Z + Y: a& @ M& k6 K- o; z 3 z' ]- s9 A4 o/ E4 @! d8 t 9. 切换到 Clock Configuration 标签页。 10. 若软件报告时钟错误,可点击 Yes 自动修复。5 |3 R- W& j5 e0 ~& u 11. 输入 CPU、DDR、总线等的工作频率,系统会自动匹配合适参数。 ▲ 图 7 STM32CubeMx 时钟配置页面 8 _3 O8 _( t% B& m- p 12. 所有外设配置完成,即可点击 GENERATE CODE,开始生成工程代码。' o3 [1 _4 s6 _5 b 13. 若第一次使用,软件将提示是否下载 STM32CubeMP13 开发包,可点击“yes”,软件自动联网下载前述 STM32CubeMP13 开发包。 14. 生成完成后,可直接点击 Open Project,将打开 STM32CubeIDE 工程。9 B; T: t' G7 e5 g- Z' f ▲ 图 8 STM32CubeMx 代码生成页面2 k d0 r# ?5 ~' ?, n ▲ 图 9 STM32CubeMx 完成代码生成页面 ▲ 图 10 STM32CubeMx 生成工程代码示例 ; `3 Q7 h% v6 M D) W 15. 至此,工程框架已生成,可通过 STM32CubeIDE 进行用户代码的编辑、编译、调试。5 `; [( r/ J' r : J# D6 v Z8 |7 [9 w 3.2. 从 STM32CubeMP13 开发包导入工程 若已事先通过 ST 官方网站或 Github 下载了 STM32CubeMP13 软件开发包,也可导入开发包中的工程示例代码,从示例代码开始进行项目开发。8 ]+ G# q( N0 L # p6 M7 Q7 q, w$ H 这里以 FSBLA_Sdmmc1 工程为例。7 c' ^+ C7 a# P, V2 X 项目路径:\Projects\STM32MP135C-DK\Applications\FSBLA\FSBLA_Sdmmc1 1. 打开 STM32CubeIDE,导入 project7 }3 ?, f4 I6 B; T8 r/ q6 F 2. 点击 Files -> Import…+ b0 n; a' a8 {- o ▲ 图 11 STM32CubeIDE 右键项目菜单! x. E# y8 U9 [( M 3. 选择 Existing Projects into Workspace4 Z6 J' c4 l" F/ k: J 4. 点击 Next>; I2 v& z2 L/ C9 l# Y* \ / X. T: Y; d7 J! j( C; \ ▲ 图 12 STM32CubeIDE 导入已存在项目 5.点击 Browse…,找到目录 \Projects\STM32MP135C-DK\Applications\FSBLA/ n1 o& L8 E3 L& _0 @ 6. 选中 FSBLA_Sdmmc1_A7 工程 7. 点击 Finish,导入 Project " `: P- q: }+ }9 T ▲ 图 13 STM32CubeIDE 选择导入项目 8. 工程导入完成。 9 ~8 o1 I; S( q 04 STM32MP13x 工程的在线调试! r% x" z. ^( B E 工程创建完成后,接下来本章节将介绍如何基于 STM32CubeIDE 进行工程编译及在线调试。 A3 e. Y+ P& N6 V4 l" @' B/ e1 p! I STM32MP135 内部包含 128KByte SYSRAM,若代码小于 128KByte,可直接运行于内部SYSRAM 中,适用于验证一些简单的外设实例。若代码大于 128KByte,则需要将程序运行于DDR 中。下面将分别阐述。 4.1. 在 SYSRAM 中调试程序& u* K8 u1 J4 \$ c+ |" \ 仍以前述导入的 FSBLA_Sdmmc1_A7 工程为例。 1. 首先,将开发板切换到工程模式/ b( ?. E; i$ X s 2. 连接 Type-C 电源3. 连接 MicroUSB,这里板载已支持 ST-Link0 x* O+ Z# U+ X/ ]! d* G ▲ 图 14 开发板切换工程模式* r( E" W8 G& K5 ~ 4. 右键项目工程名称,选择 Build Project,完成编译。1 ~1 o. G+ _/ T; w ▲ 图 15 选择编译工程 T# i* R" O F* @# e: M 2 X! ^/ D E, q. f, M7 B, \+ y0 ` ; x8 o8 C* X/ h 5. 右键工程名称,选择 Debug As -> STM32 C/C++ Application ?4 H2 N) Y7 L& |, R8 q ▲ 图 16 选择调试项目方法 1 6. 或点击 Debug 图标! A; ?. `% r0 Y7 h 7. 进入 Debug Configurations…. 6 t" q; Y4 A0 Y- C' T& \ ▲图 17 选择调试项目方法 2 & N/ ]; `* z" x- e x8 ]* ~ ( M, n# \+ t3 p& I 8. 进入调试配置菜单 6 q2 r2 ]9 b" W$ w, y) W; R ▲图 18 调试配置页面* t" V0 ?) K9 K* D8 M9 C - O2 u& B+ t9 `2 B3 b 8 w7 Q- {8 m4 G+ }$ z # q, I8 }4 f1 {5 r1 n! x 9. 即可像 MCU 一样调试您的代码。4 L5 y3 E& k! C% G' \ . S. k) K$ H% V% l/ c5 f- [ ▲图 19 项目调试窗口& r$ _) K# {" T" J 4.2. 在 DDR 中调试程序 当代码量超过 SYSRAM(128KB)的大小时,需要将程序运行在 DDR。这里以 BSP_BasicTemplates 工程为例展示如何开发运行于 DDR 的用户程序、/ s+ A/ l' Z- x, R- Q' N / s3 v Q0 z. f& U# _& C# f' r 1. 首先,按照前述方法导入项目工程 ▲图 20 导入 Templates 工程6 _# ^; f. I5 \$ U $ `7 d0 {5 m8 j, ^7 _ 2. 打开 C/C++ Build 配置 3. 在 Preprocessor 中添加 USE_DDR 宏定义! \" y* k: O$ l3 {8 B7 r% O7 z * z" w; g' E& d7 ? ▲图 21 使能 DDR 宏 " W; M2 K1 G* b8 D) l; d* _ 4 q, @ L& M. b# M 4. 修改链接文件,重命名为 “stm32mp13xx_a7_ddr.ld” 5. 修改 REGION_ALIAS 定义到 DDR 区域: 6. 重新编译后,目标文件将链接到 DDR ▲图 22 修改链接空间7 m: x; r2 e5 l7 H7 k* A6 `, T ! k+ s) k# t7 r% ]! o* q) W ▲图 23 选择链接文件 7. 在调试之前需要先运行 DDR_Init 对 DDR 进行初始化, [" ?2 A1 ]7 H, M N9 p+ t* W 8. 按照前述方法导入 DDR_Init 工程,编译后全速运行一次,并保持开发板不掉电项目路径:\STM32MP135C-DK\Examples\DDR\DDR_Init3 T4 X p& Y/ Q1 p$ N; I( b, I ▲ 图 24 运行 DDR 初始化5 e+ r) q2 o. m. V , J- R3 Z* u# G ^ 9. 回到 BSP_BasicTemplates 工程。 10. 在 Debug configuration 对话框中,将 Startup 页面的 monitor reset 删除。4 i' I; d# ]& M: q ▲ 图 25 修改调试参数% P! W6 Q5 M: \ 11. 点击 Debug 进入调试* e- s0 f; x- R% u0 Z; ^ 12. 可以看到当前 main 函数的地址已经为 0xC000 开头的 DDR 位置 0 M# s. N* b/ ?( V $ n; u( k# g% T ▲ 图 26 在 DDR 中调试工程 ' G9 C& e3 l8 ]+ g6 q 05 从外部 Flash 启动( I7 A% U/ Y+ J ! V* N3 L# I& S! H- M2 k. j8 K ▲ 图 27 STM32MP13 启动流程0 Z# I8 ?# [8 f7 r ( R; W" a3 d- q5 X* ?. F* p 从外部 flash 引导 STM32MP13, 一般需要包含两个部分源码。如上图所示,芯片上电后,首先运行内部固化的一段 ROM CODE,ROM CODE 从用户配置的启动器件中寻找 FSBLA,并将其拷贝至 SYSRAM 中,FSBLA 运行后,执行 DDR 初始化及用户代码(CUBE EXAMPLE)拷贝到 DDR 中,最终实现跳转到 DDR 中运行用户程序的目的。8 l* k( f( P$ k f . @% l% d6 L5 ]! ~ 这里以 SDCard 启动为例,在第三章节中,我们编译调试的 FSBLA_Sdmmc1_A7 工程,即实现了 FSBLA 部分的功能,BSP_BasicTemplates 工程为实际开发的用户项目。完成启动需要将这两个工程生成的镜像文件都烧录到 SDCard 中。( J( {" ^1 D1 w2 L. v 7 O* P4 x I& i- A- z • FSBLA 需烧录到 SDCard 的固定位置 LBA128 或 LBA640,ROM CODE 固定从这两个位置寻找 FSBLA。 • CUBE EXAMPLE 的存放位置可在 FSBLA 程序中修改,默认为 SDCard 的 LBA640。" m3 Z( Z8 H5 h • 如果有烧录过 OpenSTLinux 的卡,需先格式化。原因是 ROM Code 优先从 GPT 分区表中寻找 FSBLA,若分区表存在,新烧录到 LBA128 位置的 FSBLA 将会被忽略。 ▲ 图 28 镜像在 SDCard 中的 Layout, S4 P# ]6 \9 I) s# r. T. S 需要注意的是,FSBLA 和 CUBE EXAMPLE 都需要加入 STM32 Header,才能被系统识别。STM32 Header 是 ROM CODE 加载二进制文件的必要格式,每一个被 ROM CODE 加载的二进制文件都需要在头部添加特定的 STM32 Header。STM32CubeMP13 开发包中提供了ImageHeader 工具,用于为项目二进制文件添加 STM32 Header。开发者不需要深究 STM32Header 的详细内容。 ▲ 图 29 STM32 Header 信息' J8 w5 t( V; ^! C $ g& o7 |+ X9 d, c& m* c( _& @% G 为用户程序加入 STM32 Header,可在工程配置的 post-build steps 中加入如下命令: s& N6 P5 S- L8 H “(path_to_STM32CubeMP13 Package)/Utilities/ImageHeader/postbuild_STM32MP13.sh" "${gnu_tools_for_stm32_compiler_path}" ) C! @+ Y. q9 N- @ "${BuildArtifactFileBaseName}" 重新编译完成后,即可生成打上 STM32 Header 的目标文件。 ▲ 图 30 添加 Post-build 命令 w; y9 A+ _" ]+ h! o) I k) M# E 注:path_to_STM32CubeMP13 Package 为 STM32CubeMP13 开发包的存放路径。 . J$ K2 r+ G( }5 ~. C' S 至此,已准备好待烧入 SDCard 的目标文件: 1. 已添加 STM32 Header 的 FSBLA_Sdmmc 目标文件:FSBLA_Sdmmc1_A7_Signed.bin (即 FSBL)" P9 e0 b+ _$ }) G 2. 已添加 STM32 Header 的 CUBE EXAMPLE 目标文件:MP13_BSP_BasicTemplates.stm32(即用户工程) 烧录工程位于 STM32CubeMP13 开发包的如下目录:. P* j7 O E' n \Projects\STM32MP135C-DK\External_Loader,以二进制的方式提供了烧录时需要的两个引导文件,包括: 1.STM32PRGFW_UTIL_MP13xx_CP_Serial_Boot.stm32 2.SD_Ext_Loader.bin其中,STM32PRGFW_UTIL_MP13xx_CP_Serial_Boot.stm32 为基于开源工程。0 A. Q2 j/ D+ e$ s, R3 ~ & s& c! q# _5 `* v1 u' B Openbootloader 实现的一套 IAP 应用,执行烧录流程管理。SD_Ext_Loader.bin 工程执行SDCard 设备的实际擦写操作。* S2 `4 @ B0 O/ L* ?% B* Z ( u& j2 Z' ]0 d* C 目前,引导设备可支持 SDCard,QSPI NOR FLASH、EMMC 等,若项目开发中需要修改适配不同的存储设备,可联系 ST 窗口获取烧录工程源码。 j. e& ]4 h4 F- j3 X) { 将需要烧录的两个文件拷贝到 External_Loader 目录下,与烧录工程的两个文件存放在相同位置,然后修改 tsv 文件。完成后,目录中文件列表和 tsv 文件内容如图所示。5 i# G1 f: I9 K2 i ▲ 图 31 烧录文件列表 ▲ 图 32 tsv 文件内容 4 ^. U+ ]4 P# ^$ O' w% H6 _ 接下来,即可使用 STM32CubeProg 进行镜像烧录。可支持通过 USB 或 UART 连接,不支持通过 ST-LINK 连接。这里以 UART 连接为例: 1. 开发板跳线设置到 000 并上电 2. 连接 MicroUSB 口,查看 COM 号。注意通过串口连接时需要断开 USB OTG 3. STM32CubeProgrammer 选择连接方式为 UART,选择相应 COM 口 4. 点击 Connect 连接3 P) W0 S) A6 R 5. 点击 Open File,选择 FlashLayout_OpenBL_ExtLoaderSDMMC_SerialBoot.tsv 文件 6. 点击 Browse,选择目标文件夹:\Projects\STM32MP135C DK\External_Loader\SD_Ext_Loader8 |9 A# q( v: Y6 p! N7 D9 l$ H3 T! K 7. 点击 Download,开始下载镜像 , I ~0 m7 ~7 f1 ?9 w 7 t; h) T# O7 }$ ^$ Q) f 8. 等待烧录完成 9. 将板子断电,boot mode 切换至 SDCard 启动8 m) Q5 G% m% h 10. 重新上电,即可引导启动$ w) t' n; q' e " o2 B- {! z: z% I: f$ Y! e6 w& E 转载自:STM324 x( l9 W! N0 | & C s$ U( Q5 q. p |
linux eclipse编译后自动更新程序
eclipse编写stm32mp135配置
eclipse编写stm32mp135程序
STM32MP135F-DK 开箱测试
openSTlinux系统搭建过程分享
《STM32MPU安全启动》学习笔记之uboot如何校验kernel和如何使能校验
《STM32MPU安全启动》学习笔记 1.0 介绍
聊聊 STM32 MPU OpenSTLinux 实时扩展包 X-LINUX-RT
STM32开发板推荐 | 支持裸跑的米尔STM32MP135开发板,响应硬实时需求
最新消息:意法半导体最具性价比、速度最快的单核MPU STM32MP13现已支持运行RTOS!意法半导体兑现了之前的承诺!