STMCU小助手
发布时间:2024-11-22 19:09
|
01 引言7 A3 E; M: s+ d6 W6 P2 x+ G STM32MP13x 系列 MPU 是 STM32 Arm®Cortex® MPU 家族中的一部分,它拥有单核Cortex®-A7 核心,支持核心频率 650MHz~1GHz,不仅能够轻松运行 Linux 操作系统,还同时提供官方 HAL 库,用于支持基于 RTOS 或无 OS 的项目方案,即裸跑应用程序。 : V$ t5 ]2 j% e5 i5 b2 T5 x1 {# } 本应用文档将就以下几个部分简述如何在 STM32MP13 系列 MPU 上开始无 OS 项目的开发:/ a, ^& c# k- r" b • STM32MP13x Baremetal 开发环境简介$ v( E; P7 Z+ s: Q; k6 \ • STM32MP13x 工程的创建9 u7 K7 G5 x4 k' _* ` • STM32MP13x 工程的在线调试5 V7 w$ z- M5 t • 镜像烧录及从外部 Flash 启动. K# V' I/ F( }- y " @6 _: G& R; {; W# n& W 02 STM32MP13x Baremetal 开发环境简介 2.1 开发工具及环境 STM32MP13x Baremetal 开发工具主要包括: 1. 烧录工具:STM32CubeProg ( 版本大于 v2.15.0) w* Y* Z' Y# Z0 r6 \6 e5 d$ S 2. 配置工具:STM32CubeMX (版本大于 v6.10.0)& V# S' f* h: t! M: i% l, _ 3. 开发调试工具:IAR(版本大于 v9.50),或 STM32CubeIDE(版本大于 v1.14), I+ a+ a/ `; q: K: j 本文示例基于 STM32CubeIDE 开发调试工具。3 R) m$ R( N2 Q6 ?8 O ; k8 n0 J" W7 U3 z3 ]4 v$ \" D " O6 k" W( B5 R* K/ t! j 2.2 STM32CubeMP13 开发包7 _ K0 Y) \' M6 R9 C STM32CubeMP13 开发包同步发布于 ST 官网 www.st.com 和 github.com,可通过如下方式下载:1 s1 e* S; B! r) q 1. ST 官网下载链接 2. Github 仓库链接# ?! u& P. C7 K# Y 3. 通过 STM32CubeMx 软件下载2 j4 `/ j+ T$ g1 o, n* r: l* | 2.2.1. STM32CubeMP13 开发包总览% T" X' r" b- a3 q8 I STM32CubeMP13 开发包运行在 Arm® Cortex®-A7 处理器上,由以下三部分组成: • Level 0:驱动程序,包含 HAL、LL、BSP、CMSIS8 W1 n% ?1 Z( Q. P • Level 1:中间件,包含 Eclipse ThreadX(原 AzureRTOS),USB Host & Device 库 • Level 2:包含各种板级示例程序1 c! [) k, J0 f# ^% l9 K 除此之外,还包括一些工具助手等。 ; B; Q! I7 e1 s2 x9 E* z , V E! O) U+ K! ~" B
▲ 图 1 Baremetal 开发包源码框架) h) v r6 z4 ?& @ 6 j9 @& x6 L& k# ]8 ` 2.2.2. 源码目录结构
▲ 图 2 Baremetal 开发包源码目录 - |7 H4 L7 u) ~1 t- _ 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 1 W1 y3 y. Y$ ^# [" L 已支持的 LL drivers : • ADC, DMA/DMAMUX, EXTI, ETZPC, GPIO, I2C, LPTIM, MDMA, PWR, RCC & BUS, RTC, SPI, TIM, USART " I* w. @% Z- M3 W! J BSP 与 BSP 组件:; M; x: ?$ i z • 基于 HAL 封装了更高一级的 API,为 LED、按钮、相机、LCD、SD 卡和 COM 端口提供 API,包含了以下一些外围器件的驱动:GC2145, LAN8742, MCP23x17, RK043FN48H, STMIPID025 o; u) I: t- @. ]( l. r 中间件程序:/ ~3 h% G5 [/ c0 P9 K; h • 包含一系列支持某种服务的库文件及接口文件,目前已支持:Eclipse ThreadX(原 AzureRTOS),STM32_USB_Device_Library, STM32_USB_Host_Library& X6 g( M0 i4 @- C& a! s2 w$ H 项目工程:$ d I2 c9 u( Y2 l n; j • Examples:基于 HAL 接口的简单示例,没有中间件功能。; D" w3 s+ @' r: T • Applications:较完整的工程应用实例,包含中间件功能。, z1 y+ ~1 }' D- W+ w0 ^ • External_Loader: 烧录镜像及从外部存储器启动的应用示例。& s) i/ B1 e) T • Template: 板级工程应用框架。 实用工具: • Imageheader:用于添加 stm32 头,支持存储设备启动。 • Fonts:提供了一组用于显示的标准字体,包括 font8,font12,font16,font20,font242 _! |- M4 X. `$ Z ( r3 O# T1 L6 x2 |. t " v1 p8 h% W4 W& [ 03 STM32MP13x 工程的创建 STM32MP13x 工程创建,可通过以下两种方式: 1. 使用 STM32CubeMx 配置并生成项目框架代码,并基于该框架代码开发应用。4 U0 Q: O# f# l 2. 导入 STM32CubeMP13 开发包示例工程代码,并基于该示例代码开发应用。, r5 t0 V' X0 ^1 l& Q! _4 k1 s7 \ 1 d" Z" h3 ?: b" k% t/ g 3.1. 从 STM32CubeMX 创建工程 STM32CubeMX 是 STM32Cube 工具家族中的一员,它采用简单易用的图形界面,可以帮助开发者快速配置硬件和软件。可支持从 MCU/MPU 选型,引脚配置,系统时钟以及外设时钟设置,到外设参数配置,中间件参数配置等,并可生成适用的 C 代码项目。- r/ `6 d& D' Z ^8 _) D 0 `" Z. X1 s3 b- R, y, W/ ? 本章节简述如何通过 STM32CubeMx 生成适用于 STM32MP13x 的裸跑应用框架。使用该方式无需提前下载 STM32CubeMP13 开发包,STM32CubeMx 可自动联网下载。, D# `) L" Y& G 1. 打开 STM32CubeMX,点击 ACCESS TO MCU SELECTOR, 2. 在搜索框中输入 STM32MP13 相应料号,如:STM32MP135FAF7,双击打开配置窗口 3. 弹框选择 MP13 Bare Metal,将生成 bare metal 工程框架。 ?9 f9 [" j8 @! v' @
f8 e, e: c' j( V; w ^4 D ▲ 图 3 STM32CubeMx 选择器件8 {( U5 F) m5 X, n' t, \
▲ 图 4 STM32CubeMx 选择工程类型- s5 e) y; K. s* x. J5 s8 R " T; P! ^% t) k B ~; J7 O 4. 切换到 Project Manager 标签页,输入工程名称。 5. 在此页进行项目选项配置,可保持默认。# m1 M% h/ W2 a6 }3 h7 S# G; f6 X
6 f7 E) r1 s5 U6 j3 U ▲ 图 5 STM32CubeMx 工程设置页面 # s# ?$ P& O. j2 G" b/ ^0 Q z & P3 _. v; a: G0 l# h 6. 回到 Pinout & Configuration 标签页。4 h) [/ V+ K# J( Q8 T( @0 g# r 7. 使能 RCC 和 DDR。 8. 配置各外设总线,配置方法与其他 STM32 MCU 相同(也可参考 Help -> Docs & Resources) 5 }6 Q% X5 U1 n" d# K
4 q1 b- ^& e- G+ F" ~6 a: z* ^ ▲ 图 6 STM32CubeMx 外设配置页面 9. 切换到 Clock Configuration 标签页。 10. 若软件报告时钟错误,可点击 Yes 自动修复。( i0 C) K( w4 v# i3 R. V 11. 输入 CPU、DDR、总线等的工作频率,系统会自动匹配合适参数。' l5 a8 z$ j2 [
▲ 图 7 STM32CubeMx 时钟配置页面 # r! H. B! g' @: R- c7 j+ h 12. 所有外设配置完成,即可点击 GENERATE CODE,开始生成工程代码。 13. 若第一次使用,软件将提示是否下载 STM32CubeMP13 开发包,可点击“yes”,软件自动联网下载前述 STM32CubeMP13 开发包。! F/ }3 E! D5 Z) G6 a/ C' @ 14. 生成完成后,可直接点击 Open Project,将打开 STM32CubeIDE 工程。7 J* C9 i& ]; d) o, a1 B: ^" C
▲ 图 8 STM32CubeMx 代码生成页面& }& L# n, ^4 T
▲ 图 9 STM32CubeMx 完成代码生成页面 U! q8 {! Z" K5 M$ o+ |" L
▲ 图 10 STM32CubeMx 生成工程代码示例; g2 v* L1 r7 \! m/ o* @ " j+ R7 `1 ~+ {: G. H A M 15. 至此,工程框架已生成,可通过 STM32CubeIDE 进行用户代码的编辑、编译、调试。2 S+ \4 Y/ P8 J/ _0 i( x 3.2. 从 STM32CubeMP13 开发包导入工程* W1 R1 _+ c) ]6 k 若已事先通过 ST 官方网站或 Github 下载了 STM32CubeMP13 软件开发包,也可导入开发包中的工程示例代码,从示例代码开始进行项目开发。 这里以 FSBLA_Sdmmc1 工程为例。8 O" a# T. e2 c3 ?. V 项目路径:\Projects\STM32MP135C-DK\Applications\FSBLA\FSBLA_Sdmmc1( W- ~1 v& l5 F! J5 N 1. 打开 STM32CubeIDE,导入 project 2. 点击 Files -> Import…
▲ 图 11 STM32CubeIDE 右键项目菜单' `9 A( p8 Y+ q! l0 n3 C : ?9 j, I/ R7 Q# R3 j" b% u0 e' H : e8 j, ^* [1 m& a- y' \ 3. 选择 Existing Projects into Workspace$ E o* F: e5 b" L 4. 点击 Next>
▲ 图 12 STM32CubeIDE 导入已存在项目5 }4 {; g' t# f2 i 8 h1 [7 N; O9 f6 t4 W) W- h 5.点击 Browse…,找到目录 \Projects\STM32MP135C-DK\Applications\FSBLA 6. 选中 FSBLA_Sdmmc1_A7 工程' |* u( A$ M# @# }) d t, v' } 7. 点击 Finish,导入 Project
/ s! B: {, ~& p( l0 \ ▲ 图 13 STM32CubeIDE 选择导入项目 8. 工程导入完成。 04 STM32MP13x 工程的在线调试 工程创建完成后,接下来本章节将介绍如何基于 STM32CubeIDE 进行工程编译及在线调试。 STM32MP135 内部包含 128KByte SYSRAM,若代码小于 128KByte,可直接运行于内部SYSRAM 中,适用于验证一些简单的外设实例。若代码大于 128KByte,则需要将程序运行于DDR 中。下面将分别阐述。 4.1. 在 SYSRAM 中调试程序 仍以前述导入的 FSBLA_Sdmmc1_A7 工程为例。 C( B; l7 T' x4 a 1. 首先,将开发板切换到工程模式) w/ i4 k5 }' x 2. 连接 Type-C 电源3. 连接 MicroUSB,这里板载已支持 ST-Link* N" D. X) S# v% O6 C9 x# l
8 R* j) \# n2 m1 b! r' i ▲ 图 14 开发板切换工程模式 0 k! a5 Y9 T/ a 4. 右键项目工程名称,选择 Build Project,完成编译。
# B5 c: I! }- ^! ?7 u ▲ 图 15 选择编译工程1 ?) u8 i$ z" a; m" w9 _: E 5. 右键工程名称,选择 Debug As -> STM32 C/C++ Application8 e, M2 {2 V- a7 V( Z
▲ 图 16 选择调试项目方法 16 L, Z; B& N! Y7 X4 e3 H( v* i: z 6. 或点击 Debug 图标 7. 进入 Debug Configurations….; X# _( Y# G. O( n% C* h* {# N$ e& K
% ]/ z" @/ J; K6 M- m8 ? ▲图 17 选择调试项目方法 23 @0 M- a* [7 W0 ~, x & V0 j: B- Y/ i1 j9 C 5 q- p3 s7 t/ a/ y9 ~, W8 \ 8. 进入调试配置菜单# n* f' o* d1 C2 b: `: n
▲图 18 调试配置页面 , O+ j9 ~! p- {; ^
5 s9 N- a2 E% b* d9 A8 u 9. 即可像 MCU 一样调试您的代码。
▲图 19 项目调试窗口2 H- @1 t( C/ {8 T9 q7 ` 4.2. 在 DDR 中调试程序! q9 s4 h4 h+ k( V. Y 当代码量超过 SYSRAM(128KB)的大小时,需要将程序运行在 DDR。这里以 BSP_BasicTemplates 工程为例展示如何开发运行于 DDR 的用户程序、) q+ ?' K5 |9 t/ V2 X5 g 1 @2 @, G2 r. I3 n* ~ 1. 首先,按照前述方法导入项目工程
; z6 L- y( Z* e" i& W# J5 v ▲图 20 导入 Templates 工程' v( G" h& K* N- ]9 A0 s3 C 2. 打开 C/C++ Build 配置 3. 在 Preprocessor 中添加 USE_DDR 宏定义# z. B# F) W/ ~; d+ V3 v
" u# o! ~# y: n3 m) k" Z ▲图 21 使能 DDR 宏8 o8 L/ s; N/ G( W5 J 9 E* S( H* z* Y# K6 M4 [8 X/ { 4 t: n( I# t5 b$ v 4. 修改链接文件,重命名为 “stm32mp13xx_a7_ddr.ld”& A2 f, Y$ } [- f% w! Y4 ^2 \. K 5. 修改 REGION_ALIAS 定义到 DDR 区域: 6. 重新编译后,目标文件将链接到 DDR
7 [, n4 V+ H1 ]! D# \4 I, V ▲图 22 修改链接空间
, O6 | I: G+ m% ^3 \ ▲图 23 选择链接文件 7. 在调试之前需要先运行 DDR_Init 对 DDR 进行初始化- ?- [3 Y& L) }7 [& X) s! ] 8. 按照前述方法导入 DDR_Init 工程,编译后全速运行一次,并保持开发板不掉电项目路径:\STM32MP135C-DK\Examples\DDR\DDR_Init0 L9 a4 r( O6 k
▲ 图 24 运行 DDR 初始化 9. 回到 BSP_BasicTemplates 工程。8 S4 m, {# b: C- x7 s3 _& } 10. 在 Debug configuration 对话框中,将 Startup 页面的 monitor reset 删除。6 b1 ~4 O; ~# _4 [. y8 Z- _
9 p% q% S2 }$ S( S ▲ 图 25 修改调试参数 0 c8 q+ M1 L1 x6 ]. j9 p 3 s3 {5 S! [, k8 b7 u# G 11. 点击 Debug 进入调试 12. 可以看到当前 main 函数的地址已经为 0xC000 开头的 DDR 位置 $ P1 G+ S( f1 L# J 2 k7 H" X7 X6 R; }% a/ _+ r
▲ 图 26 在 DDR 中调试工程# u# A9 |# L0 L9 e: L. U7 o1 ` 05 从外部 Flash 启动
▲ 图 27 STM32MP13 启动流程% A# Q/ W. t8 O" y" F 从外部 flash 引导 STM32MP13, 一般需要包含两个部分源码。如上图所示,芯片上电后,首先运行内部固化的一段 ROM CODE,ROM CODE 从用户配置的启动器件中寻找 FSBLA,并将其拷贝至 SYSRAM 中,FSBLA 运行后,执行 DDR 初始化及用户代码(CUBE EXAMPLE)拷贝到 DDR 中,最终实现跳转到 DDR 中运行用户程序的目的。 这里以 SDCard 启动为例,在第三章节中,我们编译调试的 FSBLA_Sdmmc1_A7 工程,即实现了 FSBLA 部分的功能,BSP_BasicTemplates 工程为实际开发的用户项目。完成启动需要将这两个工程生成的镜像文件都烧录到 SDCard 中。 . X4 N V @5 P2 T. K2 F8 s, o3 I • FSBLA 需烧录到 SDCard 的固定位置 LBA128 或 LBA640,ROM CODE 固定从这两个位置寻找 FSBLA。6 U9 r2 P9 [) e& i+ Z • CUBE EXAMPLE 的存放位置可在 FSBLA 程序中修改,默认为 SDCard 的 LBA640。 • 如果有烧录过 OpenSTLinux 的卡,需先格式化。原因是 ROM Code 优先从 GPT 分区表中寻找 FSBLA,若分区表存在,新烧录到 LBA128 位置的 FSBLA 将会被忽略。4 j% n& d) ]' f6 K
▲ 图 28 镜像在 SDCard 中的 Layout1 a( A# B$ \4 e0 s _, @ 4 W- z5 Y/ }# G! T 需要注意的是,FSBLA 和 CUBE EXAMPLE 都需要加入 STM32 Header,才能被系统识别。STM32 Header 是 ROM CODE 加载二进制文件的必要格式,每一个被 ROM CODE 加载的二进制文件都需要在头部添加特定的 STM32 Header。STM32CubeMP13 开发包中提供了ImageHeader 工具,用于为项目二进制文件添加 STM32 Header。开发者不需要深究 STM32Header 的详细内容。8 \+ {9 c( j' U' s3 t3 P
▲ 图 29 STM32 Header 信息& n- o$ Y3 Q- V: A, N 为用户程序加入 STM32 Header,可在工程配置的 post-build steps 中加入如下命令:) y- x) D4 [) r “(path_to_STM32CubeMP13% C4 \; ]6 Q# T+ w% i: M4 C Package)/Utilities/ImageHeader/postbuild_STM32MP13.sh"6 u' J J; _6 Q "${gnu_tools_for_stm32_compiler_path}" "${BuildArtifactFileBaseName}"7 J3 j. S& I4 p+ K1 E6 j! p" \0 J ! u k; m. h( _# b! ]0 I* ^4 i 重新编译完成后,即可生成打上 STM32 Header 的目标文件。
▲ 图 30 添加 Post-build 命令+ k; A: I/ {3 Z , Q! _3 b m, }- u 注:path_to_STM32CubeMP13 Package 为 STM32CubeMP13 开发包的存放路径。1 Y( l1 W7 j" J1 `# w 至此,已准备好待烧入 SDCard 的目标文件:; b2 t1 z4 c( M! v& }. J! X6 l 1. 已添加 STM32 Header 的 FSBLA_Sdmmc 目标文件:FSBLA_Sdmmc1_A7_Signed.bin (即 FSBL) 2. 已添加 STM32 Header 的 CUBE EXAMPLE 目标文件:MP13_BSP_BasicTemplates.stm32(即用户工程) + I+ t) N8 D2 l. \# K4 j7 ~: E# i 烧录工程位于 STM32CubeMP13 开发包的如下目录:9 M( \( T/ r6 Z* r' H \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 为基于开源工程。5 Y& f) x% x; \1 h* p : ~& Q4 u4 g( ` Openbootloader 实现的一套 IAP 应用,执行烧录流程管理。SD_Ext_Loader.bin 工程执行SDCard 设备的实际擦写操作。" E* j1 U6 R" K0 V8 w % S) D1 B$ k7 Y 目前,引导设备可支持 SDCard,QSPI NOR FLASH、EMMC 等,若项目开发中需要修改适配不同的存储设备,可联系 ST 窗口获取烧录工程源码。1 [+ x. T7 V) B( S 将需要烧录的两个文件拷贝到 External_Loader 目录下,与烧录工程的两个文件存放在相同位置,然后修改 tsv 文件。完成后,目录中文件列表和 tsv 文件内容如图所示。
▲ 图 31 烧录文件列表
▲ 图 32 tsv 文件内容) v: Y9 n, O2 v- F3 A% U* c 接下来,即可使用 STM32CubeProg 进行镜像烧录。可支持通过 USB 或 UART 连接,不支持通过 ST-LINK 连接。这里以 UART 连接为例: 1. 开发板跳线设置到 000 并上电& h- B+ ~- @* u* i S 2. 连接 MicroUSB 口,查看 COM 号。注意通过串口连接时需要断开 USB OTG9 ?7 d2 N9 o: O6 _" C, Q 3. STM32CubeProgrammer 选择连接方式为 UART,选择相应 COM 口5 s. ?- M( d# D. h 4. 点击 Connect 连接
: `" }# H) A# {
5. 点击 Open File,选择 FlashLayout_OpenBL_ExtLoaderSDMMC_SerialBoot.tsv 文件3 P) Q2 V/ n4 k$ w' x 6. 点击 Browse,选择目标文件夹:\Projects\STM32MP135C DK\External_Loader\SD_Ext_Loader 7. 点击 Download,开始下载镜像, N& m0 e Y U8 O7 i0 N$ O7 x+ U
* }$ l& b7 P5 p' Q
8. 等待烧录完成 9. 将板子断电,boot mode 切换至 SDCard 启动/ k* ~. j8 h- O' l" C f% X0 I7 U$ ~ 10. 重新上电,即可引导启动
' T; G6 N+ l$ N& k" e6 {7 z 转载自:STM32+ w: {" Q0 V7 a v0 f/ i |
直播回顾+QA | STM32MP135在工业组态HMI和工业网关中的应用实践
STM32MP135 MP157 MP257 CoreMark移植&&跑分对比&&多核心负载不均衡问题排查与解决
有奖直播 | STM32MP135在工业组态HMI和工业网关中的应用实践
拷打cubemx【001】——艰难的选型路
linux eclipse编译后自动更新程序
eclipse编写stm32mp135配置
eclipse编写stm32mp135程序
STM32MP135F-DK 开箱测试
openSTlinux系统搭建过程分享
《STM32MPU安全启动》学习笔记之uboot如何校验kernel和如何使能校验
微信公众号
手机版