扫码加入

  • 正文
  • 相关推荐
申请入驻 产业图谱

STM32 DFSDM 输入模式全解析:并行 / 串行配置实战与误区规避

2025/12/22
1933
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

DFSDM(数字滤波器调制器)是 STM32 系列 MCU 的核心模拟外设,支持并行和串行两种输入模式 —— 并行模式适用于内部寄存器 / ADC 数据输入,串行模式适配外部 ΣΔ 调制器、PDM 麦克风等设备。本文基于 ST 官方文档 LAT1545(Rev 1.0),以 Nucleo-H723ZG 开发板为例,详细拆解两种模式的配置逻辑、测试步骤及常见误区,帮助开发者快速落地应用。

资料获取:开发经验 | LAT1545 DFSDM输入模式以及配置说明

1. DFSDM 核心架构简介

DFSDM 的核心是 “通道 + 滤波器” 的组合架构,关键特征如下:

  • 输入通道:最多支持 8 个,可配置为并行或串行输入;
  • 数字滤波器:共 4 个,支持 Sinc、FastSinc 等多种滤波类型,通道与滤波器可灵活映射(1 个通道可对应多个滤波器,实现多组参数处理);
  • 数据流程:外部 / 内部输入数据经通道传入滤波器,滤波后通过寄存器或 DMA 输出,支持数学处理、看门狗检测等扩展功能。

2. 并行输入模式:内部数据输入的两种场景

并行模式的核心是通过 16 位并行寄存器接收数据,适用于内部寄存器手动输入或内部 ADC 模块数据接入,配置重点是明确数据来源和通道 - 滤波器映射。

2.1 场景 1:数据来自内部寄存器(测试 / CPU 参与场景)

适用于算法验证、手动输入测试数据等场景,配置步骤如下:

(1)CubeMx 关键配置

  1. 模式选择:DFSDM 模式设为「Parallel input」,选择目标通道(示例:Channel 0);
  2. 数据来源:通道参数中「Multiplexer」设为「Internal_CH」(数据取自内部寄存器);
  3. 滤波器配置:选择目标滤波器(示例:Filter 0),将 Channel 0 设为规则通道,启用连续模式;
  4. 滤波参数:配置滤波器类型(如 FastSinc)、过采样率等(根据需求调整)。

(2)核心代码实现

// 1. 启动滤波器
HAL_DFSDM_FilterRegularStart(&hdfsdm1_filter0);

// 2. 手动写入数据到通道输入寄存器(示例:写入0x1200)
hdfsdm1_channel0.Instance->CHDATINR = 0x1200;

// 3. 等待滤波完成,读取结果(FLTRDATAR为24位结果,右移8位取有效数据)
if ((hdfsdm1_filter0.Instance->FLTISR & 0x02) == 0x02) {
  uint32_t Out_Value0_U24bit = (hdfsdm1_filter0.Instance->FLTRDATAR) >> 8;
}

2.2 场景 2:数据来自内部 ADC 模块(ADC-DFSDM 联动)

适用于 ADC 采样后需进一步滤波的场景,需注意 STM32H723 仅支持 ADC1/ADC2 与 DFSDM 联动(对应 DFSDM 通道 0/1),配置步骤如下:

(1)CubeMx 关键配置

  1. DFSDM 配置:Channel 1 设为并行输入,「Multiplexer」设为「Internal_CH1」(对应 ADC2);
  2. ADC 配置:ADC2 设为「DFSDM Mode」,指定采样通道(示例:ADC2_INP18),复用 DAC1_OUT1 用于数据输入测试;
  3. 滤波器配置:Filter 1 绑定 Channel 1,启用连续模式,配置滤波参数。

(2)核心代码实现

// 1. 启动DFSDM滤波器1
HAL_DFSDM_FilterRegularStart(&hdfsdm1_filter1);

// 2. 配置DAC输出测试数据(动态调整输入)
HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_L, DAC_VALUE);
HAL_DAC_Start(&hdac1, DAC_CHANNEL_1);

// 3. 启动ADC2转换,数据自动传入DFSDM Channel 1
HAL_ADC_Start(&hadc2);

// 4. 读取滤波结果
if ((hdfsdm1_filter1.Instance->FLTISR & 0x02) == 0x02) {
  uint32_t Out_Value1_U24bit = (hdfsdm1_filter1.Instance->FLTRDATAR) >> 8;
}

2.3 并行模式关键注意事项

  • 通道 - 滤波器映射:8 个通道可灵活绑定 4 个滤波器,支持 1 个通道对应多个滤波器(实现多组滤波参数处理);
  • 数据打包模式:来自 ADC 的数据无需配置 DATPACK 参数(参考手册明确该参数无效);
  • 误区规避:参考手册描述 “ADC8 填充 DFSDM_CHDATIN7R” 易误导,实际 STM32H723 仅 ADC1/2 支持联动,对应 DFSDM 通道 0/1。

3. 串行输入模式:外部设备数据接入(主流场景)

串行模式是 DFSDM 的核心应用场景,支持 SPI、曼彻斯特协议及 PDM 信号,适用于外部 ΣΔ 调制器、PDM 麦克风等设备,以下以 SPI 模式为例说明配置流程。

3.1 CubeMx 关键配置

  1. 模式选择:目标通道(示例:Channel 4)设为「PDM/SPI input from ch4 and external clock」;
  2. 串行参数:选择协议类型(示例:SPI with rising edge)、偏移量、位移位等;
  3. 滤波器配置:Filter 2 绑定 Channel 4,设为注入模式,外部触发源选择 TIM4_TRGO(上升沿触发);
  4. 触发配置:TIM4 设为内部时钟,配置触发频率,TRGO 事件设为更新事件。

3.2 核心代码实现

// 1. 启动DFSDM滤波器2(注入模式)
HAL_DFSDM_FilterInjectedStart(&hdfsdm1_filter2);

// 2. 启动TIM4,提供触发信号
HAL_TIM_Base_Start(&htim4);

// 3. 外部信号接入:将ΣΔ调制器/PDM麦克风的CLK/DATA接入DFSDM_CKIN4/DFSDM_DATIN4
// (测试场景:可用IO翻转或SPI时钟模拟外部时钟信号)

// 4. 等待滤波完成,读取注入组结果
while ((hdfsdm1_filter2.Instance->FLTISR & 0x01) == 0x00);
uint32_t Out_Value2_24bit = (hdfsdm1_filter2.Instance->FLTIJDATAR) >> 8;

3.3 串行模式关键注意事项

  • 信号要求:需接入两路信号(CLK 时钟 + DATA 数据),时钟沿需与配置的采样沿一致;
  • 协议兼容性:支持大多数 ΣΔ 调制器和 PDM 麦克风,可通过配置采样沿、过采样率适配不同设备;
  • 测试技巧:无外部设备时,可通过 GPIO 翻转模拟时钟信号,验证滤波器是否正常工作。

4. 常见误区与避坑指南

  1. 通道 - ADC 对应误区:参考手册 “ADCy+1 对应 DFSDM 通道 y” 仅为通用描述,STM32H723 实际仅 ADC1/2 支持联动,对应 DFSDM 通道 0/1,其余通道无 ADC 并行输入;
  2. 滤波器资源限制:DFSDM 仅 4 个滤波器,需合理分配通道映射,避免资源冲突;
  3. 数据读取时机:需通过 FLTISR 寄存器的标志位(规则组 0x02、注入组 0x01)判断滤波完成,避免读取无效数据;
  4. 并行模式数据来源:内部寄存器输入适用于测试,ADC 输入适用于实际采样场景,不可混淆配置。

DFSDM 的并行模式聚焦内部数据处理,配置简单灵活;串行模式面向外部设备,是实际应用的主流选择。核心配置逻辑可总结为 “明确数据来源→绑定通道 - 滤波器→配置触发 / 滤波参数→读取结果”,关键是避开 ADC 通道对应、滤波器资源等误区。

相关推荐