
STM32CubeMX简介8 T7 ] c( F3 ~$ P2 p STM32CubeMX是由ST公司开发的图形化代码自动生成工具,能够快速生成初始化代码,如GPIO、时钟树、中间件等,使用户专注于业务代码的开发。现在ST主推HAL库,经典的标准外设库已经停止维护了,新产品也只提供HAL库的代码,因此,我们学习HAL库是更加有优势的,由于HAL库具有低耦合、通用、抽象了硬件层,使得开发者无需太过关注硬件驱动的实现,使得开发更加的简单快速,更容易维护,因此被越来越多的产品所使用。 10.1 STM32CubeMX的作用7 S- Z Z+ P2 Y2 G" r! \ STM32CubeMX具有如下特性: ①直观的选择MCU型号,可指定系列、封装、外设数量等条件 ②微控制器图形化配置 ③自动处理引脚冲突 ④动态设置时钟树,生成系统时钟配置代码& Z" i0 U: q( i: o! l ⑤可以动态设置外围和中间件模式和初始化6 V3 v1 C) `2 p ⑥功耗预测' ]5 P2 O( d; z, ~7 o) \+ }8 e+ ^ ⑦C代码工程生成器覆盖了STM32微控制器初始化编译软件,如IAR,KEIL,GCC ⑧可以独立使用或者作为Eclipse插件使用& V* l% D8 _7 w3 G; Q ⑨可作为ST的固件包、芯片手册等的下载引擎' K% ]+ F! d- j2 W" d" d 这里特别说明一下STM32CubeMX和STM32Cube固件库的关系,STM32CubeMX图形工具配置生成的代码,是基于STM32Cube固件库的,并且可以在图形工具中直接下载STM32Cube固件库。也就是说,我们使用STM32CubeMX配置出来的初始化代码,兼容STM32Cube库,例如硬件抽象层代码就是使用的STM32的HAL库。不同系列的STM32芯片,会有不同系列的STM32Cube库,而STM32CubeMX图形工具只有一个,所以开发不同的STM32系列芯片,选择不同系列的STM32Cube库即可,它们的关系如下图所示: ( P+ A6 ~8 i t6 w ![]() * E2 t: H$ I$ A' ~ 图10.1.1 STM32CubeMX和STM32Cube固件库的关系: O. \: Y" N$ S3 C9 j3 _ 当然,自动生成的驱动代码我们不去仔细专研其原理的话,对学习的提升很有限,而且在出现BUG的时候难以快速定位解决,因此我们也要了解其背后的原理。( L) Y& q" q Y1 N7 |5 \2 \ 10.2 安装STM32CubeMX9 |: |& j: S7 F9 y2 o! M STM32CubeMX运行环境搭建包含两个部分,首先安装Java环境,再安装STM32CubeMX。- T r+ O& e2 F 10.2.1 安装JAVA环境 安装Java运行环境,大家可以到Java官网www.java.com下载最新的Java软件,也可以直接从光盘资料获取安装包,目录如下:A盘6,软件资料1,软件3、STM32CubeMXJava安装包,Java安装包文件下有x64和x86两个文件夹,分别是64位和32位的电脑的安装包,大家根据自己电脑的位数选择即可。比如64位电脑选择x64文件夹的jre-8u301-windows-x64.exe安装包,并根据提示安装即可。安装完成之后提示界面如下图10.2.1.1所示。! T5 Z3 n! C3 ]2 r ![]() 图10.2.1.1 Java安装成功提示界面 安装完Java运行环境之后,为了检测是否正常安装,我们可以打开Windows的命令输入框,输入:java –version命令,如果显示Java版本信息,则安装成功。提示信息如下图10.2.1.2:; ]: N( }! b; x6 ]6 j R 2 n6 p9 x" a y ![]() / g9 ]" @( Z% M+ i7 U n 图10.2.1.2 查看Java版本- p* u7 ~2 Q0 j; C 10.2.2 安装STM32CubeMX, S0 O/ Z( [8 n( `% i0 C 在安装了Java运行环境之后,接下来我们安装STM32CubeMX图形化工具。该软件可以直接从光盘资料获取,目录如下:A盘6,软件资料1,软件3、STM32CubeMX,也可以直接从ST官方下载,下载网址为:https://www.st.com/en/development-tools/stm32cubemx.html。# K0 k* Y, Q# @9 R0 l, ~& y% ? 接下来我们直接双击SetupSTM32CubeMX-6.3.0.exe,安装步骤如下。 ![]() / V. A; V8 |' c: x$ b c6 w 图10.2.2.1 启动安装0 H, t7 H# \0 D: R4 a. } , A+ O$ {9 l1 q# o; S/ D" ~ ![]() , H8 l; Z& l$ R6 T) t5 g 图10.2.2.2 接受本许可协议 ![]() 图10.2.2.3 勾选第一项即可% C. c8 L! w6 r" o* N9 _ ![]() 6 N' Y% D2 Z' } 图10.2.2.4 指定安装路径( n) B! ^/ `: P0 } S% z ![]() 图10.2.2.5 创建快捷方式 * a" u- g& R" r9 n* ~! F$ n1 L ![]() ' A3 s& v9 E) @3 ^- e8 C( Y- D 图10.2.2.6 安装进度提示# O: K" X5 l2 M6 L. |. J, m I$ `/ m2 q% k8 |" M) a ![]() 图10.2.2.7 完成安装 9 Z5 `0 N7 I+ T2 B. K1 ]3 J. k 10.3 使用STM32CubeMX新建工程( g, M" z4 }: I 大多数情况下,我们都只使用STM32CubeMX来生成工程的时钟系统初始化代码以及外设的初始化代码,因为用户控制逻辑代码是无法在STM32CubeMX中完成的,需要用户自己根据需求来实现。+ \5 Y* H( Q/ F) [) p6 [ 10.3.1 打开STM32CubeMX 双击桌面STM32CubeMX快捷方式图标,如图10.3.1.1所示。 ![]() 图10.3.1.1 CubeMX快捷方式 打开后CubeMX主界面如图10.3.1.2所示。! s% ]' w- e4 i Q ![]() . V. k P: s; v, X* a 图10.3.1.2 CubeMX主界面7 `( o: y% X4 N& G 2 _8 h' h H9 B( K 10.3.2 下载和关联的STM32Cube固件包 我们知道STM32CubeMX图形工具只有一种, STM32Cube固件包却有多种,需要选择我们工程对应的固件包。 为了方便,新建工程前,我们先来下载和关联STM32Cube固件包,点击Help->Manage embedded software packages,如图10.3.2.1所示。# J% j8 a! H5 T( `& K0 q' ^) W 0 H/ T! a5 i2 t3 u c8 u ![]() % {7 H2 \5 p- K 图10.3.2.1 管理固件包 然后弹出管理界面,在该窗口找到STM32H7列表选项,勾选1.6.0版本。这里选择1.6.0版本是因为我们的光盘的固件包是这个版本的。关联STM32Cube固件包有两个方法,如图10.3.2.2所示. ![]() 0 z6 g" q9 g! v& O8 X6 k- \. k 图10.3.2.2 下载和关联STM32Cube固件包- c0 ]" \/ q/ k7 p: C7 r# E, S 方法二:下载好之后,会自动关联,所以不需要多讲什么。7 Z7 X- F ]0 y, N. k+ n 方法一:点击后,弹出下面的窗口,然后选择光盘中的对应的固件包,注意这里是压缩包的形式,如图10.3.2.3所示。, K" k: c5 ^4 T }4 ~ ![]() 图10.3.2.3 关联本地STM32Cube固件包 ![]() ' S8 F( T' Z1 \5 Q8 a/ s& z 图10.3.2.4 等待关联/ O) e6 p# c1 \4 _/ R * p1 K' `& y$ }' `+ a. |: [ ![]() 5 k- L0 e, ^/ f9 Y 图10.3.2.5 关联成功$ M; o% s+ b' ~4 r2 D0 i* r 关联好固件包我们就可以开始新建工程了。' } c- _. Y- ~$ C( f 10.3.3 新建工程 使用STM32CubeMX配置工程的一般步骤为: 1,工程初步建立+ [ |8 k, h" G 2,HSE和LSE时钟源设置 3,时钟系统(时钟树)配置 4,GPIO功能引脚配置 5,Cortex-M7内核基本配置(限定项) 6,生成工程源码, ?- j( |; `3 I9 G O' C 7,用户程序6 H7 q* F3 V9 f8 P } 接下来将按照这7个步骤,依次教大家使用STM32CubeMX工具生成一个完整的工程。 1 工程初步建立 方法一:依次点击“File”,“New Project”即可建新工程。如果之前打开过的话,左侧最近打开的过程一列会有打开的工程列表,直接点击这些工程也可以打开。# `" {$ s5 S, Y9 _ 方法二:直接点击ACCESS TO MCU SELECTOR。0 F4 a& w! L+ D3 q( D 具体操作如图10.3.3.1所示。 ![]() : P j% j4 ]8 b0 @ 图10.3.3.1 新建工程( v% a2 e, s3 s# B! g, q+ u* p% \ 点击新建工程后,第一次可能会联网下载一些的文件,可能等待时间比较长,可以直接选择取消即可。 % l' N6 K3 `/ k9 i ![]() + T, w! w+ V# I3 F9 g& H' P: V/ w 图10.3.3.2 启动时联网更新检测! \- F9 N5 R8 U; p- E 之后都可以进入芯片选型界面,如图10.3.3.3所示。. t" f0 \! P# X. ]8 O* t ![]() 图10.3.3.3 芯片选型界面+ o. j/ v, I( e$ @ 选择具体的芯片型号,如图10.3.3.4所示。 1 N; A: b3 q& [0 i/ T7 E8 r ![]() 图10.3.3.4 选择具体的芯片型号 选择了芯片型号后,弹出主设计界面,如图10.3.3.5所示。' [# F( \5 D, y4 `7 [8 F 8 @' o% C6 c- ^/ L3 d9 d, t9 G C ![]() 4 K+ z( l/ h# e 图10.3.3.5 主设计界面 2 HSE和LSE时钟源设置 进入工程主设计界面后,首先设置时钟源HSE和LSE。如图10.3.3.6所示。3 g f5 m$ q w {( h. w/ q ![]() : E- [) b$ n* ]- J1 Y. [ 图10.3.3.6 设置时钟源HSE和LSE# i+ B3 e! o% |) z 图10.3.3.6中的标号3和4,我们都选择了Crystal/Ceramic Resonator,表示外部晶振作为它们的时钟源。我们开发板的外部高速晶振和外部低速晶振分别是:8MHZ和32.768KHZ。所以HSE时钟频率就是8MHZ,LSE时钟频率就是32.768KHZ。8 E. D( S: Q1 O' Z# V6 U+ e 选项Master Clock Output 1 用来选择是否使能MCO1引脚时钟输出,选项Master Clock Output 2用来选择是否使能MCO2引脚时钟输出,最后一个选项Audio Clock Input(I2S_CKIN)用来选择是否从I2S_CKIN(PC9)输入I2S时钟。这里大家要注意,因为选项Master Clock Output 2和选项Audio Clock Input(I2S_CKIN)都是使用的PC9引脚,所以如果我们使能了其中一个,那么另一个选项会自动显示为红色,也就是不允许配置,这就是STM32CubeMX的自动冲突检测功能。 3 时钟系统(时钟树)配置 点击Clock Configuration选项卡即可进入时钟系统配置栏,如下图10.3.3.7所示:0 X* K( m& |8 B ![]() + W+ R$ }! L0 \ e2 E9 [, ?6 k 图10.3.3.7 时钟系统配置栏' e$ p' N: X3 o% u5 T1 s3 F 进入Clock Configuration配置栏之后可以看到,界面展现一个完整的STM32H7时钟系统框图。从这个时钟树配置图可以看出,配置的主要是外部晶振大小,分频系数,倍频系数以及选择器。在我们配置的工程中,时钟值会动态更新,如果某个时钟值在配置过程中超过允许值,那么相应的选项框会红色提示。 这里,我们将配置一个以HSE为时钟源,配置PLL1相关参数,然后系统时钟选择PLLCLK为时钟源,最终配置系统时钟为480MHz的过程。同时,还配置了AHB,APB1,APB2、APB3、APB4和Systick的相关分频系数。由于图片比较大,我们把主要的配置部分分两部分来讲解,第一部分是配置系统时钟,第二部分是配置SYSTICK、AHB、APB1、APB2、APB3和APB4的分频系数。首先我们来看看第一部分配置如下图10.3.3.8所示:% O) D0 c" x: B ' V& n% g) h; y: i C ![]() + n+ F& C0 ]* G! Q2 f' X 图10.3.3.8 系统时钟配置图 我们把系统时钟配置分为七个步骤,分别用标号1~7表示,详细过程为: 1、时钟源参数设置:我们选择HSE为时钟源,所以我们要根据硬件实际的高速晶振频率(这里我们是8MHZ)填写。 2、时钟源选择:我们配置选择器选择HSE即可。; S( `* v+ T1 d* X 3、PLL1分频系数M配置。分频系数M我们设置为2。- f4 ^- k- u- `: A9 e: T- @ 4、PLL1倍频系数N配置。倍频系数N我们设置为240。( K5 V* Q2 Q$ x- V$ r- c9 {5 \ 5、PLL1分频系数P配置。分频系数P我们配置为2。 6、系统时钟时钟源选择:PLL,HSI还是HSE。我们选择PLL,选择器选择PLLCLK即可。 7、经过上面配置以后此时SYSCLK=480Mhz。 经过上面的7个步骤,就会生成标准的480MHz系统时钟。接下来我们只需要配置AHB、APB1、APB2、APB3、APB4和Systick的分频系数,就可以实现sys.c文件中的sys_stm32_clock_init函数配置的部分时钟系统。配置如下图10.3.3.9所示:& A) \# |( o1 ~# T$ e ( l) A$ z( {& @- W& [ ![]() 图10.3.3.9 AHB、APB1、APB2、APB3和APB4总线时钟配置/ o v0 e! P& R+ B$ `. a AHB、APB1、APB2、APB3和APB4总线时钟以及Systick时钟的最终来源都是系统时钟SYSCLK。其中AHB总线时钟HCLK是由SYSCLK经过AHB预分频器之后的来,如果我们要设置HCLK为240MHz(最大也就240Mhz),那么我们只需要配置图中标号8的地方为2即可。得到HCLK之后,接下来我们将在图标号9~12处同样的方法依次配置APB3、APB1、APB2和APB4分频系数分别为2,2、2和2即可。注意!systick固定为480MHz,配置完成之后,那么HCLK=240MHZ,Systic=480MHz,PCLK1=120MHz,PCLK2=120MHz,PCLK3=120Mhz,PCLK4=120MHz,这和我们使用sys_stm32_clock_init函数配置的时钟是一样的。+ f) N! j+ W3 `+ L8 `/ A 4 GPIO功能引脚配置 本小节,我们讲解怎么使用STM32CubeMX工具配置STM32H7的GPIO口。MiniPRO STM32H750开发板的PB4、PE5和PE6引脚连接一个RGB灯,我们来学习配置这三个IO口的相关参数。这里我们回到STM32CubeMX的Pinout&Configuration选项,在搜索栏输入PB4后回车,可以在引脚图中显示位置,如下图10.3.3.10所示:' E9 ?. H9 S2 u* ]# F5 y7 E ![]() , n1 V1 ?9 T/ m- w 图10.3.3.10 搜索引脚位置: c9 ^% ~ s F5 C* G/ A# c9 Y 接下来,我们在图10.3.3.11引脚图中点击PB4,在弹出的下拉菜单中,选择IO口的功能为GPIO_Output。操作方法如下图10.3.3.11所示:* N, I4 ]: U+ N. u. s/ ^ / ?5 B1 q% i/ c6 L ![]() 图10.3.3.11 配置GPIO模式 同样的方法,我们配置PE5和PE6选择功能为GPIO_Oput即可。设置好即可看到引脚从灰色变成绿色,标识该管脚已经启用。这里我们需要说明一下,如果我们要配置IO口为外部中断引脚或者其他复用功能,我们选择相应的选项即可。配置完IO口功能之后,还要配置IO口的速度,上下拉等参数。这些参数我们通过System Core下的GPIO选项进行配置,如图10.3.3.12所示。 & w8 v$ w P* Z ![]() 图10.3.3.12 GPIO选项 我们先配置PB4,PE5和PE6配置方法一样的。点击图10.3.3.12的2号框里面的PB4,配置如图10.3.3.13所示。 ![]() 图10.3.3.13 配置GPIO口详细参数' Q2 o, K7 X$ W- `& v GPIO output level是IO的初始值,为了开始让RGB灯熄灭,我们设置初始值输出高电平。 GPIO mode默认是推挽输出,不需要更改。5 C+ J9 j9 Z8 L, ?; O GPIO Pull-up/Pull-down默认是不上下拉,我们改为上拉。; `9 o( t! |7 r7 D% w, s* h# N* x Maximum output speed输出速度配置,默认是低速,我们设置为中速(可以不改)。 User Label用户符号,我们可以给PB4起一个别的名字。& H- C, A7 h6 u& y+ h PE5和PE6也是按照这样的方法配置即可。 5 Cortex-M7内核基本配置2 n' t9 k: h' q6 K& D" j$ |- |3 l. Q 这里我们主要配置Cortex-M7内核相关的参数。我们依次点击Cortex_M7 进入配置界面,操作过程如下图10.3.3.14所示:- A- a8 n8 V" [ ! V% u5 A. o: {) k ![]() 图10.3.3.14 Cotex_M7配置 该界面一共有两个配置栏目。第一个配置栏目Cortex Interface Settings下面有两个配置项: ' r9 f" b0 B8 t' X 1.CPU ICache:使能I-Cache。8 N+ r) |+ V0 X) \0 L# @9 q# L 2.CPU DCache::使能D-Cache。 上面这2个参数是CM7内核相关配置。第二个配置栏目Cortex Memory Protection Unit,是用来配置内存保护单元MPU,在我们后面的实验会讲解MPU配置。 6 生成工程源码8 ^6 X) C3 z6 I, J7 \ 接下来我们学习怎么设置生成一个工程,Project Manager-> Project选项用来配置工程的选项,我们了解一下里面的信息。 Project Name:工程名称,填入工程名称(半角,不能有中文字符)" G2 K9 j3 r9 \& n. Y Project Location:工程保存路径,点击Browse选择保存的位置(半角,不能有中文字符)4 r1 j3 s1 C+ f0 W4 R( h/ c: L# N Toolchain Folder Location:工具链文件夹位置,默认即可。 Application Structure:应用的结构,选择Basic(基础),不勾选Do not generate the main(),因为我们要其生成main函数。+ W! G4 A8 K! H. o) r: t% Q" R7 K Toolchain/IDE:工具链/集成开发环境,我们使用Keil,因此选择MDK-ARM,Min Version选择V5.27(最新)。2 [' ~8 ^: j: X. L) w% h/ ~9 y& L Linker Settings 链接器设置: Minimum Heap Size 最小堆大小,默认(大工程需按需调整)。9 Z9 j7 s% t. x0 C- x Minimum Stack Size 最小栈大小,默认(大工程需按需调整)。2 A; A/ a( f; q. d. [0 K* Z4 U MCU and Firmware Package是 MCU及固件包设置: MCU Reference:目标MCU系列名称。 Firmware Package Name and Version :固件包名称及版本。7 h! p$ U, A2 Q: F7 b1 V' b( x/ _ 勾选Use Default Firmware Location,文本框里面的路径就是固件包的存储地址,我们使用默认地址即可。(这里因为我有两个版本的固件包,所以它默认使用最新的,这个关系不大,就用新的)。 最后工程配置,如图10.3.3.15所示。3 M; \/ s! ~- {& ~ P ![]() 图10.3.3.15 工程配置 打开Project Manager-> Code Generator选项,Generated files 生成文件选项,勾选Generate peripheral initialization as a pair of ‘.c/.h’files per peripheral,勾选这个选项的话将会将每个外设单独分开成一组.c、.h文件,使得代码结构更加的清晰,如图10.3.3.16所示。 - O! L5 m. P; `: K5 M! P& v ![]() % {. {8 k9 ^3 g; I8 Z! I1 ~ 图10.3.3.16 代码生成器设置. n; F5 _; _8 @1 F- S$ O$ ^2 j$ g2 ], N 至此工程最基础配置就已经完成,点击蓝色按钮(SENERATE CODE)就可以生成工程。 : h$ k* K2 T+ G+ I) D ![]() 0 f$ c4 i1 n P {3 Z8 P V2 F 图10.3.3.17生成工程( B4 [/ k" o* t 在弹出来的窗口中点击Open Project就打开MDK工程。 ![]() 图10.3.3.18 打开工程 完整的STM32H7工程就已经生成完成。生成后的工程目录结构如下图10.3.3.19所示: ![]() : ]' \7 I1 M1 F9 L; E- T 图10.3.3.19 STM32CubeMX生成的工程目录结构 Drivers文件夹存放的是HAL库文件和CMSIS相关文件。8 p# U) h) s0 J/ j! q4 W/ l Inc文件夹存放的是工程必须的部分头文件。 MDK-ARM下面存放的是MDK工程文件。, \3 K* }7 f! x9 g3 z# }& b Src文件夹下面存放的是工程必须的部分源文件。 Template.ioc是STM32CubeMX工程文件,双击该文件就会在STM32CubeMX中打开。 7 用户程序 在编写用户程序之前,首先我们打开生成的工程模板进行编译,发现没有任何错误和警告。* k4 F1 ~0 X; i- s( e# g5 S 接下来我们看看生成的工程模板的main函数,这里我们删掉了源码注释,关键源码如下:' b/ K" F2 @, X * t5 E- L+ H1 C: f. F7 R! T
大家需要注意,STM32CubeMX生成的main.c文件中,有很多地方有“/* USER CODE BEGIN X /”和“/ USER CODE END X */”格式的注释,我们在这些注释的BEGIN和END之间编写代码,那么重新生成工程之后,这些代码会保留而不会被覆盖。9 o; m) C, y' I) F# i$ [ 我们编写一个跑马灯的用户程序,程序具体如下:
编写好程序后,编译没有任何警告和错误。可以直接下载程序MiniPRO STM32H750开发板中(使用DAP下载,请注意配置MDK),算法只需要128K的算法就可以了。# p) ^' ~( K: n7 i4 g; G 本小节使用STM32CubeMX新建的工程模板在我们光盘目录:“4,程序源码\标准例程-库函数版本\实验0-4 Template工程模板-使用STM32CubeMX配置 ”中有存放,大家在编写用户代码过程中可以参考该工程的main.c文件。, z* M8 M: s M) Z 10.4 STM32CubeMX新建工程使用建议8 C- G6 h1 O2 C4 x8 M ① 使用CubeMX的环境搭建工程,工程文件夹路径、文件名不要带任何中文及中文字符,否则会遇到各种报错;* ^6 o% }/ ? j% i ② 本书以新建工程-HAL库版本为基准来展开,不对CubeMX的使用过多讲解。使用CubeMX可以帮助我们快速搭建工程,使用户专注于应用开发,但STM32的开发与硬件密切相关,对STM32开发来说,抛开底层只专注做应用并不实际,毕竟无法使用一套通用设计来满足不同用户的需求; ③ 关于新建CubeMX的工程路径中有中文的情况的解决: o/ y0 ^6 T$ r6 C 如果我们配置的CubeMX工程路径里面有中文可能会报以下的错误: 1 y% u- [$ A$ J" P1 L6 b& y ![]() 图10.4.1 直接编译报错( X, _$ e; f- }8 o1 l 造成错误的原因是CubeMX对中文的支持不友好,且生成的MDK工程默认通过工程中的CMSIS那个绿色的控件选择启动文件而不是直接添加启动文件(startup_xxx.s)到我们的工程中,而有中文路径时就会找不到,有两个解决办法:) k q- z' Y: }' ?- z5 j. F 1、用CubeMX生成的工程不要放置在包含中文路径的文件夹下; 2、添加启动文件到我们的工程中,我们新建一个Application/MDK-ARM分组,把startup_stm32h750xx.s添加到这个分组,如图10.4.2所示:3 n# E8 v9 e0 A3 P+ R ![]() / F, Y& l# O: Q0 o- N8 t4 ` 图10.4.2 STM32CubeMX生成的工程目录结构 ④ 关于配置的文件CubeMX工程(.ioc后缀)名字有中文的情况,我们建议重新新建工程或者把生成的工程文件重命名为英文。因为带中文的CubeMX工程生成的MDK的Output目录有中文,MDK也会报错,尽管可以重新设置MDK工程的Output目录和添加③所描述步骤的启动文件,使本次编译通过,但下次重新用CubeMX生成工程时,仍旧需要重复修改配置。! E* j* E p( k! Q6 B9 v- V ———————————————— 版权声明:正点原子, _6 N! z/ V. _6 x. m* z |
【2025·STM32峰会】GUI解决方案实训分享4-使用MVP架构从硬件外设读取数据并显示到图形界面、从图形界面发送指令控制硬件外设
【2025·STM32峰会】GUI解决方案实训分享3-搭建空白TouchGFX例程并实现简单的功能(含硬件部分的串口打印)
【2025·STM32峰会】GUI解决方案实训分享2-编译运行TouchGFX咖啡机例程(含桌面仿真)
【2025·STM32峰会】+TouchGFX实现动态进度显示以及界面切换
【2025·STM32峰会】+使用TouchGFX快速创建GUI
【2025·STM32峰会】GUI解决方案实训分享1-对LVGL咖啡机例程的牛刀小试以及问题排查
实战经验 | 关于STM32H7使用LL库生成ADC代码工作异常问题说明
实战经验 | 关于STM32H745的MC SDK电机控制工程问题的解决办法
【H745I GUI】1.GreenHouse 灯光控制
【Wio Lite AI视觉开发套件】+移植TensorFlow Lite