- I2S_HandleTypeDef hi2s3;
- DMA_HandleTypeDef hdma_spi3_tx; // I2S3使用SPI3的DMA通道
- uint16_t i2s_buffer[512]; // 存储缓冲区
- void I2S_Init(void) {
- hi2s3.Instance = SPI3;
- hi2s3.Init.Mode = I2S_MODE_MASTER_RX;
- hi2s3.Init.Standard = I2S_STANDARD_PHILIPS;
- hi2s3.Init.DataFormat = I2S_DATAFORMAT_16B;
- hi2s3.Init.MCLKOutput = I2S_MCLKOUTPUT_DISABLE;
- hi2s3.Init.AudioFreq = I2S_AUDIOFREQ_16K;
- HAL_I2S_Init(&hi2s3);
- // 配置DMA
- hdma_spi3_tx.Instance = DMA1_Stream0;
- hdma_spi3_tx.Init.Direction = DMA_PERIPH_TO_MEMORY;
- HAL_DMA_Init(&hdma_spi3_tx);
- __HAL_LINKDMA(&hi2s3, hdmarx, hdma_spi3_tx);
- HAL_I2S_Receive_DMA(&hi2s3, (uint16_t*)i2s_buffer, 512);
- }
三、注意事项
1. 采样率与分辨率:
语音识别通常需要16kHz采样率、16位分辨率。
模拟麦克风需确保ADC采样率足够(如≥32kHz)。
2. 抗干扰设计:
模拟麦克风信号线需远离高频干扰源(如时钟线)。
数字麦克风时钟线需匹配阻抗(如50Ω)。
3. 功耗优化:
模拟麦克风可通过软件控制ADC休眠。
数字麦克风可在空闲时关闭I2S/PDM时钟。
4. 调试工具:
使用逻辑分析仪检查PDM/I2S时序。
通过串口打印ADC/I2S数据,用MATLAB或Python验证音频质量。
四、推荐方案对比
五、扩展功能
1. 声源定位:
使用麦克风阵列(如双麦)计算时延差(TDOA),结合三角定位算法。
2. 语音唤醒:
集成轻量级关键词检测算法(如Porcupine)。
3. 噪声抑制:
实现简单的谱减法或使用STM32的DSP库。
六、开发板上麦克风:
MP34DT01是意法半导体(ST)推出的一款超小型、低功耗、全方位数字MEMS麦克风,作为首款拾音孔顶置数字式MEMS麦克风,意法半导体MP34DT01远胜于其它竞争产品,声学参数优于现有拾音孔下置麦克风,完全满足新型消 费电子设备语音控制软件和电子辅助应用软件的需求,能够在不增加主处理器负荷的条件下提升语音识别系统的智能性。远胜于同类产品的信噪比将该产品的适用范 围扩展到普通消费电子产品以外的应用领域,如要求大动态范围的测音器。
核心特性
1. 高性能声学参数
- 信噪比(SNR):63dB,优于同类产品,可有效捕捉清晰音频信号。
- 灵敏度:-26dBFS(±3dB @ 94dB SPL),全向灵敏度设计,确保360°声音均匀拾取。 - 频响范围:20Hz–20kHz,覆盖人耳可听范围,适合高保真音频采集。
- 声学过载点(AOP):120dBSPL,可承受高强度声压而不失真,适用于嘈杂环境。
2. 紧凑设计与耐用性
- 封装尺寸:3×4×1mm(HCLGA封装),超小体积适合空间受限的设备。
- 工作温度范围:-40°C至+85°C,适应极端环境。
- 抗干扰能力:内置EMI屏蔽,减少电磁干扰对音频质量的影响。
3. 低功耗与易用性
- 工作电压:1.64V–3.6V(典型值1.8V),电流仅600µA,延长电池寿命。
- 输出格式:PDM(脉冲密度调制),兼容主流音频处理芯片。
- 接口类型:顶部端口设计,简化PCB布局,支持SMD表面贴装工艺。
应用场景
1. 消费电子
- 智能手机/平板电脑:作为主麦克风或降噪麦克风,提升通话和录音质量。
- 便携式媒体设备:如MP3播放器、耳机,实现语音交互功能。
2. 智能语音设备
- 智能音箱/语音助手:支持远场语音识别,提升唤醒词检测准确率。
- 可穿戴设备:如智能手表、AR/VR设备,实现紧凑空间内的语音控制。
3. 安防与工业
- 监控摄像头/防盗系统:通过高灵敏度拾音实现环境声音监测。
- 工业设备:用于机器状态监测或远程语音指令输入。
技术优势
- 集成度高:内置CMOS接口电路,无需外部ADC,简化设计。
- 高一致性:灵敏度一致性优异,适合多麦克风阵列应用(如波束成形)。
- 环保合规:符合RoHS和“绿色”标准,满足环保要求。
与其他型号对比
- MP34DB01:侧重高保真音频带宽(20Hz–20kHz),适合音乐录制;而MP34DT01更强调全方位灵敏度和低功耗,适合语音交互场景。
- 传统ECM麦克风:MP34DT01体积更小、抗干扰能力更强,且支持自动化生产。
软件算法
信号处理算法
-波束成形(Beamforming):通过延迟-求和(Delay-and-Sum)或自适应波束成形算法,增强特定方向的声音,同时抑制其他方向的噪声。虽然全向 拾音不需要波束成形,但算法可用于优化整体信噪比。
-噪声抑制:采用多麦克风降噪算法(如NS、AEC),结合空间滤波技术,减少环境噪声和回声。
--声源定位:通过到达时间差(TDOA)或相位差计算声源方向,适用于需要定位功能的场景。
MP34DT01通过PDM接口与STM32通信,需连接电源、地线、时钟(CLK)和数据输出(DOUT)引脚。例如,MP34DT01的CLK引脚接STM32的定时器输出(如TIM3_CH1),DOUT引脚接GPIO输入(如PA0),并启用内部上拉电阻。PDM信号需通过CIC滤波器或专用库(如STM32CubeMX的PDM2PCM中间件)转换为PCM格式。例如,使用STM32CubeMX配置DFSDM外设,设置时钟频率(如3.072MHz)和采样率(如16kHz),并通过HAL库函数HAL_DFSDM_FilterRegularStart_DMA启动DMA传输。
- // 初始化DFSDM外设
- DFSDM_Filter_HandleTypeDef hdfsdm1_filter0;
- DFSDM_Channel_HandleTypeDef hdfsdm1_channel0;
- void MX_DFSDM1_Init(void) {
- hdfsdm1_filter0.Instance = DFSDM1_Filter0;
- hdfsdm1_filter0.Init.RegularParam.Trigger = DFSDM_FILTER_SW_TRIGGER;
- hdfsdm1_filter0.Init.RegularParam.FastMode = ENABLE;
- hdfsdm1_filter0.Init.RegularParam.DmaMode = ENABLE;
- hdfsdm1_filter0.Init.FilterParam.SincOrder = DFSDM_FILTER_SINC3_ORDER;
- hdfsdm1_filter0.Init.FilterParam.Oversampling = 64;
- HAL_DFSDM_FilterInit(&hdfsdm1_filter0);
- hdfsdm1_channel0.Instance = DFSDM1_Channel0;
- hdfsdm1_channel0.Init.OutputClock.Activation = ENABLE;
- hdfsdm1_channel0.Init.OutputClock.Selection = DFSDM_CHANNEL_OUTPUT_CLOCK_SYSTEM;
- hdfsdm1_channel0.Init.OutputClock.Divider = 2;
- hdfsdm1_channel0.Init.Input.Multiplexer = DFSDM_CHANNEL_EXTERNAL_INPUTS;
- hdfsdm1_channel0.Init.Input.DataPacking = DFSDM_CHANNEL_STANDARD_MODE;
- hdfsdm1_channel0.Init.Input.Pins = DFSDM_CHANNEL_SAME_CHANNEL_PINS;
- hdfsdm1_channel0.Init.SerialInterface.Type = DFSDM_CHANNEL_SPI_RISING;
- hdfsdm1_channel0.Init.SerialInterface.SpiClock = DFSDM_CHANNEL_SPI_CLOCK_INTERNAL;
- hdfsdm1_channel0.Init.Awd.FilterOrder = DFSDM_CHANNEL_FASTSINC_ORDER;
- hdfsdm1_channel0.Init.Awd.Oversampling = 1;
- hdfsdm1_channel0.Init.Offset = 0;
- hdfsdm1_channel0.Init.RightBitShift = 0x00;
- HAL_DFSDM_ChannelInit(&hdfsdm1_channel0);
- }
- */
- static void DFSDM_Init(void)
- {
- /* Initialize DFSDM1 channel 1 */
- __HAL_DFSDM_CHANNEL_RESET_HANDLE_STATE(&Dfsdm1Channel1Handle);
- Dfsdm1Channel1Handle.Instance = DFSDM1_DATIN1_INSTANCE;
- Dfsdm1Channel1Handle.Init.OutputClock.Activation = ENABLE;
- Dfsdm1Channel1Handle.Init.OutputClock.Selection = DFSDM_CHANNEL_OUTPUT_CLOCK_AUDIO;
- Dfsdm1Channel1Handle.Init.OutputClock.Divider = 24;
- Dfsdm1Channel1Handle.Init.Input.Multiplexer = DFSDM_CHANNEL_EXTERNAL_INPUTS;
- Dfsdm1Channel1Handle.Init.Input.DataPacking = DFSDM_CHANNEL_STANDARD_MODE;
- Dfsdm1Channel1Handle.Init.Input.Pins = DFSDM_CHANNEL_SAME_CHANNEL_PINS;
- Dfsdm1Channel1Handle.Init.SerialInterface.Type = DFSDM_CHANNEL_SPI_RISING;
- #if defined(USE_CHANNEL_DELAY)
- Dfsdm1Channel1Handle.Init.SerialInterface.SpiClock = DFSDM_CHANNEL_SPI_CLOCK_EXTERNAL;
- #else
- Dfsdm1Channel1Handle.Init.SerialInterface.SpiClock = DFSDM_CHANNEL_SPI_CLOCK_INTERNAL;
- #endif
- Dfsdm1Channel1Handle.Init.Awd.FilterOrder = DFSDM_CHANNEL_SINC1_ORDER;
- Dfsdm1Channel1Handle.Init.Awd.Oversampling = 10;
- Dfsdm1Channel1Handle.Init.Offset = 0;
- Dfsdm1Channel1Handle.Init.RightBitShift = 2;
- if(HAL_OK != HAL_DFSDM_ChannelInit(&Dfsdm1Channel1Handle))
- {
- Error_Handler();
- }
-
- /* Initialize DFSDM2 channel 1 */
- __HAL_DFSDM_CHANNEL_RESET_HANDLE_STATE(&Dfsdm2Channel1Handle);
- Dfsdm2Channel1Handle.Instance = DFSDM2_DATIN1_INSTANCE;
- Dfsdm2Channel1Handle.Init.OutputClock.Activation = ENABLE;
- Dfsdm2Channel1Handle.Init.OutputClock.Selection = DFSDM_CHANNEL_OUTPUT_CLOCK_AUDIO;
- Dfsdm2Channel1Handle.Init.OutputClock.Divider = 24;
- Dfsdm2Channel1Handle.Init.Input.Multiplexer = DFSDM_CHANNEL_EXTERNAL_INPUTS;
- Dfsdm2Channel1Handle.Init.Input.DataPacking = DFSDM_CHANNEL_STANDARD_MODE;
- Dfsdm2Channel1Handle.Init.Input.Pins = DFSDM_CHANNEL_SAME_CHANNEL_PINS;
- Dfsdm2Channel1Handle.Init.SerialInterface.Type = DFSDM_CHANNEL_SPI_RISING;
- #if defined(USE_CHANNEL_DELAY)
- Dfsdm2Channel1Handle.Init.SerialInterface.SpiClock = DFSDM_CHANNEL_SPI_CLOCK_EXTERNAL;
- #else
- Dfsdm2Channel1Handle.Init.SerialInterface.SpiClock = DFSDM_CHANNEL_SPI_CLOCK_INTERNAL;
- #endif
- Dfsdm2Channel1Handle.Init.Awd.FilterOrder = DFSDM_CHANNEL_SINC1_ORDER;
- Dfsdm2Channel1Handle.Init.Awd.Oversampling = 10;
- Dfsdm2Channel1Handle.Init.Offset = 0;
- Dfsdm2Channel1Handle.Init.RightBitShift = 2;
- if(HAL_OK != HAL_DFSDM_ChannelInit(&Dfsdm2Channel1Handle))
- {
- Error_Handler();
- }
- /* Initialize DFSDM2 channel 0 */
- __HAL_DFSDM_CHANNEL_RESET_HANDLE_STATE(&Dfsdm2Channel0Handle);
- Dfsdm2Channel0Handle.Instance = DFSDM2_DATIN0_INSTANCE;
- Dfsdm2Channel0Handle.Init.OutputClock.Activation = ENABLE;
- Dfsdm2Channel0Handle.Init.OutputClock.Selection = DFSDM_CHANNEL_OUTPUT_CLOCK_AUDIO;
- Dfsdm2Channel0Handle.Init.OutputClock.Divider = 24;
- Dfsdm2Channel0Handle.Init.Input.Multiplexer = DFSDM_CHANNEL_EXTERNAL_INPUTS;
- Dfsdm2Channel0Handle.Init.Input.DataPacking = DFSDM_CHANNEL_STANDARD_MODE;
- #if defined(USE_CHANNEL_DELAY)
- Dfsdm2Channel0Handle.Init.Input.Pins = DFSDM_CHANNEL_SAME_CHANNEL_PINS;
- #else
- Dfsdm2Channel0Handle.Init.Input.Pins = DFSDM_CHANNEL_FOLLOWING_CHANNEL_PINS;
- #endif
- Dfsdm2Channel0Handle.Init.SerialInterface.Type = DFSDM_CHANNEL_SPI_FALLING;
-
- #if defined(USE_CHANNEL_DELAY)
- Dfsdm2Channel0Handle.Init.SerialInterface.SpiClock = DFSDM_CHANNEL_SPI_CLOCK_EXTERNAL;
- #else
- Dfsdm2Channel0Handle.Init.SerialInterface.SpiClock = DFSDM_CHANNEL_SPI_CLOCK_INTERNAL;
- #endif
- Dfsdm2Channel0Handle.Init.Awd.FilterOrder = DFSDM_CHANNEL_SINC1_ORDER;
- Dfsdm2Channel0Handle.Init.Awd.Oversampling = 10;
- Dfsdm2Channel0Handle.Init.Offset = 0;
- Dfsdm2Channel0Handle.Init.RightBitShift = 2;
- if(HAL_OK != HAL_DFSDM_ChannelInit(&Dfsdm2Channel0Handle))
- {
- Error_Handler();
- }
-
- /* Initialize DFSDM2 channel 7 */
- __HAL_DFSDM_CHANNEL_RESET_HANDLE_STATE(&Dfsdm2Channel7Handle);
- Dfsdm2Channel7Handle.Instance = DFSDM2_DATIN7_INSTANCE;
- Dfsdm2Channel7Handle.Init.OutputClock.Activation = ENABLE;
- Dfsdm2Channel7Handle.Init.OutputClock.Selection = DFSDM_CHANNEL_OUTPUT_CLOCK_AUDIO;
- Dfsdm2Channel7Handle.Init.OutputClock.Divider = 24;
- Dfsdm2Channel7Handle.Init.Input.Multiplexer = DFSDM_CHANNEL_EXTERNAL_INPUTS;
- Dfsdm2Channel7Handle.Init.Input.DataPacking = DFSDM_CHANNEL_STANDARD_MODE;
- Dfsdm2Channel7Handle.Init.Input.Pins = DFSDM_CHANNEL_SAME_CHANNEL_PINS;
- Dfsdm2Channel7Handle.Init.SerialInterface.Type = DFSDM_CHANNEL_SPI_FALLING;
- #if defined(USE_CHANNEL_DELAY)
- Dfsdm2Channel7Handle.Init.SerialInterface.SpiClock = DFSDM_CHANNEL_SPI_CLOCK_EXTERNAL;
- #else
- Dfsdm2Channel7Handle.Init.SerialInterface.SpiClock = DFSDM_CHANNEL_SPI_CLOCK_INTERNAL;
- #endif
- Dfsdm2Channel7Handle.Init.Awd.FilterOrder = DFSDM_CHANNEL_SINC1_ORDER;
- Dfsdm2Channel7Handle.Init.Awd.Oversampling = 10;
- Dfsdm2Channel7Handle.Init.Offset = 0;
- Dfsdm2Channel7Handle.Init.RightBitShift = 2;
- if(HAL_OK != HAL_DFSDM_ChannelInit(&Dfsdm2Channel7Handle))
- {
- Error_Handler();
- }
-
- /* Initialize DFSDM2 channel 6 */
- __HAL_DFSDM_CHANNEL_RESET_HANDLE_STATE(&Dfsdm2Channel6Handle);
- Dfsdm2Channel6Handle.Instance = DFSDM2_DATIN6_INSTANCE;
- Dfsdm2Channel6Handle.Init.OutputClock.Activation = ENABLE;
- Dfsdm2Channel6Handle.Init.OutputClock.Selection = DFSDM_CHANNEL_OUTPUT_CLOCK_AUDIO;
- Dfsdm2Channel6Handle.Init.OutputClock.Divider = 24;
- Dfsdm2Channel6Handle.Init.Input.Multiplexer = DFSDM_CHANNEL_EXTERNAL_INPUTS;
- Dfsdm2Channel6Handle.Init.Input.DataPacking = DFSDM_CHANNEL_STANDARD_MODE;
- #if defined(USE_CHANNEL_DELAY)
- Dfsdm2Channel6Handle.Init.Input.Pins = DFSDM_CHANNEL_SAME_CHANNEL_PINS;
- #else
- Dfsdm2Channel6Handle.Init.Input.Pins = DFSDM_CHANNEL_FOLLOWING_CHANNEL_PINS;
- #endif
- Dfsdm2Channel0Handle.Init.SerialInterface.Type = DFSDM_CHANNEL_SPI_RISING;
- #if defined(USE_CHANNEL_DELAY)
- Dfsdm2Channel6Handle.Init.SerialInterface.SpiClock = DFSDM_CHANNEL_SPI_CLOCK_EXTERNAL;
- #else
- Dfsdm2Channel6Handle.Init.SerialInterface.SpiClock = DFSDM_CHANNEL_SPI_CLOCK_INTERNAL;
- #endif
- Dfsdm2Channel6Handle.Init.Awd.FilterOrder = DFSDM_CHANNEL_SINC1_ORDER;
- Dfsdm2Channel6Handle.Init.Awd.Oversampling = 10;
- Dfsdm2Channel6Handle.Init.Offset = 0;
- Dfsdm2Channel6Handle.Init.RightBitShift = 2;
- if(HAL_OK != HAL_DFSDM_ChannelInit(&Dfsdm2Channel6Handle))
- {
- Error_Handler();
- }
-
- /* Initialize DFSDM1 filter 0 */
- __HAL_DFSDM_FILTER_RESET_HANDLE_STATE(&Dfsdm1Filter1Handle);
- Dfsdm1Filter1Handle.Instance = DFSDM1_FILTER0;
- Dfsdm1Filter1Handle.Init.RegularParam.Trigger = DFSDM_FILTER_SW_TRIGGER;
- Dfsdm1Filter1Handle.Init.RegularParam.FastMode = ENABLE;
- Dfsdm1Filter1Handle.Init.RegularParam.DmaMode = ENABLE;
- Dfsdm1Filter1Handle.Init.InjectedParam.Trigger = DFSDM_FILTER_SW_TRIGGER;
- Dfsdm1Filter1Handle.Init.InjectedParam.ScanMode = DISABLE;
- Dfsdm1Filter1Handle.Init.InjectedParam.DmaMode = DISABLE;
- Dfsdm1Filter1Handle.Init.InjectedParam.ExtTrigger = DFSDM_FILTER_EXT_TRIG_TIM8_TRGO;
- Dfsdm1Filter1Handle.Init.InjectedParam.ExtTriggerEdge = DFSDM_FILTER_EXT_TRIG_BOTH_EDGES;
- Dfsdm1Filter1Handle.Init.FilterParam.SincOrder = DFSDM_FILTER_SINC3_ORDER;
- Dfsdm1Filter1Handle.Init.FilterParam.Oversampling = 128;
- Dfsdm1Filter1Handle.Init.FilterParam.IntOversampling = 1;
- if(HAL_OK != HAL_DFSDM_FilterInit(&Dfsdm1Filter1Handle))
- {
- Error_Handler();
- }
-
- /* Initialize DFSDM2 filter 1 */
- __HAL_DFSDM_FILTER_RESET_HANDLE_STATE(&Dfsdm2Filter1Handle);
- Dfsdm2Filter1Handle.Instance = DFSDM2_FILTER0;
- Dfsdm2Filter1Handle.Init.RegularParam.Trigger = DFSDM_FILTER_SW_TRIGGER;
- Dfsdm2Filter1Handle.Init.RegularParam.FastMode = ENABLE;
- Dfsdm2Filter1Handle.Init.RegularParam.DmaMode = ENABLE;
- Dfsdm2Filter1Handle.Init.InjectedParam.Trigger = DFSDM_FILTER_SW_TRIGGER;
- Dfsdm2Filter1Handle.Init.InjectedParam.ScanMode = DISABLE;
- Dfsdm2Filter1Handle.Init.InjectedParam.DmaMode = DISABLE;
- Dfsdm2Filter1Handle.Init.InjectedParam.ExtTrigger = DFSDM_FILTER_EXT_TRIG_TIM8_TRGO;
- Dfsdm2Filter1Handle.Init.InjectedParam.ExtTriggerEdge = DFSDM_FILTER_EXT_TRIG_BOTH_EDGES;
- Dfsdm2Filter1Handle.Init.FilterParam.SincOrder = DFSDM_FILTER_SINC3_ORDER;
- Dfsdm2Filter1Handle.Init.FilterParam.Oversampling = 128;
- Dfsdm2Filter1Handle.Init.FilterParam.IntOversampling = 1;
- if(HAL_OK != HAL_DFSDM_FilterInit(&Dfsdm2Filter1Handle))
- {
- Error_Handler();
- }
-
- /* Initialize DFSDM2 filter 2 */
- __HAL_DFSDM_FILTER_RESET_HANDLE_STATE(&Dfsdm2Filter2Handle);
- Dfsdm2Filter2Handle.Instance = DFSDM2_FILTER1;
- Dfsdm2Filter2Handle.Init.RegularParam.Trigger = DFSDM_FILTER_SYNC_TRIGGER;
- Dfsdm2Filter2Handle.Init.RegularParam.FastMode = ENABLE;
- Dfsdm2Filter2Handle.Init.RegularParam.DmaMode = ENABLE;
- Dfsdm2Filter2Handle.Init.InjectedParam.Trigger = DFSDM_FILTER_SW_TRIGGER;
- Dfsdm2Filter2Handle.Init.InjectedParam.ScanMode = DISABLE;
- Dfsdm2Filter2Handle.Init.InjectedParam.DmaMode = DISABLE;
- Dfsdm2Filter2Handle.Init.InjectedParam.ExtTrigger = DFSDM_FILTER_EXT_TRIG_TIM8_TRGO;
- Dfsdm2Filter2Handle.Init.InjectedParam.ExtTriggerEdge = DFSDM_FILTER_EXT_TRIG_BOTH_EDGES;
- Dfsdm2Filter2Handle.Init.FilterParam.SincOrder = DFSDM_FILTER_SINC3_ORDER;
- Dfsdm2Filter2Handle.Init.FilterParam.Oversampling = 128;
- Dfsdm2Filter2Handle.Init.FilterParam.IntOversampling = 1;
- if(HAL_OK != HAL_DFSDM_FilterInit(&Dfsdm2Filter2Handle))
- {
- Error_Handler();
- }
-
- /* Initialize DFSDM2 filter 3 */
- __HAL_DFSDM_FILTER_RESET_HANDLE_STATE(&Dfsdm2Filter3Handle);
- Dfsdm2Filter3Handle.Instance = DFSDM2_FILTER2;
- Dfsdm2Filter3Handle.Init.RegularParam.Trigger = DFSDM_FILTER_SYNC_TRIGGER;
- Dfsdm2Filter3Handle.Init.RegularParam.FastMode = ENABLE;
- Dfsdm2Filter3Handle.Init.RegularParam.DmaMode = ENABLE;
- Dfsdm2Filter3Handle.Init.InjectedParam.Trigger = DFSDM_FILTER_SW_TRIGGER;
- Dfsdm2Filter3Handle.Init.InjectedParam.ScanMode = DISABLE;
- Dfsdm2Filter3Handle.Init.InjectedParam.DmaMode = DISABLE;
- Dfsdm2Filter3Handle.Init.InjectedParam.ExtTrigger = DFSDM_FILTER_EXT_TRIG_TIM8_TRGO;
- Dfsdm2Filter3Handle.Init.InjectedParam.ExtTriggerEdge = DFSDM_FILTER_EXT_TRIG_BOTH_EDGES;
- Dfsdm2Filter3Handle.Init.FilterParam.SincOrder = DFSDM_FILTER_SINC3_ORDER;
- Dfsdm2Filter3Handle.Init.FilterParam.Oversampling = 128;
- Dfsdm2Filter3Handle.Init.FilterParam.IntOversampling = 1;
- if(HAL_OK != HAL_DFSDM_FilterInit(&Dfsdm2Filter3Handle))
- {
- Error_Handler();
- }
-
- /* Initialize DFSDM2 filter 4 */
- __HAL_DFSDM_FILTER_RESET_HANDLE_STATE(&Dfsdm2Filter4Handle);
- Dfsdm2Filter4Handle.Instance = DFSDM2_FILTER3;
- Dfsdm2Filter4Handle.Init.RegularParam.Trigger = DFSDM_FILTER_SYNC_TRIGGER;
- Dfsdm2Filter4Handle.Init.RegularParam.FastMode = ENABLE;
- Dfsdm2Filter4Handle.Init.RegularParam.DmaMode = ENABLE;
- Dfsdm2Filter4Handle.Init.InjectedParam.Trigger = DFSDM_FILTER_SW_TRIGGER;
- Dfsdm2Filter4Handle.Init.InjectedParam.ScanMode = DISABLE;
- Dfsdm2Filter4Handle.Init.InjectedParam.DmaMode = DISABLE;
- Dfsdm2Filter4Handle.Init.InjectedParam.ExtTrigger = DFSDM_FILTER_EXT_TRIG_TIM8_TRGO;
- Dfsdm2Filter4Handle.Init.InjectedParam.ExtTriggerEdge = DFSDM_FILTER_EXT_TRIG_BOTH_EDGES;
- Dfsdm2Filter4Handle.Init.FilterParam.SincOrder = DFSDM_FILTER_SINC3_ORDER;
- Dfsdm2Filter4Handle.Init.FilterParam.Oversampling = 128;
- Dfsdm2Filter4Handle.Init.FilterParam.IntOversampling = 1;
- if(HAL_OK != HAL_DFSDM_FilterInit(&Dfsdm2Filter4Handle))
- {
- Error_Handler();
- }
- /* Configure Regular channel */
- if(HAL_OK != HAL_DFSDM_FilterConfigRegChannel(&Dfsdm1Filter1Handle, DFSDM_DATIN1_CHANNEL, DFSDM_CONTINUOUS_CONV_ON))
- {
- Error_Handler();
- }
- /* Configure Regular channel */
- if(HAL_OK != HAL_DFSDM_FilterConfigRegChannel(&Dfsdm2Filter1Handle, DFSDM_DATIN1_CHANNEL, DFSDM_CONTINUOUS_CONV_ON))
- {
- Error_Handler();
- }
- /* Configure Regular channel */
- if(HAL_OK != HAL_DFSDM_FilterConfigRegChannel(&Dfsdm2Filter2Handle, DFSDM_DATIN0_CHANNEL, DFSDM_CONTINUOUS_CONV_ON))
- {
- Error_Handler();
- }
- /* Configure Regular channel */
- if(HAL_OK != HAL_DFSDM_FilterConfigRegChannel(&Dfsdm2Filter3Handle, DFSDM_DATIN7_CHANNEL, DFSDM_CONTINUOUS_CONV_ON))
- {
- Error_Handler();
- }
- /* Configure Regular channel */
- if(HAL_OK != HAL_DFSDM_FilterConfigRegChannel(&Dfsdm2Filter4Handle, DFSDM_DATIN6_CHANNEL, DFSDM_CONTINUOUS_CONV_ON))
- {
- Error_Handler();
- }
- }