LAT1099
Local Application Tips
LAT1099 Rev 1.0 Jan. 2022
DFSDM 时钟配置问题
关键字:DFSDM 时钟
引言
DFSDM 全称为 Digital filter for sigma delta modulators。顾名思义,其作用主要是对
外部 Σ∆调制的数字信号进行滤波STM32L462xx 系列支持最多 4 个外部串行通道,2
数字滤波器,最大可达 24bit ADC 分辨率。并且支持 SPI 接口和曼切斯特编 1-wire
接口。
1. 问题描述
客户在使用 STM32L462xx DFSDM 连接数字麦克风,将数字麦克风 PDM 信号转
化为 PCM 信号,并采集数据。使用的参数为 16KHz 采样,2M 左右的时钟驱动数字麦克
风,能够正常读取麦克风数据。了解到他们所使用的数字麦克风可以使用 768K 时钟驱
动,从而达到更低功耗的状态,但是客户无法配置出合适的时钟,并且勉强配置到了
768K 附近,通过 DFSDM 采集到的数据也是混乱的,完全无法解析。
2. 问题分析与定位
在了解到基本需求后,我们需要对 DFSDM 的时钟有一定了解。从 RM0394 参考手册
中可以找到如下内容:
1. DFSDM 时钟
DFSDM 可以提供一个时钟用于驱动外部 sigma delta 调制器,并且时钟来源可以是
DFSDM 时钟或者 Audio 时钟,其中 Audio 时钟就是 SAI1 的时钟。
在处理和时钟相关的配置问题时,强烈建议使用 CubeMX 的时钟配置界面进行配置
我们先来看下客户用于驱动外部数字麦克风的时钟配置。
LAT1099
LAT1099 - Rev 1.0 page 2/6
2. 时钟树
从图中可以看出,DFSDM 的时钟为 36MHz,来 PCLK2SAI1 的时钟约为 34.29MHz
来自 PLLSAI1P
hdfsdm1_channel1.Init.OutputClock.Activation = ENABLE;
hdfsdm1_channel1.Init.OutputClock.Selection = DFSDM_CHANNEL_OUTPUT_CLOCK_AUDIO;
hdfsdm1_channel1.Init.OutputClock.Divider = 17;
这是关于 DFSDM 输出时钟的代码片段,可以看到使用了 AUDIO 的时钟作为输出,并且
使用 17 分频,那么最终驱动数字麦克风的时钟为 34.29/172.02MHz
再来看看滤波器部分参数的设计:
hdfsdm1_filter0.Init.FilterParam.SincOrder = DFSDM_FILTER_SINC4_ORDER;
hdfsdm1_filter0.Init.FilterParam.Oversampling = 128;
hdfsdm1_filter0.Init.FilterParam.IntOversampling = 1;
其中,使用了 4 SINC 滤波,过采样参数为 128,那么 2.02MHz/12816KHz。也就是
说这种配置参数下,可以接近 16KHz 的采样率来对音频数据采样。
客户想要将麦克风驱动时钟重新配置为 768K,但只考虑修改 Divider Oversampling
数是配置不出来的。