在STM32F4上实现麦克风拾音功能,需要结合硬件接口配置、音频信号采集与预处理,并根据需求选择模拟或数字麦克风方案。
一、硬件接口选择 STM32F413_Discovery
1. 模拟麦克风(MEMS麦克风) 接口:通过ADC(模拟数字转换器)采集麦克风输出的模拟信号。 连接方式: 麦克风输出(Vout)接STM32的ADC输入引脚(如PA0)。 麦克风需外部供电(VDD)和接地(GND)。 特点: 成本低,但需额外ADC采样电路。 适合低频、低采样率场景(如8kHz语音采集)。 2. 数字麦克风(PDM/I2S麦克风) 接口: PDM麦克风:通过GPIO+DMA采集脉冲密度调制信号。 I2S麦克风:直接通过I2S接口传输数字音频数据。 连接方式: PDM:DATA引脚接STM32的GPIO(如PA5),CLK引脚接定时器输出(如TIM2_CH1)。 I2S:WS(字选择)、SCK(时钟)、SD(数据)引脚分别接STM32的I2S外设引脚(如PB12、PB13、PB15)。 特点: 抗干扰能力强,支持更高采样率(如44.1kHz)。 适合需要高质量音频的场景(如语音识别、声源定位)。 二、软件实现步骤 1. 模拟麦克风(ADC采集) 步骤: 1. 初始化ADC: 配置ADC时钟、分辨率(如12位)、采样时间。 启用DMA传输,避免CPU频繁中断。 2. 配置GPIO: 将ADC输入引脚设为模拟模式。 3. 启动ADC: 启动连续转换模式,数据通过DMA自动存储到内存。 4. 数据预处理: 对采集到的原始数据进行滤波(如低通滤波去除高频噪声)。 可选:添加增益控制(通过PGA或软件放大)。 代码示例(HAL库): ADC_HandleTypeDef hadc1;
DMA_HandleTypeDef hdma_adc1;
uint16_t adc_buffer[256]; // DMA存储缓冲区
void ADC_Init(void) {
hadc1.Instance = ADC1;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
HAL_ADC_Init(&hadc1);
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel = ADC_CHANNEL_0; // PA0
sConfig.Rank = 1;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
// 配置DMA
hdma_adc1.Instance = DMA2_Stream0;
hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
HAL_DMA_Init(&hdma_adc1);
__HAL_LINKDMA(&hadc1, DMA_Handle, hdma_adc1);
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, 256);
}
2. 数字麦克风(PDM采集) 步骤: 1. 配置定时器: 生成PDM时钟(如1MHz~3MHz)。 示例:TIM2_CH1输出PWM作为PDM_CLK。 2. 配置GPIO: PDM_DATA引脚设为输入浮空模式。 3. 配置DMA: 使用GPIO输入中断或定时器触发DMA,采集PDM数据。 4. PDM转PCM: 使用CIC滤波器或第三方库(如STM32Cube的PDM2PCM中间件)将PDM数据解码为PCM。 代码示例(PDM时钟生成): void PDM_Clock_Init(void) {
TIM_HandleTypeDef htim2;
htim2.Instance = TIM2;
htim2.Init.Prescaler = 83; // 假设APB1时钟为84MHz,分频后1MHz
htim2.Init.Period = 1; // PWM频率 = 84MHz / (83+1) / (1+1) = 500kHz(需调整)
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
HAL_TIM_PWM_Init(&htim2);
TIM_OC_InitTypeDef sConfigOC = {0};
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 500; // 占空比50%
HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
}
3. 数字麦克风(I2S采集) 步骤: 1. 初始化I2S外设: 配置I2S模式(主/从)、数据格式(16位/24位)、时钟极性。 2. 配置GPIO: WS、SCK、SD引脚分别接I2S外设。 3. 启用DMA: 使用I2S的DMA通道自动传输音频数据。 4. 数据校验: 检查I2S状态寄存器,确保无溢出或错误。 代码示例(HAL库): 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();
}
}
|