STM32零基础教程(六):ADC、I2C、SPI与DMA

STM32 零基础系列第 6 篇:完成模拟采集、传感器通信和高效率数据搬运。

第 9 章:ADC 模数转换

章节介绍

ADC 把连续电压转换成数字量。它像一把刻度尺:把 0~3.3V 分成 4096 个格子,读取电压落在哪一格。

专业名词

  • ADC:Analog-to-Digital Converter,模数转换器。
  • 分辨率:例如 12 位表示 0~4095。
  • 采样时间:ADC 观察输入电压的时间。
  • 参考电压 Vref:数字满量程对应的电压。
  • 触发源:软件、定时器或外部事件。
  • 校准:减少偏移和增益误差。

HAL 读取示例

c 复制代码
uint32_t adc_value;
float voltage;

HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 10);
adc_value = HAL_ADC_GetValue(&hadc1);
HAL_ADC_Stop(&hadc1);

voltage = 3.3f * adc_value / 4095.0f;

不要把 ADC 数值直接当成物理量。光照、温度、电流等都需要结合传感器电路和标定公式转换。

本章掌握标准

  • 能根据分辨率和参考电压换算输入电压。
  • 能配置单次转换、连续转换和多通道扫描。
  • 能解释采样时间、噪声、平均滤波和校准。

未来使用场景

电池电压、温度、光照、电流、电位器、麦克风和模拟传感器。


第 10 章:I2C 与 SPI

I2C

I2C 像一条公交线路:SCL 是统一时钟,SDA 是共享数据线,每个设备有地址。它只需要两根线,适合多个低速传感器。

专业名词:

  • 主机/从机:谁产生时钟,谁就是主机。
  • 设备地址:总线上区分不同设备的编号。
  • ACK:应答信号。
  • 重复起始:不释放总线,直接切换读写方向。
  • 上拉电阻:I2C 开漏总线恢复高电平所必需。
c 复制代码
uint8_t data;

HAL_I2C_Mem_Read(&hi2c1,
                 0x48 << 1,
                 0x00,
                 I2C_MEMADD_SIZE_8BIT,
                 &data,
                 1,
                 100);

STM32 HAL 的设备地址通常需要左移一位,因为最低位用于读写方向。

SPI

SPI 像一条专用高速传送带:

text 复制代码
SCK   时钟
MOSI  主机发送
MISO  主机接收
NSS/CS 片选

SPI 没有统一的设备地址,每个设备通常单独占用一个 CS 引脚,速度比 I2C 高。

c 复制代码
uint8_t tx = 0x9F;
uint8_t rx[3];

HAL_GPIO_WritePin(FLASH_CS_GPIO_Port, FLASH_CS_Pin, GPIO_PIN_RESET);
HAL_SPI_TransmitReceive(&hspi1, &tx, rx, 1, 100);
HAL_SPI_Receive(&hspi1, rx, 3, 100);
HAL_GPIO_WritePin(FLASH_CS_GPIO_Port, FLASH_CS_Pin, GPIO_PIN_SET);

本章掌握标准

  • 能区分 I2C 的地址和 SPI 的片选。
  • 能使用逻辑分析仪观察 SCL/SDA 或 SCK/MOSI/MISO。
  • 能处理 ACK、超时、总线忙和设备无响应。

未来使用场景

OLED、EEPROM、RTC、IMU、温度传感器、Flash、屏幕和无线芯片。


第 11 章:DMA

章节介绍

DMA 是 Direct Memory Access,直接存储器访问。它像仓库搬运机器人:CPU 只下达"把这批数据从 UART 搬到 RAM"的命令,搬运期间 CPU 可以做其他工作。

适合 DMA 的数据

  • UART 连续接收。
  • ADC 多通道采样。
  • SPI 屏幕刷新。
  • 定时器波形输出。

UART DMA 示例

c 复制代码
uint8_t rx_buffer[128];

HAL_UART_Receive_DMA(&huart2, rx_buffer, sizeof(rx_buffer));

DMA 完成或半传输时可以产生回调。实际协议应结合空闲线检测、环形缓冲区和帧解析。

本章掌握标准

  • 能解释 DMA 源地址、目标地址、数据宽度和传输长度。
  • 能区分普通模式、循环模式和双缓冲。
  • 能处理 DMA 缓冲区与 CPU 同时访问造成的数据一致性问题。

未来使用场景

高采样率数据采集、音频、摄像头、网络数据、串口高吞吐和屏幕刷新。


相关推荐
不悔哥7 小时前
开源OV-Watch:怎么做一个智能手表
单片机·开源·嵌入式
XiHongShi20168 小时前
STM32F407 RTC定时器例程,建议保存
stm32·单片机·学习
优信电子9 小时前
AIT1001 非接触式红外测温模块 STM32 驱动开发实战:从引脚到代码全解析
stm32·嵌入式·温度传感器·红外测温·非接触式测温·ait1001
深圳老胡10 小时前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
wuyk55510 小时前
《WiFi 嵌入式物联网开发全套实战》| 第 16 章 ESP32 AP+STA 双模共存原理与工程坑点
网络·stm32·物联网
女神下凡10 小时前
嵌入式设计的各种存储芯片的硬件/软件设计规范,非常全面。
arm开发·单片机·嵌入式硬件
梅梅96611 小时前
一款mipi转lvds的lcd调试(LT8912B)
单片机·计算机外设·电脑·显示器·pd芯片
开发笔记-阿牛12 小时前
蓝牙音乐灯拆解,又一次拆到蓝牙音乐灯芯片CK6865L
人工智能·单片机·嵌入式硬件·音视频·音频
从零开始的嵌入式之旅12 小时前
day47
arm开发·经验分享·笔记·嵌入式硬件
恒锐丰科技林技术员12 小时前
EG1164 高压大电流升压同步整流芯片解析
经验分享·嵌入式硬件·硬件工程