拓冰建站拓冰建站
首页 / 资讯中心 / 正文

STM32CubeMX快速上手:图形化配置、代码生成与常见问题排查

做过 STM32 开发的人应该都有印象拿到一块板子先看原理图找到 LED 接在哪个引脚然后翻数据手册确认时钟树再打开 Keil 手动写 GPIO 初始化。这一步一步下来光初始化代码就要折腾半天如果后面还接串口、ADC、定时器、DMA工作量直接翻倍。STM32CubeMX 就是把这个过程图形化、自动化的官方工具由 ST意法半导体推出。你只需要在图形界面上点选芯片型号、拖拽配置引脚和外设参数它就自动生成 HAL 库或 LL 库的初始化 C 代码生成出来的工程可以直接用 Keil、IAR 或者 STM32CubeIDE 打开编译。这次我们就从零走一遍 STM32CubeMX 的完整流程软件下载安装、固件包准备、新建工程、配置 GPIO 和串口、软触发 ADC 采集、生成代码、导入 Keil 编译烧录再讲一讲中文汉化和 Trace 调试功能的配置方法。最后会整理一份高频问题排查清单重点解决固件包下载慢、登录不了、引脚冲突、编译报错这些最挡路的坑。这篇内容适合两类读者一类是刚开始学 STM32想把精力放在业务逻辑而不是重复造轮子的初始化代码上另一类是已经用寄存器或标准库写了不少代码正在考虑要不要切换到 CubeMX HAL 这套开发模式。看完之后你可以照着搭出第一套完整的 STM32 工程也知道碰到问题时该从哪里下手。1. STM32CubeMX 核心能力速览先给一张总表把 STM32CubeMX 的规格和边界说清楚后面再展开操作细节。能力项说明工具类型图形化芯片配置与代码生成工具开发厂商ST意法半导体官方主要功能引脚分配、时钟树计算、外设参数配置、中间件配置、初始化 C 代码生成支持芯片覆盖 STM32 全系列包括 F1/F4/H7/G0/L0 等生成代码类型HAL 库与 LL 库初始化工程支持平台Windows / Linux / macOS启动方式图形界面启动安装包自带运行环境中文界面支持通过语言包安装工程导出支持 Keil MDK-ARM、IAR、STM32CubeIDE 等是否支持 API不是运行时服务不支持在线 API支持命令行批处理生成工程适合场景STM32 工程初始化、外设管理、代码框架搭建、学习与产品原型验证很多人把 CubeMX 当成“点一点生成代码”的小工具但实际上它的价值有三个层次。第一层是图形化引脚和外设配置避免手写寄存器初始化这一点在 F1 上体感还不明显在 H7 这种外设多、时钟树复杂的芯片上优势非常突出。第二层是时钟树自动计算你告诉它外部晶振是多少、系统主频要跑到多少它会自动算出 PLL 分频倍频参数。第三层是项目管理.ioc文件保存全部配置随时可以重新打开修改再生成工程维护成本比纯手工代码低很多。从门槛来说STM32CubeMX 对硬件的要求非常低普通办公电脑都能流畅运行。需要注意的主要是磁盘空间因为要下载对应芯片系列的固件包单个固件包从几十 MB 到几百 MB 不等装多个系列之后占用会明显增加。2. 适用场景与使用边界STM32CubeMX 最划算的使用场景是“外设多、时间紧、需要快速搭框架”的项目。比如你要在开发板上同时启用 GPIO、USART、ADC、TIM、DMA还要挂一个 FreeRTOS手工配置的工作量非常大而用 CubeMX 从选芯片到生成代码可能只需要半天。尤其是原型验证阶段图形化配置能让你快速看到引脚占用和冲突提前避免硬件设计上的失误。对学习阶段的人来说CubeMX 也是一个很好的理解工具。你可以一边配置外设一边观察生成的 HAL 库代码把图形界面上的选项和代码里面的结构体字段对应起来。很多新手对“GPIO 设置为推挽输出”“串口波特率 115200”这些概念只有模糊印象在 CubeMX 里点过一遍、再去阅读生成的代码理解会扎实很多。这也是我建议你不要只停留在“能生成代码”这一步的原因。但它不是万能的。第一HAL 库封装较厚生成的代码体积和运行开销比寄存器版本大如果项目有极端的 Flash/RAM 限制或者需要非常精细的底层时序控制直接用寄存器或者 LL 库更合适。第二CubeMX 不能替代硬件设计引脚分配必须对照实际原理图来做画板之前最好先过一遍 CubeMX确认引脚没有冲突而不是等板子回来了再调整。第三跨芯片系列迁移并不等于“换个型号点一下生成”不同系列的外设结构差异很大重新生成后通常还要重新检查和调整。使用合规方面也有几点需要留意。软件和固件包尽量走官方渠道下载安装和升级时看清楚许可协议。CubeMX 生成的初始化代码本身可以用于学习和商用但如果工程里集成了 FreeRTOS、FatFS、LwIP 等第三方中间件需要确认各自的开源许可证类型。团队项目里.ioc文件是核心配置资产建议纳入版本管理避免不同开发者的 CubeMX 版本或固件包版本不一致导致生成结果差异。3. STM32CubeMX 安装部署与环境准备这一节解决三个问题怎么把软件装好、怎么把固件包装好、登录不了或者下载太慢怎么办。安装本身不复杂但固件包这一步是很多新手卡住的地方。3.1 系统要求与安装包准备STM32CubeMX 支持 Windows、Linux 和 macOSWindows 下建议使用 Windows 10 或更新的系统。新版安装包通常会把运行环境一起打包启动时如果提示缺少 Java再按提示安装对应版本的 JDK/JRE 即可不用提前焦虑。安装路径尽量选择纯英文目录避免中文路径在后续固件包下载和编译时出现兼容问题。下载方式建议直接去 ST 官网搜索“STM32CubeMX”进入产品页面后选择对应操作系统的安装包。注意区分两个容易混淆的概念STM32CubeMX 是图形化配置工具另一个是 STM32Cube 固件包针对不同芯片系列的 HAL 库代码包两者都要有前者负责生成代码后者提供外设驱动源码。很多新手第一次下载只装了工具没有装固件包导致新建工程时找不到芯片或者生成代码时提示缺少固件。3.2 软件安装与首次启动Windows 下一般是解压或者运行安装程序按向导走到完成即可。首次启动时软件可能会提示设置工作目录建议放在一个容量充足、路径简单的分区。启动后主界面分成几个区域中间是芯片引脚图左侧是外设和中间件列表右侧可以切换查看时钟树、配置和生成预览。如果打开之后没有看到芯片不要慌先新建工程选择一个具体型号或开发板主界面就会加载出来。3.3 固件包下载与离线安装固件包相当于“芯片外设驱动仓库”。CubeMX 生成代码时会根据目标芯片系列调用对应的固件包没有它直接无法生成。在线安装方式是在软件里打开固件包管理界面在 Help 菜单下找到 Manage embedded software packages找到你需要的芯片系列版本点击安装即可。在线下载速度不理想是很常见的问题尤其是第一次下载大体积固件包的时候。更稳的做法是离线安装去 ST 官网单独下载对应芯片系列的固件包 zip 文件下载完成后在固件包管理界面选择“From Local”或者“本地安装”指定 zip 文件路径软件会自动解压并纳入管理。这种方式不依赖软件内置下载器的网络状态是我实际处理“固件包下载失败”时最常用的手段。如果官网下载也慢可以换一个网络环境再试或者选择在服务器带宽更好的时段下载下载完成后拷贝到本地导入。3.4 登录不了与账号问题新版本 STM32CubeMX 在在线下载固件包时会要求登录 ST 账号账号注册是免费的。如果你遇到“登录不了”“一直转圈”“登录失败”这类问题排查顺序可以这样走先确认网络连接是否正常再检查是不是公司网络或校园网有额外限制必要时切换手机热点测试如果浏览器可以正常访问 ST 官网并登录说明账号本身没问题问题大概率出在软件网络请求上。此时优先选择离线固件包安装方案绕过登录下载流程这样即使账号登录暂时不可用也不影响本地代码生成。4. 新建工程与引脚配置实操安装和固件包准备好之后就可以从零创建一个 STM32 工程了。这里以一颗常见芯片为例步骤对全系列通用区别只在外设选项和时钟树复杂度。4.1 新建工程与芯片选择打开 STM32CubeMX点击新建工程会看到两个选择入口按芯片型号搜索或者按开发板搜索。手头确定用哪颗芯片直接在 Part Number 搜索框输入型号关键词比如“STM32F103C8T6”软件会列出匹配型号。如果你用的是官方开发板比如 Nucleo 系列也可以直接切换到 Board Selector选出对应板卡软件会自动带入板载 LED、按键、调试口等配置省很多事。新手第一次最好先用开发板入口生成出来的工程可以直接运行不容易遇到引脚配错的问题。选中芯片后点击 Start Project进入主配置界面。中间是芯片引脚图你可以在空白引脚上点击并选择功能左侧是外设分类树GPIO、USART、SPI、I2C、ADC、TIM 等都在这里右侧有几个标签页最常用的两个是 Pinout Configuration 和 Clock Configuration前者配外设后者配时钟树。4.2 时钟树配置思路时钟树是 CubeMX 里信息量最大、也最容易让新手困惑的地方。默认情况下新建工程使用的是内部时钟 HSI好处是芯片不接外部晶振也能运行但精度和频率上限都能看到明显差距。如果你用的开发板上有外部高速晶振 HSE比如常见的 8MHz可以在 Clock Configuration 页面把 HSE 设置为 Crystal/Ceramic Resonator然后在 PLL 来源处选择 HSE并设置目标系统主频。CubeMX 会自动计算 PLL 的分频、倍频参数如果计算出来的数值超出芯片允许范围界面会标红。遇到标红说明时钟配置不合理需要降低目标主频或者调整分频。H7 系列还要单独注意 ADC 等外设的内核时钟来源配置其他外设时如果发现 ADC 采样值不正常回来检查时钟树通常能找到问题。时钟树配置完成后外设的波特率、采样率等参数会基于这个最终时钟精确计算这是手工配置时代很容易出错的环节。4.3 GPIO 与点灯配置的完整流程以最经典的 LED 点灯为例。假设开发板上的 LED 接在 PC13在中间的芯片引脚图上找到 PC13鼠标单击在弹出菜单中选择 GPIO_Output。然后在外设列表里选中该引脚对应的 GPIO 配置项可以看到输出模式、速度、上下拉等参数。LED 驱动通常用推挽输出速度可以选 Low 或 Medium初始电平根据硬件原理图设置成高或低。配置完成后进入 Project Manager 页面设置工程名、工程路径并在 Toolchain/IDE 里选择你接下来要用的编译环境。如果计划用 Keil MDK-ARM就选 MDK-ARM V5 或对应版本如果暂时没装 Keil可以直接选 STM32CubeIDE 生成出来的工程自带编译和调试配置。点击右上角生成代码按钮CubeMX 会在目标路径下创建完整工程并自动把初始化代码写进 main.c、gpio.c 等文件。生成完成后打开 main.c可以看到主循环中已经有熟悉的 HAL_GPIO_TogglePin 和 HAL_Delay 调用示例。点灯这段流程虽然简单但它是检验整个环境是否跑通的最小闭环我也建议每个新手第一次接触 CubeMX 时不要急着去配置复杂外设先把“新建工程-配置 GPIO-生成代码-编译烧录-LED 闪烁”这一整条链路跑通后面的学习会顺很多。5. 常用外设配置串口、ADC 软触发与定时器跑通点灯之后就可以进入更常用的外设配置了。这一章重点讲三个串口通信、ADC 软触发、定时器中断它们基本覆盖了绝大多数项目的入门需求。5.1 串口 1 配置与 printf 重定向串口是调试和通信最常用的外设。在左侧外设树里找到 USART1选择 Asynchronous 异步模式右侧可以看到引脚已经自动分配到 PA9/PA10具体取决于芯片封装和复用表。参数设置里把波特率改成 115200数据长度 8停止位 1无校验这是最常见的调试串口配置。如果需要在接收数据时进入中断在 NVIC Settings 标签页勾选 USART1 global interrupt。生成代码后串口初始化函数在MX_USART1_UART_Init()里完成收发可以调用 HAL 库函数uint8_t tx_buf[] Hello STM32\r\n; HAL_UART_Transmit(huart1, tx_buf, sizeof(tx_buf) - 1, 1000); uint8_t rx_byte 0; HAL_UART_Receive_IT(huart1, rx_byte, 1); // 开启单字节中断接收中断接收完成后的数据通常在回调函数里处理void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart-Instance USART1) { // 在这里处理接收到的 rx_byte HAL_UART_Receive_IT(huart1, rx_byte, 1); } }为了直接用 printf 打印日志可以把标准库输出重定向到串口。Keil 工程里需要勾选 MicroLIB然后实现 fputc#include stdio.h int fputc(int ch, FILE *f) { HAL_UART_Transmit(huart1, (uint8_t *)ch, 1, 0xFFFF); return ch; }之后就可以在代码里直接用printf(sysclk %d\r\n, HAL_RCC_GetSysClockFreq());输出调试信息。需要注意STM32CubeIDE 环境的重定向写法与 Keil 不完全一样换 IDE 时不要直接照搬。5.2 STM32H7 ADC 软触发配置ADC 的配置在不同系列之间差别比较大这里以 STM32H7 为例因为它经常被问到“软触发怎么做”。在左侧 Analog 分类下找到 ADC1勾选要使用的通道比如 IN0把它配置为单端输入。H7 的 ADC 分辨率比 F1/F4 更丰富可以根据需求选择 16 位、12 位等。关键在触发方式。如果希望代码里通过调函数手动启动一次转换就把触发源设置为 Software Trigger也就是软件触发而不是 Timer Trigger 或其他定时器触发。转换模式可以选单次转换也可以选连续转换。单次转换模式更节能也更好理解适合入门。还要留意 ADC 内核时钟H7 的 ADC 时钟来源和 PLL 配置比 F1 复杂如果 ADC 时钟频率超过芯片限制转换结果可能异常具体上限以芯片参考手册为准。生成代码后的核心调用流程是这样HAL_ADC_Start(hadc1); HAL_ADC_PollForConversion(hadc1, 100); uint32_t adc_val HAL_ADC_GetValue(hadc1);这段逻辑就是“软件触发一次转换等待转换完成读取原始值”。很多做 stm32h7 adc 软触发采集的人第一次拿到全 0 数据大概率是以下三个原因之一一是没有调用 HAL_ADC_Start只是初始化了外设二是触发方式没有选软件触发但实际上又在等待软件转换完成三是 ADC 时钟配置超过芯片限制导致转换没有正常启动。按这三个方向排查大多数问题都能解决。5.3 定时器中断配置定时器在项目里用来做周期任务、延时、PWM、输入捕获等。以基础定时器中断为例在左侧找到 TIM2 或 TIM3时钟源选 Internal Clock然后在 Parameter Settings 里设置预分频 PSC 和自动重载值 ARR。CubeMX 会自动显示溢出时间比如在 72MHz 主频下PSC71ARR999溢出时间就是 1ms溢出时间 (PSC 1) * (ARR 1) / 定时器时钟频率接着在 NVIC Settings 里使能 TIM 全局中断。生成代码后中断回调函数写在 main.c 的 USER CODE 区域void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim-Instance TIM2) { HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); } }这段代码里对htim-Instance TIM2的判断很重要因为多个定时器共用同一个回调不做判断会把所有定时器中断混在一起处理。定时器配置在 CubeMX 里看起来简单但 PSC 和 ARR 的计算逻辑值得亲手推一遍这对理解后续 PWM 占空比配置很有帮助。5.4 引脚冲突与重映射处理当你同时配置多个外设时一定会遇到引脚冲突。CubeMX 会在引脚图上用不同颜色标记点击冲突引脚会弹出当前被占用的功能列表你可以选择保留一个功能释放另一个。有些冲突是可以通过重映射解决的比如 USART 的默认引脚被占用了可以改到同一串口支持的复用引脚上这个信息在芯片数据手册的 AF 复用表里可以看到。CubeMX 里选中引脚后会列出该引脚可复用的所有外设功能选中需要的功能即可完成切换。重映射之后记得回到时钟树和外设页面确认相关时钟仍然正确。6. 生成代码与导入 IDE 编译烧录配置完成后生成代码只是第一步真正跑起来还得过编译和烧录这一关。6.1 生成的工程结构CubeMX 生成的工程目录大致是下面这个样子不同芯片系列和 IDE 选项会略有差异ProjectName/ ├── Core/ │ ├── Inc/ │ │ ├── main.h │ │ └── ... │ └── Src/ │ ├── main.c │ ├── gpio.c │ ├── usart.c │ └── ... ├── Drivers/ │ ├── STM32H7xx_HAL_Driver/ │ └── CMSIS/ ├── MDK-ARM/ # 选择 Keil 时生成 │ └── ProjectName.uvprojx └── ProjectName.ioc.ioc文件是 CubeMX 工程的核心后续所有图形化修改都在它上面进行。打开 CubeMX 时选择这个文件就能完整恢复到当时的引脚、外设和时钟配置。如果这个文件丢了工程就变成了普通代码包无法再回到图形化配置界面。所以.ioc文件一定要备份和纳入版本管理。6.2 导入 Keil 并编译用 Keil 打开MDK-ARM目录下的.uvprojx工程文件。如果编译时报错找不到stm32h7xx_hal.h这一类头文件说明 Keil 环境缺对应芯片的 Device Pack需要先在 Keil 的 Pack Installer 里安装对应系列的支持包。这是新手最常见的编译失败原因和代码本身无关。编译配置里还需要检查 Debug 选项。如果使用 ST-LinkDebug 设置下选择 ST-Link Debugger并确认 SWD 接口配置正确。烧录前连接好调试器点击 Download 按钮程序就会写入芯片。如果提示 No Target Connected优先检查调试器驱动、接线和芯片供电。很多时候连不上是杜邦线接触不良换一根短一点的线就能解决。6.3 USER CODE 区域与代码保护这是 CubeMX 使用中非常重要的一环。main.c、gpio.c 等生成文件里CubeMX 会预留一些注释标记比如/* USER CODE BEGIN 0 */ /* USER CODE END 0 */你手写的业务代码必须放在这样的注释区间之间下次重新生成代码时才不会被覆盖。如果你把自定义代码写在标记外或者干脆直接改了生成区里的代码下次在 CubeMX 里调整配置并重新生成时这些内容会被覆盖掉。很多项目做了一段时间后发现代码“丢了”原因基本都是这个。建议从第一天就养成只在 USER CODE 区域内写业务代码的习惯。7. STM32CubeMX 汉化与 Trace 调试功能配置很多人在安装好 STM32CubeMX 后第一件事就是找中文界面另外有一部分人会关心 Trace 调试功能的配置。这一章把两个问题放在一起讲。7.1 中文界面汉化设置STM32CubeMX 是支持中文界面的设置入口在菜单栏 Help 下选择 Install New Languages软件会列出可安装的语言包勾选简体中文安装完成后重启软件界面就会变成中文。如果你的软件版本里找不到这个入口可以留意一下软件版本更新说明不同小版本的菜单名称略有调整。语言包的下载同样依赖网络。如果在线安装不成功可以参考固件包的处理思路先确认网络通畅或者选择离线方式安装。需要注意的是中文界面只是翻译了操作界面生成的代码注释仍然是英文这一点不要产生误解。对部分用户来说中英文切换可能会影响文档搜索和资料对照我个人反而更推荐习惯英文界面因为绝大多数社区资料、官方文档截图都是英文界面中文界面虽然好懂但对照别人写的教程时容易找不到菜单。7.2 Trace 调试功能配置Trace 通常指调试跟踪功能用来在开发调试阶段输出日志和跟踪事件区别于普通串口打印的实现方式。在 CubeMX 中配置 Trace首先要确保调试端口已经打开。在 System Core 下的 SYS 配置里Debug 选项默认可能是 No Debug需要改成 Serial Wire 或者 JTAG。Serial Wire 模式只需要 SWDIO 和 SWCLK 两根线占用的引脚最少是目前大多数项目的选择。如果你打算使用 SWO/ITM 跟踪需要确认硬件链路支持。ST-Link 等调试器是否支持 SWO 功能、目标板是否把 SWO 引脚引到了调试接口都会影响 Trace 是否可用。CubeMX 侧负责打开调试端口和生成对应的 HAL 配置真正的 Trace 使能还需要在 IDE 里完成。以 Keil 为例在 Options for Target 的 Debug 标签页里选择调试器后打开 Settings在 Trace 相关选项中使能 Trace 并设置内核时钟内核时钟数值要与实际系统主频保持一致否则时间戳和收发都会对不上。代码中通过 ITM 输出日志时通常使用ITM_SendChar或者重定向到 ITM 端口IDE 的调试窗口就能实时看到输出。不同芯片和调试器的 Trace 支持能力不同如果配置后没有输出优先排查调试器型号和硬件连接。8. 常见问题与排查方法STM32CubeMX 用起来不难但新手遇到问题时容易没有方向。下面这张表格整理了最常见的问题现象、可能原因和处理思路遇到问题先按行对照不要盲目重装软件。问题现象可能原因排查方式解决方案安装后软件无法启动缺运行环境、路径含中文、权限不足查看启动日志确认安装路径重新安装到纯英文路径按提示安装运行环境新建工程时找不到芯片固件包未安装或版本过旧打开固件包管理界面查看已安装列表在线安装或离线导入对应芯片系列固件包在线下载固件包很慢网络环境不稳定更换网络再试从官网下载 zip 后通过本地方式导入下载固件包要求登录但登录不了网络限制、账号异常浏览器访问官网确认账号状态使用离线固件包安装方式绕过在线登录引脚图出现黄色或红色标记引脚复用冲突点击冲突引脚查看占用功能调整引脚分配或取消冲突外设时钟树配置显示红色PLL 参数超范围或时钟源选择不对对照数据手册确认允许范围降低主频或调整分频倍频Keil 打开工程编译报错缺头文件缺少对应芯片 Device Pack在 Pack Installer 中搜索芯片系列安装对应 Device Pack 后重新编译串口输出乱码或没有数据波特率不匹配、引脚接错、没有供电检查代码和串口助手设置万用表量电平修正波特率或重新接线ADC 采集始终为 0未启动转换、触发方式不对、时钟超限检查代码是否调用 HAL_ADC_Start检查时钟树按软件触发流程重新配置重新生成代码后手写代码丢失自定义代码写在 USER CODE 区域外对比旧版 main.c 检查被覆盖内容以后只在 USER CODE 注释区间内写业务代码烧录时提示 No Target Connected调试器驱动、接线、供电问题检查驱动和接线更新驱动重新连接调试器表中的多数问题都能通过“看日志、查配置、换环境”这三步定位。我的建议是遇到问题不要急着重装先把完整错误信息截图再对照配置页面逐项确认基本都能找到原因。9. 工程管理最佳实践与下一步建议STM32CubeMX 本身不是运行时服务没有在线 API 接口但它提供的工程生成能力可以很好地融入正规的嵌入式项目管理流程。最后这部分是给准备深入使用的读者的一些工程化建议。第一个建议是目录结构要分层。把 CubeMX 工程、硬件原理图、应用代码、编译产物分开管理。比如一个大项目下可以分成 Hardware、Firmware、Docs 三个目录Hardware 放原理图和 PCBFirmware 里再放 CubeMX 工程和 IDE 工程Docs 放设计文档和芯片资料。这样后续找文件、备份、交接都会轻松很多。第二个建议是版本控制要趁早。.ioc文件、Core下的用户代码、Drivers下的 HAL 库代码都应该纳入 Git 管理。IDE 编译产生的中间文件比如 Keil 的Objects、Listings目录可以通过.gitignore排除掉避免提交大量无意义的临时文件。多人协作时CubeMX 版本和固件包版本尽量统一不然一个人的配置在另一个人电脑上重新生成可能出现差异。第三个建议是外设实例命名要有可读性。CubeMX 里可以修改外设实例名比如把 USART1 改成huart_debug把 ADC1 改成hadc_battery生成代码后变量名会同步改变。这样的命名在阅读代码时比huart1、hadc1直观得多尤其是项目里串口和 ADC 数量多的时候命名规范能省下很多沟通成本。第四个建议是画原理图之前就先用 CubeMX 过一遍引脚分配。很多硬件设计问题都是画完板子才发现引脚复用冲突这时再改原理图成本很高。先建一个 CubeMX 工程把所有用到的外设和引脚按原理图需求配置好确认没有冲突再开始画板效率会高很多。走完这一整套流程之后下一步可以往三个方向深入。第一个方向是多外设组合比如用 DMA 加串口接收不定长数据用定时器触发 ADC 采样这些组合在 CubeMX 里都有对应的图形化配置项。第二个方向是中间件集成在左侧外设树里可以看到 FreeRTOS、FatFS、
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门