1、先说:为什么 STM32 可以做硬件 I2C / 硬件 SPI
芯片内部专门做了一套硬件外设模块(控制器),不是 CPU 靠软件循环翻转 IO。
- SPI 外设内部:移位寄存器 + 时钟发生器。只要你写几个寄存器配置好,硬件自动输出 SCK 时钟、自动移位发送 MOSI、采样 MISO。CPU 只要把数据丢进寄存器,然后等完成就行,CPU 不用去每一位操作引脚。
- I2C 外设内部:同样内置时序电路、起始 / 停止、ACK 应答逻辑。硬件自动生成 SCL 时钟,处理总线握手。
2、单总线(1-Wire,典型 DS18B20)
✅ 绝大多数 STM32 没有内置硬件 1-Wire 外设! 所以没有硬件控制器,只能软件模拟。
一、I2C 硬件 vs 软件 代码对比(HAL 库 STM32)
(1)硬件 I2C(CubeMX 开启 I2C1,PB6 PB7 复用开漏)



(2)软件模拟 I2C(PB6 PB7 设普通 GPIO 开漏,不开启 I2C 外设)
全部时序手动写,CPU 不停翻转 IO,占用 CPU

二、SPI 硬件 vs 软件模拟 SPI(HAL 库)
SPI 硬件:硬件产生 SCK 时钟、移位收发 MOSI/MISO;CS (片选) 我们用软件 NSS,单独 GPIO 控制
(1)硬件 SPI(CubeMX 开启 SPI1,SCK/MOSI/MISO 复用,CS 是普通 GPIO)



✅重点:HAL_SPI_TransmitReceive底层硬件自动输出 SCK 时钟 ,CPU 不用循环翻转 SCK 引脚,CPU 开销低,就是简历那句话描述的。
(2)软件模拟 SPI(全部引脚设普通 GPIO,不启用 SPI 外设)
CPU 手动翻转 SCK、MOSI,读取 MISO,全程占用 CPU

三、关于DMA的使用
SPI、硬件 I2C:原生支持 DMA(CubeMX 直接勾选 DMA)。
软件模拟 I2C、单总线 (Onewire):CPU 翻转 IO,DMA 无法接管,不能直接 DMA。
四、总结
硬件 I2C/SPI:片内外设硬件负责通信时序,CPU 只需要发起传输,降低 CPU 占用;软件模拟方案,CPU 通过不断翻转 GPIO、延时来模拟通信时序,CPU 占用高,但移植灵活、避开硬件外设 bug。
