STMCU小助手
发布时间:2024-11-22 19:09
|
01 引言( ~: `9 s# ]! X1 F9 G STM32MP13x 系列 MPU 是 STM32 Arm®Cortex® MPU 家族中的一部分,它拥有单核Cortex®-A7 核心,支持核心频率 650MHz~1GHz,不仅能够轻松运行 Linux 操作系统,还同时提供官方 HAL 库,用于支持基于 RTOS 或无 OS 的项目方案,即裸跑应用程序。) ?! K/ P$ A$ c& u! M 本应用文档将就以下几个部分简述如何在 STM32MP13 系列 MPU 上开始无 OS 项目的开发:$ G# \+ i4 A9 v • STM32MP13x Baremetal 开发环境简介- M% ^- N% S7 R$ [. t6 m5 G6 r • STM32MP13x 工程的创建2 F$ M1 u8 D4 f) E • STM32MP13x 工程的在线调试 • 镜像烧录及从外部 Flash 启动 - y2 |& T6 Y. z i 02 STM32MP13x Baremetal 开发环境简介% e# o6 w" {$ I$ N! E 2.1 开发工具及环境: [! z& U, s5 E1 L: C& L/ y STM32MP13x Baremetal 开发工具主要包括: 1. 烧录工具:STM32CubeProg ( 版本大于 v2.15.0). g8 V h$ }- k: O9 w5 Z6 J5 R 2. 配置工具:STM32CubeMX (版本大于 v6.10.0) 3. 开发调试工具:IAR(版本大于 v9.50),或 STM32CubeIDE(版本大于 v1.14) 本文示例基于 STM32CubeIDE 开发调试工具。0 D% @2 A6 X: K) h $ T( E# E M: }1 M- w3 q 2.2 STM32CubeMP13 开发包 STM32CubeMP13 开发包同步发布于 ST 官网 www.st.com 和 github.com,可通过如下方式下载: 1. ST 官网下载链接 2. Github 仓库链接 3. 通过 STM32CubeMx 软件下载( t/ W. C+ e# m2 Z 2.2.1. STM32CubeMP13 开发包总览 STM32CubeMP13 开发包运行在 Arm® Cortex®-A7 处理器上,由以下三部分组成:+ B2 N! C- a; Q! k5 [" B* t! L • Level 0:驱动程序,包含 HAL、LL、BSP、CMSIS+ _4 M6 J9 l; B8 N1 v- V0 q# t8 G • Level 1:中间件,包含 Eclipse ThreadX(原 AzureRTOS),USB Host & Device 库6 V( e0 m2 D7 b4 F1 @0 | • Level 2:包含各种板级示例程序% {+ s& U! k3 o' d$ u8 a 除此之外,还包括一些工具助手等。 ( e3 ]! r) F. o. q6 w
▲ 图 1 Baremetal 开发包源码框架 " I* Y1 E3 g; d! T 2.2.2. 源码目录结构
▲ 图 2 Baremetal 开发包源码目录 ; F' w4 b9 l# w8 [3 G8 B6 F 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 :$ ~* ^, q5 @0 m, _: U • 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, STMIPID025 E8 S3 d9 X, N0 \& w7 j, G 中间件程序:8 ~/ T! e" I& R4 E$ i • 包含一系列支持某种服务的库文件及接口文件,目前已支持:Eclipse ThreadX(原 AzureRTOS),STM32_USB_Device_Library, `: V% F" C8 ` STM32_USB_Host_Library! a. J1 |1 _1 d4 H( O8 F 9 {" U# [7 G/ N! c$ K$ W5 A1 ` 项目工程:. A7 B& q+ v( O- Q) f- q- L • Examples:基于 HAL 接口的简单示例,没有中间件功能。 • Applications:较完整的工程应用实例,包含中间件功能。 • External_Loader: 烧录镜像及从外部存储器启动的应用示例。, k5 \6 B4 w" Q j! T' t+ K • Template: 板级工程应用框架。" M( t0 l4 ~. {1 S& j8 { 实用工具: • Imageheader:用于添加 stm32 头,支持存储设备启动。' ~* G- Q2 _* K$ O • Fonts:提供了一组用于显示的标准字体,包括 font8,font12,font16,font20,font247 R6 K, u& g0 Y; ] * G7 I/ l+ G, y: [$ ~+ l- V M 03 STM32MP13x 工程的创建( b; }' e4 Y6 w; ]) j/ _ STM32MP13x 工程创建,可通过以下两种方式:! H7 g) T5 l# Z2 c! ~2 z4 X# B) p 1. 使用 STM32CubeMx 配置并生成项目框架代码,并基于该框架代码开发应用。# r9 r6 e" l- @ 2. 导入 STM32CubeMP13 开发包示例工程代码,并基于该示例代码开发应用。& B; e$ ^) e( z5 D R; r 6 K+ z! s' M& U( w1 C( g6 l* g7 i 3.1. 从 STM32CubeMX 创建工程) m3 R+ a# e# C6 ^ STM32CubeMX 是 STM32Cube 工具家族中的一员,它采用简单易用的图形界面,可以帮助开发者快速配置硬件和软件。可支持从 MCU/MPU 选型,引脚配置,系统时钟以及外设时钟设置,到外设参数配置,中间件参数配置等,并可生成适用的 C 代码项目。+ G" C- @8 |. V/ g# C+ D 本章节简述如何通过 STM32CubeMx 生成适用于 STM32MP13x 的裸跑应用框架。使用该方式无需提前下载 STM32CubeMP13 开发包,STM32CubeMx 可自动联网下载。 1. 打开 STM32CubeMX,点击 ACCESS TO MCU SELECTOR, 2. 在搜索框中输入 STM32MP13 相应料号,如:STM32MP135FAF7,双击打开配置窗口, c9 D) ]5 [3 Q9 m c" Y 3. 弹框选择 MP13 Bare Metal,将生成 bare metal 工程框架。& ]' j b% A7 O$ b
) G) k- Z+ B$ _1 p9 @ ▲ 图 3 STM32CubeMx 选择器件# ?; z2 f6 {5 V
▲ 图 4 STM32CubeMx 选择工程类型; J3 P7 J6 f } o, |# s( ?' d % Z9 x& ~- @& K 4. 切换到 Project Manager 标签页,输入工程名称。 5. 在此页进行项目选项配置,可保持默认。/ }$ c2 V4 ^5 _6 V4 `1 t+ O: S
0 [* w" b1 K& r% w- b# U% [ ▲ 图 5 STM32CubeMx 工程设置页面/ V, M% M+ Q1 s1 v 6. 回到 Pinout & Configuration 标签页。 7. 使能 RCC 和 DDR。5 {9 D7 I" ?( E/ [% T5 |4 w 8. 配置各外设总线,配置方法与其他 STM32 MCU 相同(也可参考 Help -> Docs & Resources) 5 b6 y8 I+ X- ~$ ~: s) g9 D$ f0 m$ M
▲ 图 6 STM32CubeMx 外设配置页面 & q7 K3 C ?" d; r% e1 _1 G 9. 切换到 Clock Configuration 标签页。 10. 若软件报告时钟错误,可点击 Yes 自动修复。 11. 输入 CPU、DDR、总线等的工作频率,系统会自动匹配合适参数。
▲ 图 7 STM32CubeMx 时钟配置页面 & x$ E& N5 Q' U: Q- x" i 9 I' O+ Y' }7 c 12. 所有外设配置完成,即可点击 GENERATE CODE,开始生成工程代码。% E3 L$ ~$ T( Z3 S" S 13. 若第一次使用,软件将提示是否下载 STM32CubeMP13 开发包,可点击“yes”,软件自动联网下载前述 STM32CubeMP13 开发包。' o/ }$ s/ U8 W 14. 生成完成后,可直接点击 Open Project,将打开 STM32CubeIDE 工程。
5 w8 ^; K8 `. I O% ? ▲ 图 8 STM32CubeMx 代码生成页面
▲ 图 9 STM32CubeMx 完成代码生成页面
▲ 图 10 STM32CubeMx 生成工程代码示例 7 T5 \* ?- D- ] 15. 至此,工程框架已生成,可通过 STM32CubeIDE 进行用户代码的编辑、编译、调试。 ' z" W" b6 F2 q( V 3.2. 从 STM32CubeMP13 开发包导入工程 若已事先通过 ST 官方网站或 Github 下载了 STM32CubeMP13 软件开发包,也可导入开发包中的工程示例代码,从示例代码开始进行项目开发。$ c6 ^6 d3 r2 z7 L! _ 这里以 FSBLA_Sdmmc1 工程为例。( t- a8 Y( F. G* Q6 _ 项目路径:\Projects\STM32MP135C-DK\Applications\FSBLA\FSBLA_Sdmmc10 g5 Y) S7 S$ g& G: s 1. 打开 STM32CubeIDE,导入 project$ X& x& c+ D& j: k* ^6 u! m 2. 点击 Files -> Import…
▲ 图 11 STM32CubeIDE 右键项目菜单4 f& ?/ v8 g4 X# N 3. 选择 Existing Projects into Workspace/ r% L1 l0 G, ?" Y7 `5 c* R+ A 4. 点击 Next>
▲ 图 12 STM32CubeIDE 导入已存在项目4 K' n t7 c7 u3 q4 N . Z+ n+ ~7 ?; L4 w 5.点击 Browse…,找到目录 \Projects\STM32MP135C-DK\Applications\FSBLA7 K! ?) h! I$ W1 Q2 D( p 6. 选中 FSBLA_Sdmmc1_A7 工程 7. 点击 Finish,导入 Project( S2 p# }& t2 ]+ @
. o* A" X& Y) a# ?+ Q. I ▲ 图 13 STM32CubeIDE 选择导入项目 ; H) N! l2 w% y3 F9 w$ H: | 8. 工程导入完成。, F# i" e, R1 k! [ 04 STM32MP13x 工程的在线调试8 G7 N' S3 h5 l ?% _8 ~# v 工程创建完成后,接下来本章节将介绍如何基于 STM32CubeIDE 进行工程编译及在线调试。: v( Z: y1 L: }% d STM32MP135 内部包含 128KByte SYSRAM,若代码小于 128KByte,可直接运行于内部SYSRAM 中,适用于验证一些简单的外设实例。若代码大于 128KByte,则需要将程序运行于DDR 中。下面将分别阐述。4 A S0 m- ]# t6 L 4 {3 s3 g) \; S2 y9 E 4.1. 在 SYSRAM 中调试程序 仍以前述导入的 FSBLA_Sdmmc1_A7 工程为例。# O* P A/ y: A" M* M9 g+ w 1. 首先,将开发板切换到工程模式+ D1 a9 j9 J1 s 2. 连接 Type-C 电源3. 连接 MicroUSB,这里板载已支持 ST-Link
▲ 图 14 开发板切换工程模式3 [; U. b" t6 k0 H- t9 T! V8 U* A 4. 右键项目工程名称,选择 Build Project,完成编译。
▲ 图 15 选择编译工程 / m' l1 ~! S" M& u! n) @ 1 a) e" v) F V/ C( H) q$ a% @ 5. 右键工程名称,选择 Debug As -> STM32 C/C++ Application9 X! l, T1 G, l9 m
▲ 图 16 选择调试项目方法 1 6. 或点击 Debug 图标2 ^ E, \% P& \; C 7. 进入 Debug Configurations….3 `9 ]8 ?' |( Q( ?+ z3 M6 q
/ K! N6 k3 ~6 o ▲图 17 选择调试项目方法 2 8. 进入调试配置菜单, c+ Q3 i W& i! O* b# I
* F M n. h' n+ r3 `. v5 \2 i9 [6 A ▲图 18 调试配置页面* i7 t& \. A! ?7 @4 y" t- X 1 h' Q: e. e; p# o
" R) B1 u8 a" \ ) r7 O+ H" ^9 Z( I5 V5 X 9. 即可像 MCU 一样调试您的代码。* C0 @" ~- H- \2 @5 Q
. ?1 c$ J0 j* i& w) D! \2 |6 n2 E ▲图 19 项目调试窗口: U" y. s% \ v j4 P5 i0 K + T0 p3 H' a8 Q H. {6 [ 4.2. 在 DDR 中调试程序 Y+ Z% Q* ]+ C2 K: W* H 当代码量超过 SYSRAM(128KB)的大小时,需要将程序运行在 DDR。这里以 BSP_BasicTemplates 工程为例展示如何开发运行于 DDR 的用户程序、6 l% s* D- i! r( z& p1 h# z : O( d8 N$ g2 w: g1 N S( ^2 J( C 1. 首先,按照前述方法导入项目工程' H/ ~# |' j# z) N
▲图 20 导入 Templates 工程, _, i5 v9 N, l" D; J7 t * b# J4 n& L! I4 T8 U! p _ 2. 打开 C/C++ Build 配置4 {- \# I4 t+ V& R# I 3. 在 Preprocessor 中添加 USE_DDR 宏定义
* ?$ f6 ]* P, y# x4 j) t6 L8 J: p9 R ▲图 21 使能 DDR 宏 ) y- B; j3 w5 U* m8 B! d; j- Z 5 q9 p$ T- y1 n3 f- V 4. 修改链接文件,重命名为 “stm32mp13xx_a7_ddr.ld”. J1 x: X- B- g$ m( B 5. 修改 REGION_ALIAS 定义到 DDR 区域:* k+ \3 A% L+ z1 y. t6 C% ?, g! h. L 6. 重新编译后,目标文件将链接到 DDR! z7 j7 F. z; r5 a1 E
5 u) R4 r, N9 K ▲图 22 修改链接空间! q# a: w# `7 D. D
▲图 23 选择链接文件; o1 |+ L! L8 s 7. 在调试之前需要先运行 DDR_Init 对 DDR 进行初始化 8. 按照前述方法导入 DDR_Init 工程,编译后全速运行一次,并保持开发板不掉电项目路径:\STM32MP135C-DK\Examples\DDR\DDR_Init, G9 p4 v; s2 q( I
▲ 图 24 运行 DDR 初始化 ; Q: h% _. x# ?0 z9 @ 9. 回到 BSP_BasicTemplates 工程。% S* B: z+ o W2 ?: z 10. 在 Debug configuration 对话框中,将 Startup 页面的 monitor reset 删除。
▲ 图 25 修改调试参数; l0 W- J8 _# ?7 v( ^- J 7 @1 D$ m, Z6 g7 X 11. 点击 Debug 进入调试+ S1 M' _! ^6 X& \8 A 12. 可以看到当前 main 函数的地址已经为 0xC000 开头的 DDR 位置4 R6 ~& T' @& w1 ~* m % h( p! e6 Z; |% [+ H
- `2 ]0 i* e( _ @7 Z* P4 Y ▲ 图 26 在 DDR 中调试工程8 {# I( R* @4 C$ V + q( O+ _# a% ^) } 05 从外部 Flash 启动
▲ 图 27 STM32MP13 启动流程* a0 D& M) s* ^' z& D' F; K1 D3 ~ . u# ]- G8 o0 C! T8 t% f m0 R 从外部 flash 引导 STM32MP13, 一般需要包含两个部分源码。如上图所示,芯片上电后,首先运行内部固化的一段 ROM CODE,ROM CODE 从用户配置的启动器件中寻找 FSBLA,并将其拷贝至 SYSRAM 中,FSBLA 运行后,执行 DDR 初始化及用户代码(CUBE EXAMPLE)拷贝到 DDR 中,最终实现跳转到 DDR 中运行用户程序的目的。 这里以 SDCard 启动为例,在第三章节中,我们编译调试的 FSBLA_Sdmmc1_A7 工程,即实现了 FSBLA 部分的功能,BSP_BasicTemplates 工程为实际开发的用户项目。完成启动需要将这两个工程生成的镜像文件都烧录到 SDCard 中。 • FSBLA 需烧录到 SDCard 的固定位置 LBA128 或 LBA640,ROM CODE 固定从这两个位置寻找 FSBLA。. k/ M9 O- A) v, B0 | • CUBE EXAMPLE 的存放位置可在 FSBLA 程序中修改,默认为 SDCard 的 LBA640。 • 如果有烧录过 OpenSTLinux 的卡,需先格式化。原因是 ROM Code 优先从 GPT 分区表中寻找 FSBLA,若分区表存在,新烧录到 LBA128 位置的 FSBLA 将会被忽略。" D6 u5 a. B+ B; }3 R7 W( s ~
▲ 图 28 镜像在 SDCard 中的 Layout, i3 \' O, w% R2 w: {4 O2 O 需要注意的是,FSBLA 和 CUBE EXAMPLE 都需要加入 STM32 Header,才能被系统识别。STM32 Header 是 ROM CODE 加载二进制文件的必要格式,每一个被 ROM CODE 加载的二进制文件都需要在头部添加特定的 STM32 Header。STM32CubeMP13 开发包中提供了ImageHeader 工具,用于为项目二进制文件添加 STM32 Header。开发者不需要深究 STM32Header 的详细内容。3 @2 W4 X4 f. k6 x8 H) Q [, ]" x
▲ 图 29 STM32 Header 信息 为用户程序加入 STM32 Header,可在工程配置的 post-build steps 中加入如下命令:3 N0 p5 i0 s, q& X% L) @ “(path_to_STM32CubeMP13 Package)/Utilities/ImageHeader/postbuild_STM32MP13.sh"* K# s' N! b- R6 M/ X "${gnu_tools_for_stm32_compiler_path}" "${BuildArtifactFileBaseName}" , Z! [9 \# p6 ]4 q+ k 重新编译完成后,即可生成打上 STM32 Header 的目标文件。
▲ 图 30 添加 Post-build 命令4 I4 g# h* @4 f, d1 E' n ( G0 d6 x1 R) [9 ^: s, ?. H 注:path_to_STM32CubeMP13 Package 为 STM32CubeMP13 开发包的存放路径。 至此,已准备好待烧入 SDCard 的目标文件: 1. 已添加 STM32 Header 的 FSBLA_Sdmmc 目标文件:FSBLA_Sdmmc1_A7_Signed.bin (即 FSBL) 2. 已添加 STM32 Header 的 CUBE EXAMPLE 目标文件:MP13_BSP_BasicTemplates.stm32(即用户工程) 3 R5 d% G# w# n2 g, O$ y 烧录工程位于 STM32CubeMP13 开发包的如下目录:! U' w& j3 F' ~% I I& K1 p \Projects\STM32MP135C-DK\External_Loader,以二进制的方式提供了烧录时需要的两个引导文件,包括:# }5 z* }) K4 Q0 v7 h9 V 1.STM32PRGFW_UTIL_MP13xx_CP_Serial_Boot.stm32 2.SD_Ext_Loader.bin其中,STM32PRGFW_UTIL_MP13xx_CP_Serial_Boot.stm32 为基于开源工程。 . j; |6 ~2 g, n Openbootloader 实现的一套 IAP 应用,执行烧录流程管理。SD_Ext_Loader.bin 工程执行SDCard 设备的实际擦写操作。( P2 E8 \( U$ v" e1 P. W" i& p 1 C! K4 |# z# {! F2 K 目前,引导设备可支持 SDCard,QSPI NOR FLASH、EMMC 等,若项目开发中需要修改适配不同的存储设备,可联系 ST 窗口获取烧录工程源码。 ; I# i; ~# l, ~6 I3 e; k7 V. s 将需要烧录的两个文件拷贝到 External_Loader 目录下,与烧录工程的两个文件存放在相同位置,然后修改 tsv 文件。完成后,目录中文件列表和 tsv 文件内容如图所示。/ e9 U: [; a4 N8 q; `
▲ 图 31 烧录文件列表
▲ 图 32 tsv 文件内容 接下来,即可使用 STM32CubeProg 进行镜像烧录。可支持通过 USB 或 UART 连接,不支持通过 ST-LINK 连接。这里以 UART 连接为例: 1. 开发板跳线设置到 000 并上电 2. 连接 MicroUSB 口,查看 COM 号。注意通过串口连接时需要断开 USB OTG 3. STM32CubeProgrammer 选择连接方式为 UART,选择相应 COM 口 S$ `6 x% ]3 O- Q 4. 点击 Connect 连接
5. 点击 Open File,选择 FlashLayout_OpenBL_ExtLoaderSDMMC_SerialBoot.tsv 文件8 l ]6 w# C9 H% K( x 6. 点击 Browse,选择目标文件夹:\Projects\STM32MP135C DK\External_Loader\SD_Ext_Loader 7. 点击 Download,开始下载镜像8 m& r* j/ _1 ?! q( r+ r
' o; H& m7 o4 ?5 [; `6 Z
/ v+ j% f0 ?% [ 8. 等待烧录完成 9. 将板子断电,boot mode 切换至 SDCard 启动 10. 重新上电,即可引导启动& V9 d9 G8 }* \! ^ G. I( X4 C
3 _8 [/ y, J1 ]7 X+ l8 R 转载自:STM32 9 B. @1 M l$ J; a" {, O, M' v 4 D- O% h! h& Y0 W |
直播回顾+QA | STM32MP135在工业组态HMI和工业网关中的应用实践
STM32MP135 MP157 MP257 CoreMark移植&&跑分对比&&多核心负载不均衡问题排查与解决
有奖直播 | STM32MP135在工业组态HMI和工业网关中的应用实践
拷打cubemx【001】——艰难的选型路
linux eclipse编译后自动更新程序
eclipse编写stm32mp135配置
eclipse编写stm32mp135程序
STM32MP135F-DK 开箱测试
openSTlinux系统搭建过程分享
《STM32MPU安全启动》学习笔记之uboot如何校验kernel和如何使能校验
微信公众号
手机版