本帖最后由 cruelfox 于 2016-12-25 22:44 编辑
在前面的若干测试(
Nucleo-F413ZH 工程版测评(上): 外观,总线性能,功耗,
Nucleo-F413ZH 工程版测评(中): 浮点计算, 频率计)之后,我来试用下STM32F413上面两个比较新的设备:DFSDM 和 SAI.
DFSDM是为Sigma-Delta解调准备的数字滤波器模块,内部结构做得也挺复杂的,在这里我能想到的唯一应用就是数字麦克风了。数字麦克风也许大家不熟悉,其实它就在身边:手机里面、笔记本电脑里面、平板电脑里面用的麦克风很可能就是它。在STM32F7-disco开发板上面就配备了数字麦克风,细心一点就不难观察到。
上面照片中的这颗数字麦克风是联想笔记本电脑里面的,在一块麦克风和指示灯组件小板上。单买这种麦克风不好买,但taobao买各种排线模组配件啥的就有了,玩玩也不贵,或者拆淘汰的电子设备上的。数字麦克风是1-bit编码输出,实际上就是Sigma-Delta调制过的音频信号。除了电源、地之外,主要就是Clock和Data两个信号了,Clock是控制器给麦克风的,一般按64倍的采样频率。还有一个特别点是数字麦克风可以两只共用一条Data线,分别把数据在Clock的上升沿和下降沿锁存,所以麦克风还有一个引脚用来配置是用哪个沿发送数据。
如STM32F413手册上的麦克风连接例子图示
STM32F413ZH上有两个DFSDM部件,分别有2个和4个数字滤波器,所以最多可以处理6路麦克风信号,还带有延迟补偿,可以实现麦克风阵列,蛮强大的。不过我这个小板子上就两只麦克风,暂时就用一只接收音频看看吧。
DFSDM主要的部分是两个:串行接收模块(Channel),数字滤波器模块(Filter)。还有其它功能比如watchdog, 各种比较器, 还可以从APB上读数据作为滤波器输入,等等。我为了实验数字麦克风,就不必要的不管了。整到最后,发现要采集数字麦克风音频其实配置少量寄存器就是了:
(1) APB使能DFSDM1硬件,GPIO把 DFSDM1_CKOUT (我用PC2),DFSDM1_DATIN0 (我用PB1)引脚设好
(2) 把DFSDM1用的clock选好,这个clock不是APB接口的时钟
(3) 配置 CH0CFGR1 寄存器,开启Channel0功能,设定输入模式,以及输出时钟分频:
DFSDM1_Channel0->CHCFGR1 = DFSDM_CHCFGR1_DFSDMEN|DFSDM_CHCFGR1_CHEN|15<<16|DFSDM_CHCFGR1_CKOUTSRC|DFSDM_CHCFGR1_SPICKSEL_0;
(4) 配置 FLT0FCR,设置sinc滤波器阶数,降采样率:我用5阶滤波器, 64倍降采样
DFSDM1_Filter0->FLTFCR = 5<<29|63<<16;
(5) 配置 FLT0CR1,设置工作模式,数据来源,开启并启动转换:
DFSDM1_Filter0->FLTCR1 = DFSDM_FLTCR1_FAST|DFSDM_FLTCR1_RCONT|DFSDM_FLTCR1_DFEN;
DFSDM1_Filter0->FLTCR1 |= DFSDM_FLTCR1_RSWSTART;
实验现场:从小板上的Testpad飞线出来,接插针,连到Nucleo
示波器采到的数字麦克风Clock和Data波形:
用示波器很容易确认麦克风在工作,但还要在 FLT0ISR 寄存器中确认 REOCF 位变为1,才有转换后的数据可读。24-bit的转换值在 FLT0RDATAR 寄存器的高24位。我的时钟设定结果大约是 44100 的音频采样率,麦克风的时钟是这个的64倍。因为这里只是确认能读到数据,并没有任何数据处理比如声音检测算法啊,也暂时没做啥实际用途
依靠STM32F4的强大计算能力,只要不是依靠大量数据样本的简单的音频应用还是可能的。