STMCU小助手
发布时间:2024-11-22 19:09
|
01 引言 STM32MP13x 系列 MPU 是 STM32 Arm®Cortex® MPU 家族中的一部分,它拥有单核Cortex®-A7 核心,支持核心频率 650MHz~1GHz,不仅能够轻松运行 Linux 操作系统,还同时提供官方 HAL 库,用于支持基于 RTOS 或无 OS 的项目方案,即裸跑应用程序。 本应用文档将就以下几个部分简述如何在 STM32MP13 系列 MPU 上开始无 OS 项目的开发:) j' l t. z8 u, i- c7 D2 V • STM32MP13x Baremetal 开发环境简介 • STM32MP13x 工程的创建 • STM32MP13x 工程的在线调试+ J9 | k! x5 V) i6 p% A • 镜像烧录及从外部 Flash 启动9 E% H) g( n$ J. J& Z. n # |% `+ O! P6 p: \ i 02 STM32MP13x Baremetal 开发环境简介& W, w' a- L+ e* a4 F% q. Q) P% x/ p) p 2.1 开发工具及环境 STM32MP13x Baremetal 开发工具主要包括: 1. 烧录工具:STM32CubeProg ( 版本大于 v2.15.0) 2. 配置工具:STM32CubeMX (版本大于 v6.10.0)+ j3 @; b6 y( Z# M V 3. 开发调试工具:IAR(版本大于 v9.50),或 STM32CubeIDE(版本大于 v1.14)9 t, z: N7 s! h' p 本文示例基于 STM32CubeIDE 开发调试工具。( e' w$ A. k8 ~ 3 ]' w5 s* g% F4 o: m+ A 4 ?' h! { l7 u* l- D 2.2 STM32CubeMP13 开发包 STM32CubeMP13 开发包同步发布于 ST 官网 www.st.com 和 github.com,可通过如下方式下载:+ j* u; x9 m" ^4 ?8 P9 I 1. ST 官网下载链接 2. Github 仓库链接9 | Q' R: Z6 [$ L& P% \ 3. 通过 STM32CubeMx 软件下载2 H( n. r# q) A- Q$ c$ j. d 2.2.1. STM32CubeMP13 开发包总览% o6 C$ C4 l1 r( B: W STM32CubeMP13 开发包运行在 Arm® Cortex®-A7 处理器上,由以下三部分组成: • Level 0:驱动程序,包含 HAL、LL、BSP、CMSIS • Level 1:中间件,包含 Eclipse ThreadX(原 AzureRTOS),USB Host & Device 库$ k3 n P' l. g7 U* G2 f6 H6 D5 M* E8 v • Level 2:包含各种板级示例程序 除此之外,还包括一些工具助手等。! | h. ~6 n0 g' w$ E- a& O, o, K3 D : d) d1 {8 F* T U! x: j2 ^ ' Y; [( I" Q, X% ^, ~( G5 s
▲ 图 1 Baremetal 开发包源码框架 9 z$ e+ y% G2 }" [ y. u0 r1 D6 \7 e 2 u. d( G/ f: s" w, m 2.2.2. 源码目录结构6 [/ _, `% B: q4 L4 k
▲ 图 2 Baremetal 开发包源码目录 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, USB 已支持的 LL drivers :" E$ Z: I* R, c9 c0 K3 n • ADC, DMA/DMAMUX, EXTI, ETZPC, GPIO, I2C, LPTIM, MDMA, PWR, RCC & BUS, RTC, SPI, TIM, USART , I: I/ B$ x/ D# Z4 [$ j& i1 B BSP 与 BSP 组件: • 基于 HAL 封装了更高一级的 API,为 LED、按钮、相机、LCD、SD 卡和 COM 端口提供 API,包含了以下一些外围器件的驱动:GC2145, LAN8742, MCP23x17, RK043FN48H, STMIPID022 q9 ?0 N2 Q2 I1 D7 e% ^! R: ^4 K ?/ a2 Q7 J0 u% I- w( H# e! h 中间件程序: • 包含一系列支持某种服务的库文件及接口文件,目前已支持:Eclipse ThreadX(原 AzureRTOS),STM32_USB_Device_Library,( t1 W o I% T# ?* C STM32_USB_Host_Library 9 U1 Q! N- U6 Y( p0 U, ?, M 项目工程:# D- f2 u* [% z- r • Examples:基于 HAL 接口的简单示例,没有中间件功能。6 B# O" W3 k+ t) z6 G: @: H0 t • Applications:较完整的工程应用实例,包含中间件功能。 • External_Loader: 烧录镜像及从外部存储器启动的应用示例。 • Template: 板级工程应用框架。 实用工具:7 ]0 O6 d, t( g- V% h# a8 l • Imageheader:用于添加 stm32 头,支持存储设备启动。 • Fonts:提供了一组用于显示的标准字体,包括 font8,font12,font16,font20,font245 P, o4 l E, i' V: J/ M # S F1 V- U6 C. `% k 9 b; g, j$ }$ n# _ 03 STM32MP13x 工程的创建 STM32MP13x 工程创建,可通过以下两种方式:+ O9 i: x" ~3 |, R4 j; m. X 1. 使用 STM32CubeMx 配置并生成项目框架代码,并基于该框架代码开发应用。 2. 导入 STM32CubeMP13 开发包示例工程代码,并基于该示例代码开发应用。 ) E) V3 [* c2 ?! j, z7 l. o 3.1. 从 STM32CubeMX 创建工程 STM32CubeMX 是 STM32Cube 工具家族中的一员,它采用简单易用的图形界面,可以帮助开发者快速配置硬件和软件。可支持从 MCU/MPU 选型,引脚配置,系统时钟以及外设时钟设置,到外设参数配置,中间件参数配置等,并可生成适用的 C 代码项目。& D) f0 q# c: B4 L# c0 O2 s 本章节简述如何通过 STM32CubeMx 生成适用于 STM32MP13x 的裸跑应用框架。使用该方式无需提前下载 STM32CubeMP13 开发包,STM32CubeMx 可自动联网下载。$ i' p: \4 x0 w" |$ f& T 1. 打开 STM32CubeMX,点击 ACCESS TO MCU SELECTOR, 2. 在搜索框中输入 STM32MP13 相应料号,如:STM32MP135FAF7,双击打开配置窗口 3. 弹框选择 MP13 Bare Metal,将生成 bare metal 工程框架。
▲ 图 3 STM32CubeMx 选择器件5 _" u8 o' t% z" ?% r
▲ 图 4 STM32CubeMx 选择工程类型% U# f5 P+ p) {# z' a ( ^1 F. c f" A/ D0 q" l% m2 A1 R- k 4. 切换到 Project Manager 标签页,输入工程名称。* A' D3 N" E4 c! o/ r8 Q! b/ y 5. 在此页进行项目选项配置,可保持默认。6 C' [9 ?, e; T" E* w
: }& C7 |; [) d( ~/ s5 w! o ▲ 图 5 STM32CubeMx 工程设置页面 , n% ]( W: H( E 6. 回到 Pinout & Configuration 标签页。& h& j7 i; T1 @ 7. 使能 RCC 和 DDR。7 @8 ~/ d* T% I 8. 配置各外设总线,配置方法与其他 STM32 MCU 相同(也可参考 Help -> Docs & Resources) . f/ A7 w9 o7 ^% ~; Z
+ O0 X. Q! J7 m6 |" B9 B* W+ R5 x ▲ 图 6 STM32CubeMx 外设配置页面 9 c& |9 c# G: b% ?+ U( ?9 w2 N0 h 9. 切换到 Clock Configuration 标签页。; |2 B# D) a k" l0 ^ 10. 若软件报告时钟错误,可点击 Yes 自动修复。* d* \2 q# O% t! H0 ~1 p 11. 输入 CPU、DDR、总线等的工作频率,系统会自动匹配合适参数。. n4 g+ O2 ?8 r5 h0 ? : Y$ H# H, _$ b0 e1 i* f) P
▲ 图 7 STM32CubeMx 时钟配置页面& ?1 [8 y/ v0 G) N4 U/ E + n9 M1 @3 j7 L" Y/ ^- _. ]$ ] 12. 所有外设配置完成,即可点击 GENERATE CODE,开始生成工程代码。 13. 若第一次使用,软件将提示是否下载 STM32CubeMP13 开发包,可点击“yes”,软件自动联网下载前述 STM32CubeMP13 开发包。 14. 生成完成后,可直接点击 Open Project,将打开 STM32CubeIDE 工程。7 c* y& h( X: ]/ x2 q
! L1 t+ N9 ]3 C8 s2 \ ▲ 图 8 STM32CubeMx 代码生成页面" g# u3 Y) M6 G B
▲ 图 9 STM32CubeMx 完成代码生成页面
▲ 图 10 STM32CubeMx 生成工程代码示例8 R' U; J: K- z. J8 F% n 15. 至此,工程框架已生成,可通过 STM32CubeIDE 进行用户代码的编辑、编译、调试。3 U b0 V4 @) a+ }& [7 g , S1 a% D0 J7 O. v) q3 O* J* c2 H 3 @- t- A$ {; M 3.2. 从 STM32CubeMP13 开发包导入工程 若已事先通过 ST 官方网站或 Github 下载了 STM32CubeMP13 软件开发包,也可导入开发包中的工程示例代码,从示例代码开始进行项目开发。 . w: X4 ]7 y! U [: i( c 这里以 FSBLA_Sdmmc1 工程为例。 项目路径:\Projects\STM32MP135C-DK\Applications\FSBLA\FSBLA_Sdmmc1, @) h* K! v5 ]. u- N 1. 打开 STM32CubeIDE,导入 project 2. 点击 Files -> Import…
▲ 图 11 STM32CubeIDE 右键项目菜单- x- I9 `" f8 [! W1 J7 M+ U 8 }/ A# M8 `! P9 V( b3 R2 M 3. 选择 Existing Projects into Workspace 4. 点击 Next>, V: ^# [3 @9 |) s% y, z+ A
; `- g6 o- [) {5 e0 F& v* z( H ▲ 图 12 STM32CubeIDE 导入已存在项目5 y: H2 y; X4 I - T. [8 `, n# O: ? 7 |! f* \0 Z/ k6 O 5.点击 Browse…,找到目录 \Projects\STM32MP135C-DK\Applications\FSBLA" r1 M. V0 x- T 6. 选中 FSBLA_Sdmmc1_A7 工程- H H2 \$ [ u" ?$ S1 p6 R" M 7. 点击 Finish,导入 Project% t, m. q: Q( n$ R% d' Z* Z
▲ 图 13 STM32CubeIDE 选择导入项目$ k; u9 e" q( A: L. g/ w 8. 工程导入完成。6 {: j# R% h, u' v. ^/ Z 04 STM32MP13x 工程的在线调试( _9 b/ {5 V( T; S2 L 工程创建完成后,接下来本章节将介绍如何基于 STM32CubeIDE 进行工程编译及在线调试。 + h& p9 f$ s3 P! n/ J6 d STM32MP135 内部包含 128KByte SYSRAM,若代码小于 128KByte,可直接运行于内部SYSRAM 中,适用于验证一些简单的外设实例。若代码大于 128KByte,则需要将程序运行于DDR 中。下面将分别阐述。 - R, x$ a9 y+ k& r8 L( [7 M 4.1. 在 SYSRAM 中调试程序5 q+ L9 M% \) v% P! P; J 仍以前述导入的 FSBLA_Sdmmc1_A7 工程为例。 1. 首先,将开发板切换到工程模式 2. 连接 Type-C 电源3. 连接 MicroUSB,这里板载已支持 ST-Link0 g: B |6 y- e: v, k& m
# D K( Y% [- X8 R' c: s ▲ 图 14 开发板切换工程模式 3 x0 B: |- P5 j1 X K; V! J 4. 右键项目工程名称,选择 Build Project,完成编译。 O0 T6 u& `1 Y8 [0 I. Z
0 ~0 s9 ?2 G7 @7 p+ v+ b ▲ 图 15 选择编译工程 5. 右键工程名称,选择 Debug As -> STM32 C/C++ Application3 \: H% c) e7 \7 x) H: W
▲ 图 16 选择调试项目方法 1& _9 X6 o. k* z 6. 或点击 Debug 图标 7. 进入 Debug Configurations….
▲图 17 选择调试项目方法 2 8. 进入调试配置菜单7 d! F( [/ K/ N
4 c, m3 C. C0 V ▲图 18 调试配置页面! p% Y$ O% P- O& E + [( [0 Y. O; w! U/ ]/ J
4 {8 ]+ `7 [% | 7 ^3 Z& Q! x& x( W# b- t3 m0 G 9. 即可像 MCU 一样调试您的代码。
7 t; K) q- g* f3 f7 }& S' R ▲图 19 项目调试窗口( D" U7 F) W$ k ! E4 v& i5 y, o& |1 @ 4.2. 在 DDR 中调试程序0 T( g: _1 \6 V. U+ G1 I7 W- P3 [) S 当代码量超过 SYSRAM(128KB)的大小时,需要将程序运行在 DDR。这里以 BSP_BasicTemplates 工程为例展示如何开发运行于 DDR 的用户程序、. {/ n! f/ F c: U5 N, r 1. 首先,按照前述方法导入项目工程
▲图 20 导入 Templates 工程 3 @: z* @9 o+ O% z/ H6 G # p, d4 ^; q7 V2 L. b2 w/ W 2. 打开 C/C++ Build 配置# _" S) e& V7 d/ ~$ c( j8 @ u 3. 在 Preprocessor 中添加 USE_DDR 宏定义
! l1 i9 g: D& |, A) a9 w% F ▲图 21 使能 DDR 宏/ G9 Z: K X$ C) S6 l: o* F 0 ?% O( S1 D* H7 T' ? & _2 z9 ^6 k) l' C$ O2 f 4. 修改链接文件,重命名为 “stm32mp13xx_a7_ddr.ld” 5. 修改 REGION_ALIAS 定义到 DDR 区域: 6. 重新编译后,目标文件将链接到 DDR. {# V. n/ Q4 f
▲图 22 修改链接空间2 z8 ~* K, z. G
▲图 23 选择链接文件8 g' ]2 K# d ?, i! [ ; i0 c3 _# x$ C7 U- Z. k 7. 在调试之前需要先运行 DDR_Init 对 DDR 进行初始化 8. 按照前述方法导入 DDR_Init 工程,编译后全速运行一次,并保持开发板不掉电项目路径:\STM32MP135C-DK\Examples\DDR\DDR_Init6 S. p9 X$ w1 Q8 R( f/ J; f
9 f( S' H5 V& B3 t ▲ 图 24 运行 DDR 初始化 4 |# T( h4 p4 t3 ] 3 ^! n! C5 c/ w5 r4 A/ G 9. 回到 BSP_BasicTemplates 工程。 10. 在 Debug configuration 对话框中,将 Startup 页面的 monitor reset 删除。
▲ 图 25 修改调试参数4 H1 R s9 z0 W" M2 U7 H2 p 11. 点击 Debug 进入调试0 c: V' t" H* F0 O 12. 可以看到当前 main 函数的地址已经为 0xC000 开头的 DDR 位置) L+ E% r, k' Z/ R S5 E L. C* x1 I8 I b: o; ~
7 c& `, J' |1 y, @& T4 s; O# I ▲ 图 26 在 DDR 中调试工程 : I0 L) R$ Q& p% _% O3 I0 i 05 从外部 Flash 启动
8 ~( e2 U( l/ l" V ▲ 图 27 STM32MP13 启动流程( S! ~1 T( x4 C3 f4 x, Y; A5 X 从外部 flash 引导 STM32MP13, 一般需要包含两个部分源码。如上图所示,芯片上电后,首先运行内部固化的一段 ROM CODE,ROM CODE 从用户配置的启动器件中寻找 FSBLA,并将其拷贝至 SYSRAM 中,FSBLA 运行后,执行 DDR 初始化及用户代码(CUBE EXAMPLE)拷贝到 DDR 中,最终实现跳转到 DDR 中运行用户程序的目的。 这里以 SDCard 启动为例,在第三章节中,我们编译调试的 FSBLA_Sdmmc1_A7 工程,即实现了 FSBLA 部分的功能,BSP_BasicTemplates 工程为实际开发的用户项目。完成启动需要将这两个工程生成的镜像文件都烧录到 SDCard 中。$ Y. L! M; B* ?* n 9 m: s9 R5 r) U, s • FSBLA 需烧录到 SDCard 的固定位置 LBA128 或 LBA640,ROM CODE 固定从这两个位置寻找 FSBLA。8 G+ \2 L4 `3 g$ n: Q# a5 P • CUBE EXAMPLE 的存放位置可在 FSBLA 程序中修改,默认为 SDCard 的 LBA640。 • 如果有烧录过 OpenSTLinux 的卡,需先格式化。原因是 ROM Code 优先从 GPT 分区表中寻找 FSBLA,若分区表存在,新烧录到 LBA128 位置的 FSBLA 将会被忽略。+ L$ E$ T" A C4 G
▲ 图 28 镜像在 SDCard 中的 Layout, j t# \& Y7 J 需要注意的是,FSBLA 和 CUBE EXAMPLE 都需要加入 STM32 Header,才能被系统识别。STM32 Header 是 ROM CODE 加载二进制文件的必要格式,每一个被 ROM CODE 加载的二进制文件都需要在头部添加特定的 STM32 Header。STM32CubeMP13 开发包中提供了ImageHeader 工具,用于为项目二进制文件添加 STM32 Header。开发者不需要深究 STM32Header 的详细内容。
▲ 图 29 STM32 Header 信息/ s# w. e) z+ C/ z 为用户程序加入 STM32 Header,可在工程配置的 post-build steps 中加入如下命令: “(path_to_STM32CubeMP13: E- ^; G0 L" @ Package)/Utilities/ImageHeader/postbuild_STM32MP13.sh"( E& _) G* G) z: j "${gnu_tools_for_stm32_compiler_path}" & z# T6 [' |5 f) M+ r" A3 A "${BuildArtifactFileBaseName}"4 U% @0 |- r1 A3 E$ [3 k ) I. x) t6 h+ F 重新编译完成后,即可生成打上 STM32 Header 的目标文件。
▲ 图 30 添加 Post-build 命令0 U8 |2 @2 N% @; ~" R) h ) y) A, L9 k2 f( J 注:path_to_STM32CubeMP13 Package 为 STM32CubeMP13 开发包的存放路径。 # J8 e/ \' Q1 `+ ^% o- N- t 至此,已准备好待烧入 SDCard 的目标文件:2 u8 S* D% t4 ]9 S& f1 [: { 1. 已添加 STM32 Header 的 FSBLA_Sdmmc 目标文件:FSBLA_Sdmmc1_A7_Signed.bin (即 FSBL)2 `- F' x1 \, g2 \; s9 N# S# T 2. 已添加 STM32 Header 的 CUBE EXAMPLE 目标文件:MP13_BSP_BasicTemplates.stm32(即用户工程)2 S& h1 w/ m4 v3 ]5 O/ \ 7 q3 P' g9 K" r6 w+ k 烧录工程位于 STM32CubeMP13 开发包的如下目录: \Projects\STM32MP135C-DK\External_Loader,以二进制的方式提供了烧录时需要的两个引导文件,包括:1 ^* d( q y: v 1.STM32PRGFW_UTIL_MP13xx_CP_Serial_Boot.stm32 2.SD_Ext_Loader.bin其中,STM32PRGFW_UTIL_MP13xx_CP_Serial_Boot.stm32 为基于开源工程。 Openbootloader 实现的一套 IAP 应用,执行烧录流程管理。SD_Ext_Loader.bin 工程执行SDCard 设备的实际擦写操作。 0 v+ l+ y; j1 N& e0 R7 B6 W C . W. n f, {2 C+ X 目前,引导设备可支持 SDCard,QSPI NOR FLASH、EMMC 等,若项目开发中需要修改适配不同的存储设备,可联系 ST 窗口获取烧录工程源码。: ~% T) }- i c) {; \. {) |5 ?7 S 将需要烧录的两个文件拷贝到 External_Loader 目录下,与烧录工程的两个文件存放在相同位置,然后修改 tsv 文件。完成后,目录中文件列表和 tsv 文件内容如图所示。
▲ 图 31 烧录文件列表4 g' y7 x# B3 g: G5 o$ H
▲ 图 32 tsv 文件内容0 A1 `0 j( k, A, A8 w9 Q: X4 H4 P 接下来,即可使用 STM32CubeProg 进行镜像烧录。可支持通过 USB 或 UART 连接,不支持通过 ST-LINK 连接。这里以 UART 连接为例:+ L# d1 M" h( \6 A 1. 开发板跳线设置到 000 并上电$ N% ?1 Q' u1 d3 a' r( \2 { 2. 连接 MicroUSB 口,查看 COM 号。注意通过串口连接时需要断开 USB OTG- O* s% d' W |- D* a 3. STM32CubeProgrammer 选择连接方式为 UART,选择相应 COM 口( Y3 E5 a- _" a% w& E) O; v4 Q9 ?( V) M 4. 点击 Connect 连接% k2 r$ i3 o$ f" s
5. 点击 Open File,选择 FlashLayout_OpenBL_ExtLoaderSDMMC_SerialBoot.tsv 文件9 _3 s& M+ M: R$ z 6. 点击 Browse,选择目标文件夹:\Projects\STM32MP135C DK\External_Loader\SD_Ext_Loader" {! T8 }& F8 }( ?2 ^6 a: b0 B K 7. 点击 Download,开始下载镜像
1 P5 E* F' v3 j 8. 等待烧录完成" L% `; U! n/ h; r. ] 9. 将板子断电,boot mode 切换至 SDCard 启动 10. 重新上电,即可引导启动
0 S( U* e( B" d7 U$ A2 L 转载自:STM328 D) }% _! S8 M 7 v2 l' B; a) z1 I: ~ |
直播回顾+QA | STM32MP135在工业组态HMI和工业网关中的应用实践
STM32MP135 MP157 MP257 CoreMark移植&&跑分对比&&多核心负载不均衡问题排查与解决
有奖直播 | STM32MP135在工业组态HMI和工业网关中的应用实践
拷打cubemx【001】——艰难的选型路
linux eclipse编译后自动更新程序
eclipse编写stm32mp135配置
eclipse编写stm32mp135程序
STM32MP135F-DK 开箱测试
openSTlinux系统搭建过程分享
《STM32MPU安全启动》学习笔记之uboot如何校验kernel和如何使能校验
微信公众号
手机版