项目创建

首先打开Cubemx,选择这个:

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

引脚和配置

烧录引脚配置

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

晶振配置

从配置图可以看出,高低速晶振和烧录引脚都变绿了,这代表都配置好了。

其正是对应着我们画的这几个引脚:

配置外设接口

在 STM32CubeMX 中,Connectivity(连接性)选项卡是用来配置微控制器的外设接口(即通信外设)的。这些接口允许 MCU 与其他设备或模块进行数据通信。

Connectivity 列表包括:

  • CAN:控制器局域网络,常用于汽车和工业控制。
  • I2C1 / I2C2:两线串行总线,适合短距离、低速通信(如传感器、EEPROM)。
  • SPI1 / SPI2:串行外设接口,高速全双工通信,常用于显示屏、存储器等。
  • USART1 / USART2 / USART3:通用同步/异步收发器,支持串口通信(UART)、同步模式等,广泛用于调试、串口通信。
  • USB:通用串行总线,支持 USB 设备或主机功能。

✅ 这个选项的作用是:

当你在 STM32CubeMX 中选择某个外设(如 USART1),它会:

  1. 启用该外设(使能时钟)
  2. 分配引脚(自动关联 GPIO 引脚)
  3. 配置时钟源
  4. 生成初始化代码(在生成的嵌入式代码中自动配置)

📌 使用场景示例:

  • 你想用串口打印调试信息 → 选中 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

省流:

链接: https://pan.baidu.com/s/1-8ojAjNFum7_p5JYJHzXDQ?pwd=s78t 提取码: s78t

后来我换了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 架构
  • 典型用法
    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 则提供了从“高性能”到“极致轻量”的多样化选择。合理使用这些库,能在开发效率、代码质量与系统性能之间取得最佳平衡。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐