STM32开发——项目创建
本文介绍了使用STM32CubeMX进行STM32项目开发的配置流程。主要内容包括:1)芯片型号选择与工程创建;2)引脚配置(烧录方式、晶振连接);3)外设接口配置(UART、I2C、SPI等通信接口);4)时钟源设置与分频处理;5)代码生成方法。文中还详细解释了STM32芯片型号的命名规则,并阐述了底层I/O库(特别是HAL库)的作用与优势,包括提高开发效率、增强可读性、提升可移植性等,同时对比
项目创建
首先打开Cubemx,选择这个:

填写芯片型号,选择第一个,点击开始工程 [拓展资料:STM32芯片型号的含义]

引脚和配置
烧录引脚配置
烧录方式选择:Serial Wire,之后右侧示意图对应的SWDIO SWDCLK会变绿


晶振配置

从配置图可以看出,高低速晶振和烧录引脚都变绿了,这代表都配置好了。
其正是对应着我们画的这几个引脚:

配置外设接口
在 STM32CubeMX 中,Connectivity(连接性)选项卡是用来配置微控制器的外设接口(即通信外设)的。这些接口允许 MCU 与其他设备或模块进行数据通信。
Connectivity 列表包括:
- CAN:控制器局域网络,常用于汽车和工业控制。
- I2C1 / I2C2:两线串行总线,适合短距离、低速通信(如传感器、EEPROM)。
- SPI1 / SPI2:串行外设接口,高速全双工通信,常用于显示屏、存储器等。
- USART1 / USART2 / USART3:通用同步/异步收发器,支持串口通信(UART)、同步模式等,广泛用于调试、串口通信。
- USB:通用串行总线,支持 USB 设备或主机功能。
✅ 这个选项的作用是:
当你在 STM32CubeMX 中选择某个外设(如 USART1),它会:
- 启用该外设(使能时钟)
- 分配引脚(自动关联 GPIO 引脚)
- 配置时钟源
- 生成初始化代码(在生成的嵌入式代码中自动配置)
📌 使用场景示例:
- 你想用串口打印调试信息 → 选中
USART1,并设置波特率、数据位等。 - 你要连接一个 I2C 温度传感器 → 启用
I2C1,并绑定 SCL/SDA 引脚。 - 要连接一个 OLED 屏幕(SPI 接口)→ 启用
SPI1,配置 CS、SCK、MOSI 等引脚。
在原理图中,我们启用UART1作为烧录的测试串口,必须开启


然后点击GPIO Settings,检查是否是我们定义的PA9 PA10作为UART引脚:

其他配置
至于供电和复位BOOT这些则是Cubemx自动帮我们配置好的。
时钟配置
点击Clcok Config

第二步选择HSE(External)使用外部晶振作为时钟源,倍频选择72倍,因此PLLMul x9。
可以发现后面报错了,这里上面是低速外设总线,下面是高速外设总线,低速总线无法支持太高的频率,因此要分频/2

项目管理


然后点击“Generate Code”即可


Keil中的配置
点击魔法棒,选用微库MicroDB

接着点击C/C++配置,把优化等级关掉(设为Level0),否则会把代码原有的含义修改掉

Debug的配置
我用的是野火的DAPLink烧录器,常见的ST-Link也是可以的,接线逻辑是一样的,3V3接3V3,GND接GND,TCK接SWDCLK,TMS接SWDIO。

我是DAPLink,因此这里选用DAP Debugger,如果你是STLink,就选ST-LInk Debugger就行。

此时插入野火的烧录器,关闭魔术棒,再打开魔术棒,点击setting

这里就能搜索出FIre野火的DAP烧录器。

然后点击Flash Download(Failure是正常的,原因看后面)

ESPIDF Arduino这些IDE每次烧录完会上电重启,但是Keil不会,因此必须勾选Reset and Run才会自动重启

然后点击这个Pack,不去勾选Enable,我们自己去实现日志打印。(他给的日志打印包很大)

特别说明
如果你和我用的都是野火的DAP,你只接烧录口的四个引脚是会显示Fail的

这是因为烧录和供电是分离的,必须给stm32的供电口供电才能显示连接:

这个红灯亮了才行:

验证成功
编译


烧录

报错处理
如果出现:


说明你单片机买错了,c8tb和c8t6很相似,但不适配的,如果手上找不到c8t6,就在Cubemx修改芯片为c8tb即可。
如果出现这个:

报这个就是没供电,要给另一端A口插上电源才行。
如果出现这个:

我也不知道怎么办 。。。建议重新买一块stm32
如果其他报错也可以私发给我看。解决不了我帮你摇人。
如果出现这个:

如果外接电源也没用,就换一块板子吧
如果出现这个:

正常更新就行。
如果没有固件,可以下载:
【stlink 驱动安装教程】 https://www.bilibili.com/video/BV1xYmJBEEMF/?share_source=copy_web&vd_source=2c56c6a2645587b49d62e5b12b253dca
省流:

后来我换了STLINK,就能烧录了,哎
拓展资料
STM32芯片型号的含义
【干啥,STM32F103都啥意思……-哔哩哔哩】 https://b23.tv/NVXlbR1
为什么开发需要底层IO库,这样的封装有什么好处?HAL库是什么?除了常用的HAL库还有那些库?
一、为什么开发需要底层 I/O 库?
微控制器(如 STM32)通过寄存器控制外设(如串口、GPIO、ADC 等)。但直接操作寄存器存在以下问题:
- 代码复杂且易错:需查阅数百页参考手册,手动配置位域。
- 可读性差:
RCC->APB2ENR |= 0x04;不如enable_GPIOA_clock();直观。 - 可移植性差:STM32F1 和 F4 的寄存器地址不同,代码无法复用。
- 开发效率低:每个项目都要重复写初始化代码。
✅ 因此,需要“底层 I/O 库”对硬件操作进行封装,在保留性能的同时提升开发体验。
二、这样的封装有什么好处?
| 好处 | 说明 |
|---|---|
| ✅ 提高开发效率 | 提供 HAL_UART_Transmit() 等函数,一行代码完成复杂操作 |
| ✅ 增强可读性与可维护性 | 函数名语义清晰,便于团队协作和后期维护 |
| ✅ 提升可移植性 | 同一套 HAL 代码可在 STM32F4、H7、G0 等芯片间迁移(配合 CubeMX) |
| ✅ 降低出错风险 | 库内部处理时钟使能、引脚复用、中断优先级等细节 |
| ✅ 支持工具链集成 | 如 STM32CubeMX 自动生成初始化代码,大幅减少手写配置 |
💡 封装不是“隐藏”,而是抽象共性、隔离变化,让开发者专注业务逻辑而非硬件细节。
三、HAL 库是什么?
- 全称:Hardware Abstraction Layer(硬件抽象层)
- 提供方:STMicroelectronics(意法半导体)
- 定位:STM32 官方主推的跨系列通用驱动库
- 特点:
- 高度抽象,统一 API(如所有串口都用
HAL_UART_XXX) - 支持中断、DMA、低功耗等高级功能
- 与 STM32CubeMX 图形配置工具深度集成
- 基于 CMSIS 标准,兼容 ARM Cortex-M 架构
- 高度抽象,统一 API(如所有串口都用
- 典型用法:
UART_HandleTypeDef huart1; HAL_UART_Init(&huart1); HAL_UART_Transmit(&huart1, (uint8_t*)"Hello", 5, 1000);
⚠️ 缺点:代码体积较大、执行效率略低于寄存器操作(但对多数应用影响不大)。
四、除了 HAL 库,还有哪些常用底层 I/O 库?
| 库名 | 所属/适用 | 特点 | 适用场景 |
|---|---|---|---|
| LL 库(Low-Layer) | ST 官方(STM32) | 接近寄存器,轻量高效,与 HAL 兼容 | 实时控制、性能敏感模块 |
| 标准外设库(SPL) | ST 官方(旧版) | 寄存器封装,简洁直接 | 老项目维护(F1/F4 等) |
| CMSIS-Core | ARM 官方 | 统一内核操作(NVIC、SysTick 等) | 所有 Cortex-M 芯片基础依赖 |
| MCUXpresso SDK | NXP | 类 HAL,支持 LPC/Kinetis | NXP 芯片开发 |
| TivaWare / DriverLib | TI | 轻量寄存器封装 | TM4C/MSP432 开发 |
| ESP-IDF HAL | Espressif | 分层设计,支持 Wi-Fi/BLE | ESP32 系列开发 |
| libopencm3 | 开源社区 | 跨厂商(STM32/LPC/EFM32) | 开源嵌入式项目 |
| 直接寄存器操作 | 无 | 无任何封装,极致控制 | 学习、竞赛、资源极度受限场景 |
✅ 总结一句话:
底层 I/O 库是连接“硬件”与“应用”的桥梁。HAL 是 ST 为 STM32 提供的标准化、高可移植性封装库,而 LL、SPL、CMSIS 或厂商 SDK 则提供了从“高性能”到“极致轻量”的多样化选择。合理使用这些库,能在开发效率、代码质量与系统性能之间取得最佳平衡。
更多推荐



所有评论(0)