STMCU小助手
发布时间:2024-11-22 19:09
|
01 引言 STM32MP13x 系列 MPU 是 STM32 Arm®Cortex® MPU 家族中的一部分,它拥有单核Cortex®-A7 核心,支持核心频率 650MHz~1GHz,不仅能够轻松运行 Linux 操作系统,还同时提供官方 HAL 库,用于支持基于 RTOS 或无 OS 的项目方案,即裸跑应用程序。/ A8 P" }: [4 w 本应用文档将就以下几个部分简述如何在 STM32MP13 系列 MPU 上开始无 OS 项目的开发:) J/ ~2 G/ `3 }3 C, O* U; a% a% k3 w • STM32MP13x Baremetal 开发环境简介 • STM32MP13x 工程的创建 • STM32MP13x 工程的在线调试8 ]: R7 v; S2 L • 镜像烧录及从外部 Flash 启动 P, C: E) q+ ^* Z$ n6 X 02 STM32MP13x Baremetal 开发环境简介( f6 i. P( m; H& i+ W0 ]* N X! R 2.1 开发工具及环境 STM32MP13x Baremetal 开发工具主要包括: 1. 烧录工具:STM32CubeProg ( 版本大于 v2.15.0) 2. 配置工具:STM32CubeMX (版本大于 v6.10.0)) L$ m# k8 z; D _ 3. 开发调试工具:IAR(版本大于 v9.50),或 STM32CubeIDE(版本大于 v1.14), N, a" X8 ?/ W3 u3 d8 A* u5 K! P 本文示例基于 STM32CubeIDE 开发调试工具。5 C" V( b6 u9 M l4 }$ Q ' ?2 Z3 t* A* f+ p( ^) f. i [ ! C" F2 h/ [9 V8 k$ D 2.2 STM32CubeMP13 开发包 STM32CubeMP13 开发包同步发布于 ST 官网 www.st.com 和 github.com,可通过如下方式下载: 1. ST 官网下载链接3 k. n8 D2 D; m. U+ j8 N: r; K 2. Github 仓库链接 3. 通过 STM32CubeMx 软件下载% G, P t. L9 v1 n9 | 2.2.1. STM32CubeMP13 开发包总览$ @- w# N7 r% _! ] STM32CubeMP13 开发包运行在 Arm® Cortex®-A7 处理器上,由以下三部分组成: • Level 0:驱动程序,包含 HAL、LL、BSP、CMSIS • Level 1:中间件,包含 Eclipse ThreadX(原 AzureRTOS),USB Host & Device 库 • Level 2:包含各种板级示例程序 除此之外,还包括一些工具助手等。- w g8 o5 c' l
▲ 图 1 Baremetal 开发包源码框架 9 H" w* a: C0 v 2.2.2. 源码目录结构
▲ 图 2 Baremetal 开发包源码目录 7 k' j% X) ^$ S: L) Q 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 :% Z# T) o; @4 ~% Y • 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, STMIPID020 D0 c8 L; x7 F4 Z 中间件程序: • 包含一系列支持某种服务的库文件及接口文件,目前已支持:Eclipse ThreadX(原 AzureRTOS),STM32_USB_Device_Library, STM32_USB_Host_Library 6 d" g% m9 ? N) ?& c 项目工程: • Examples:基于 HAL 接口的简单示例,没有中间件功能。 • Applications:较完整的工程应用实例,包含中间件功能。 • External_Loader: 烧录镜像及从外部存储器启动的应用示例。, i5 g8 W9 R# @; |6 R: _ • Template: 板级工程应用框架。8 p) I+ S m0 c, X" l 实用工具:8 o: b" b: `; u) J2 P+ }3 l • Imageheader:用于添加 stm32 头,支持存储设备启动。& s2 x& ?3 c9 K& C! h' a • Fonts:提供了一组用于显示的标准字体,包括 font8,font12,font16,font20,font248 w+ @( Y! y+ U1 ` A- G% ~ / l' v0 w7 n, Q e 03 STM32MP13x 工程的创建 STM32MP13x 工程创建,可通过以下两种方式: 1. 使用 STM32CubeMx 配置并生成项目框架代码,并基于该框架代码开发应用。 2. 导入 STM32CubeMP13 开发包示例工程代码,并基于该示例代码开发应用。5 ^' r. ]+ w0 X4 A0 k 3.1. 从 STM32CubeMX 创建工程 STM32CubeMX 是 STM32Cube 工具家族中的一员,它采用简单易用的图形界面,可以帮助开发者快速配置硬件和软件。可支持从 MCU/MPU 选型,引脚配置,系统时钟以及外设时钟设置,到外设参数配置,中间件参数配置等,并可生成适用的 C 代码项目。 本章节简述如何通过 STM32CubeMx 生成适用于 STM32MP13x 的裸跑应用框架。使用该方式无需提前下载 STM32CubeMP13 开发包,STM32CubeMx 可自动联网下载。 1. 打开 STM32CubeMX,点击 ACCESS TO MCU SELECTOR, 2. 在搜索框中输入 STM32MP13 相应料号,如:STM32MP135FAF7,双击打开配置窗口 3. 弹框选择 MP13 Bare Metal,将生成 bare metal 工程框架。! s, ~! N; L2 ?: @
/ `- [ E+ \* d g/ Q$ I* m8 { ▲ 图 3 STM32CubeMx 选择器件
; s' t; k- ]4 @# C5 x& B ▲ 图 4 STM32CubeMx 选择工程类型8 N9 x1 q5 {. Y! ^$ ^# K3 D- }9 r & i" z* a; f) W u8 I 4. 切换到 Project Manager 标签页,输入工程名称。 5. 在此页进行项目选项配置,可保持默认。; Q5 O$ S1 s1 D* ^6 K) [3 n2 a% r' k
▲ 图 5 STM32CubeMx 工程设置页面 T( g) ?3 a4 ?3 T4 j 1 ]0 l7 W1 N" A$ I / N* V& q- C' T1 W& Y( m( S6 | 6. 回到 Pinout & Configuration 标签页。 7. 使能 RCC 和 DDR。 8. 配置各外设总线,配置方法与其他 STM32 MCU 相同(也可参考 Help -> Docs & Resources) ) i" l- n8 v9 Z. n: B 6 s; V% p! }7 i6 B" k
. p" x# Z R4 e$ ^ ▲ 图 6 STM32CubeMx 外设配置页面 ! r( C+ g% q n5 B, ] 9. 切换到 Clock Configuration 标签页。 10. 若软件报告时钟错误,可点击 Yes 自动修复。 11. 输入 CPU、DDR、总线等的工作频率,系统会自动匹配合适参数。# k* q: `( _# W
▲ 图 7 STM32CubeMx 时钟配置页面 7 R5 V" n1 M- N& N - Y n5 G& W1 m. |1 H) d/ O% i 12. 所有外设配置完成,即可点击 GENERATE CODE,开始生成工程代码。 13. 若第一次使用,软件将提示是否下载 STM32CubeMP13 开发包,可点击“yes”,软件自动联网下载前述 STM32CubeMP13 开发包。1 z$ [7 W; ^) v# U- n# S' Z4 a8 u 14. 生成完成后,可直接点击 Open Project,将打开 STM32CubeIDE 工程。% b2 Z; x2 L# q7 J P
6 D1 H0 i2 C$ v( S& P$ Q ▲ 图 8 STM32CubeMx 代码生成页面( I0 {- Y# E9 t
▲ 图 9 STM32CubeMx 完成代码生成页面
▲ 图 10 STM32CubeMx 生成工程代码示例( y) y4 b7 X: B( [ 15. 至此,工程框架已生成,可通过 STM32CubeIDE 进行用户代码的编辑、编译、调试。 8 a5 V- R( V9 `( d' D' r+ x, J 3.2. 从 STM32CubeMP13 开发包导入工程 若已事先通过 ST 官方网站或 Github 下载了 STM32CubeMP13 软件开发包,也可导入开发包中的工程示例代码,从示例代码开始进行项目开发。' Z) ~6 V6 e7 {6 [/ A$ U" ^( o 这里以 FSBLA_Sdmmc1 工程为例。 项目路径:\Projects\STM32MP135C-DK\Applications\FSBLA\FSBLA_Sdmmc1 1. 打开 STM32CubeIDE,导入 project 2. 点击 Files -> Import…
▲ 图 11 STM32CubeIDE 右键项目菜单 % H6 ~- q# A( @) m* s 3. 选择 Existing Projects into Workspace 4. 点击 Next>4 o% h7 s7 c, W6 N' v& j1 H8 N
8 O5 ]( y( }# y) e' M) Y) c ▲ 图 12 STM32CubeIDE 导入已存在项目 / n# w8 H+ L* C% c& |" V% ` 5.点击 Browse…,找到目录 \Projects\STM32MP135C-DK\Applications\FSBLA% }( g/ {* T+ b. V7 k7 b 6. 选中 FSBLA_Sdmmc1_A7 工程 7. 点击 Finish,导入 Project
▲ 图 13 STM32CubeIDE 选择导入项目 : {/ n# d: ^( U& _6 ` 8. 工程导入完成。 8 ~- o7 T/ E' i8 B+ X" ~7 r 04 STM32MP13x 工程的在线调试 工程创建完成后,接下来本章节将介绍如何基于 STM32CubeIDE 进行工程编译及在线调试。 , J2 K" K/ ?7 r7 L) X: ?- E STM32MP135 内部包含 128KByte SYSRAM,若代码小于 128KByte,可直接运行于内部SYSRAM 中,适用于验证一些简单的外设实例。若代码大于 128KByte,则需要将程序运行于DDR 中。下面将分别阐述。& m; L3 x/ d! N7 p+ B" I( w+ f( e 4.1. 在 SYSRAM 中调试程序 仍以前述导入的 FSBLA_Sdmmc1_A7 工程为例。, W2 K- b- T! D1 J6 D* | 1. 首先,将开发板切换到工程模式+ ]5 j7 A0 ]( X% V3 P 2. 连接 Type-C 电源3. 连接 MicroUSB,这里板载已支持 ST-Link2 n. Z; |+ n9 p7 a2 h8 Z& m1 M
+ \% v( ]8 ]) d" n9 D' d ▲ 图 14 开发板切换工程模式 " P# A# ^. O* |! N" O) O) r/ c- [ 4. 右键项目工程名称,选择 Build Project,完成编译。# P, w% Q$ u. N* k; J' b
▲ 图 15 选择编译工程 8 c; c- w2 e; d* x 5. 右键工程名称,选择 Debug As -> STM32 C/C++ Application
! g1 [3 l& A6 o3 Q4 p ▲ 图 16 选择调试项目方法 1 6. 或点击 Debug 图标 7. 进入 Debug Configurations….; @1 v, b2 U, |; Y# N L
8 ?$ R& @6 A- v1 b: a7 N$ b ▲图 17 选择调试项目方法 25 y) U! g! p3 U) _) S' a + M t1 l2 V8 ]* @2 w 1 O0 ~! Z* i7 ~1 l 8. 进入调试配置菜单
& v' x" O0 n" z. \ ▲图 18 调试配置页面+ Y2 G" F4 `+ m+ t' `4 v 8 n3 D' J# b S( A/ O " J J1 U. k F$ }8 d3 o/ A
c+ | Y6 v8 I. {# K% Q- C 9. 即可像 MCU 一样调试您的代码。
! s+ c$ K' B9 f+ O4 _" p ▲图 19 项目调试窗口 4.2. 在 DDR 中调试程序 当代码量超过 SYSRAM(128KB)的大小时,需要将程序运行在 DDR。这里以 BSP_BasicTemplates 工程为例展示如何开发运行于 DDR 的用户程序、5 S/ y8 n l* u) L, [2 H% H* O . x+ ?+ F# _% G5 I2 G$ o! g0 E2 R 1. 首先,按照前述方法导入项目工程% m/ v5 X- w: w# _* Y* C% r* N/ X
▲图 20 导入 Templates 工程 " }- @( q3 q$ R6 s7 W 2. 打开 C/C++ Build 配置# p" r5 `! `1 s 3. 在 Preprocessor 中添加 USE_DDR 宏定义
▲图 21 使能 DDR 宏 / f1 p* D! d; o, ~4 B1 ^& I- l$ H 4. 修改链接文件,重命名为 “stm32mp13xx_a7_ddr.ld”8 t9 K2 p9 Q1 s" J9 K% { 5. 修改 REGION_ALIAS 定义到 DDR 区域:6 b3 K$ P" I( N& C- z1 p 6. 重新编译后,目标文件将链接到 DDR3 T& A/ k( X9 t' ?4 a
0 x9 n/ s( V* r% R+ ] ▲图 22 修改链接空间
7 y6 V+ H+ W, A ▲图 23 选择链接文件 7. 在调试之前需要先运行 DDR_Init 对 DDR 进行初始化$ \* M' ^2 G U2 d9 c. L 8. 按照前述方法导入 DDR_Init 工程,编译后全速运行一次,并保持开发板不掉电项目路径:\STM32MP135C-DK\Examples\DDR\DDR_Init
& s9 b9 o2 u/ U. L) U$ m5 F; P5 \ ▲ 图 24 运行 DDR 初始化 - j/ ~# o9 m. u' w+ f+ Z4 U4 q6 J : O4 L( G6 K h) O. V 9. 回到 BSP_BasicTemplates 工程。 10. 在 Debug configuration 对话框中,将 Startup 页面的 monitor reset 删除。
Y2 I7 @! w( K; x+ u ▲ 图 25 修改调试参数) \9 H' Q& f6 r- L* w. p( p2 s 7 [$ r6 W; x. A4 w) J1 F 11. 点击 Debug 进入调试 12. 可以看到当前 main 函数的地址已经为 0xC000 开头的 DDR 位置) J1 y, W$ r5 L) E. Y" G
▲ 图 26 在 DDR 中调试工程+ w' B- @$ C1 W: } 05 从外部 Flash 启动
▲ 图 27 STM32MP13 启动流程 % ^& _$ g9 |" |0 ^8 @+ e 从外部 flash 引导 STM32MP13, 一般需要包含两个部分源码。如上图所示,芯片上电后,首先运行内部固化的一段 ROM CODE,ROM CODE 从用户配置的启动器件中寻找 FSBLA,并将其拷贝至 SYSRAM 中,FSBLA 运行后,执行 DDR 初始化及用户代码(CUBE EXAMPLE)拷贝到 DDR 中,最终实现跳转到 DDR 中运行用户程序的目的。 0 W8 }* f' t1 X( P& C8 Z 这里以 SDCard 启动为例,在第三章节中,我们编译调试的 FSBLA_Sdmmc1_A7 工程,即实现了 FSBLA 部分的功能,BSP_BasicTemplates 工程为实际开发的用户项目。完成启动需要将这两个工程生成的镜像文件都烧录到 SDCard 中。 • FSBLA 需烧录到 SDCard 的固定位置 LBA128 或 LBA640,ROM CODE 固定从这两个位置寻找 FSBLA。 • CUBE EXAMPLE 的存放位置可在 FSBLA 程序中修改,默认为 SDCard 的 LBA640。 • 如果有烧录过 OpenSTLinux 的卡,需先格式化。原因是 ROM Code 优先从 GPT 分区表中寻找 FSBLA,若分区表存在,新烧录到 LBA128 位置的 FSBLA 将会被忽略。; {$ f- I0 X; A" f0 h" A
▲ 图 28 镜像在 SDCard 中的 Layout$ k9 u7 J9 B& X* @/ R% Y - _; B" k4 [) z. m9 \* _ 需要注意的是,FSBLA 和 CUBE EXAMPLE 都需要加入 STM32 Header,才能被系统识别。STM32 Header 是 ROM CODE 加载二进制文件的必要格式,每一个被 ROM CODE 加载的二进制文件都需要在头部添加特定的 STM32 Header。STM32CubeMP13 开发包中提供了ImageHeader 工具,用于为项目二进制文件添加 STM32 Header。开发者不需要深究 STM32Header 的详细内容。& I i3 H1 [ I" ?7 @
▲ 图 29 STM32 Header 信息 为用户程序加入 STM32 Header,可在工程配置的 post-build steps 中加入如下命令:5 x- e9 L' E ]2 G2 l “(path_to_STM32CubeMP132 o4 c! w3 f6 P- m2 B5 n; k6 { Package)/Utilities/ImageHeader/postbuild_STM32MP13.sh" "${gnu_tools_for_stm32_compiler_path}" "${BuildArtifactFileBaseName}" 7 I+ @+ K' `2 O& N5 s* q- H0 Q N 6 m* `! ?' p8 s: U" ] 重新编译完成后,即可生成打上 STM32 Header 的目标文件。
▲ 图 30 添加 Post-build 命令# l: Y; f Y4 D1 u7 A: b+ Q$ x2 q) B $ [, r2 W/ c! p/ X1 X" v( j 注:path_to_STM32CubeMP13 Package 为 STM32CubeMP13 开发包的存放路径。5 M4 O6 D" k" H! w* i! h 至此,已准备好待烧入 SDCard 的目标文件: 1. 已添加 STM32 Header 的 FSBLA_Sdmmc 目标文件:FSBLA_Sdmmc1_A7_Signed.bin (即 FSBL)! m% m) i: U- h2 Y$ ] 2. 已添加 STM32 Header 的 CUBE EXAMPLE 目标文件:MP13_BSP_BasicTemplates.stm32(即用户工程) 烧录工程位于 STM32CubeMP13 开发包的如下目录: \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 为基于开源工程。- J# R0 I l' | & [" n) D, ] P) d Openbootloader 实现的一套 IAP 应用,执行烧录流程管理。SD_Ext_Loader.bin 工程执行SDCard 设备的实际擦写操作。3 G B* c' b, S' T7 s 目前,引导设备可支持 SDCard,QSPI NOR FLASH、EMMC 等,若项目开发中需要修改适配不同的存储设备,可联系 ST 窗口获取烧录工程源码。* f0 s6 a3 e! b' F5 q 将需要烧录的两个文件拷贝到 External_Loader 目录下,与烧录工程的两个文件存放在相同位置,然后修改 tsv 文件。完成后,目录中文件列表和 tsv 文件内容如图所示。) I0 x$ i7 D" {. D) E& o1 T+ ]! T, ~
▲ 图 31 烧录文件列表
▲ 图 32 tsv 文件内容& u. p# ^$ c# J( D: [ O. b( C : f7 [' E& n2 `+ ? 接下来,即可使用 STM32CubeProg 进行镜像烧录。可支持通过 USB 或 UART 连接,不支持通过 ST-LINK 连接。这里以 UART 连接为例: 1. 开发板跳线设置到 000 并上电 2. 连接 MicroUSB 口,查看 COM 号。注意通过串口连接时需要断开 USB OTG. q+ V2 l3 j% L) i- J" ]; J* u6 c 3. STM32CubeProgrammer 选择连接方式为 UART,选择相应 COM 口. p9 d% \# v- e 4. 点击 Connect 连接
5. 点击 Open File,选择 FlashLayout_OpenBL_ExtLoaderSDMMC_SerialBoot.tsv 文件+ r) ?* T( l# k9 v9 W 6. 点击 Browse,选择目标文件夹:\Projects\STM32MP135C DK\External_Loader\SD_Ext_Loader( B3 Q/ \- ^1 @3 G, w 7. 点击 Download,开始下载镜像8 C; ?7 L9 V. r X7 z
8. 等待烧录完成! j7 S7 Z7 E' J" p 9. 将板子断电,boot mode 切换至 SDCard 启动 10. 重新上电,即可引导启动
4 W' [+ F! e. V" c 转载自:STM32 7 P+ F1 Q) B* H2 `$ c+ ] ) f; Y: E8 n+ O6 X+ U0 a& L |
直播回顾+QA | STM32MP135在工业组态HMI和工业网关中的应用实践
STM32MP135 MP157 MP257 CoreMark移植&&跑分对比&&多核心负载不均衡问题排查与解决
有奖直播 | STM32MP135在工业组态HMI和工业网关中的应用实践
拷打cubemx【001】——艰难的选型路
linux eclipse编译后自动更新程序
eclipse编写stm32mp135配置
eclipse编写stm32mp135程序
STM32MP135F-DK 开箱测试
openSTlinux系统搭建过程分享
《STM32MPU安全启动》学习笔记之uboot如何校验kernel和如何使能校验
微信公众号
手机版