in AZ3166/src/libraries/AudioV2/src/stm32412g_discovery_audio.c [763:843]
uint8_t BSP_AUDIO_IN_ConfigMicDefault(uint32_t InputDevice)
{
uint32_t i = 0, mic_init[DFSDM_MIC_NUMBER] = {0};
uint32_t filter_ch = 0, mic_num = 0;
DFSDM_Filter_TypeDef *FilterInstance[DFSDM_MIC_NUMBER] = {AUDIO_DFSDMx_MIC1_FILTER, AUDIO_DFSDMx_MIC2_FILTER};
DFSDM_Channel_TypeDef *ChannelInstance[DFSDM_MIC_NUMBER] = {AUDIO_DFSDMx_MIC1_CHANNEL,
AUDIO_DFSDMx_MIC2_CHANNEL};
uint32_t DigitalMicPins[DFSDM_MIC_NUMBER] = {DFSDM_CHANNEL_SAME_CHANNEL_PINS,
DFSDM_CHANNEL_FOLLOWING_CHANNEL_PINS};
uint32_t DigitalMicType[DFSDM_MIC_NUMBER] = {DFSDM_CHANNEL_SPI_RISING, DFSDM_CHANNEL_SPI_FALLING};
uint32_t Channel4Filter[DFSDM_MIC_NUMBER] = {AUDIO_DFSDMx_MIC1_CHANNEL_FOR_FILTER,
AUDIO_DFSDMx_MIC2_CHANNEL_FOR_FILTER};
for (i = 0; i < hAudioIn.ChannelNbr; i++)
{
if (((hAudioIn.InputDevice & INPUT_DEVICE_DIGITAL_MIC1) == INPUT_DEVICE_DIGITAL_MIC1) && (mic_init[POS_VAL(INPUT_DEVICE_DIGITAL_MIC1)] != 1))
{
mic_num = POS_VAL(INPUT_DEVICE_DIGITAL_MIC1);
}
else if (((hAudioIn.InputDevice & INPUT_DEVICE_DIGITAL_MIC2) == INPUT_DEVICE_DIGITAL_MIC2) && (mic_init[POS_VAL(INPUT_DEVICE_DIGITAL_MIC2)] != 1))
{
mic_num = POS_VAL(INPUT_DEVICE_DIGITAL_MIC2);
}
mic_init[mic_num] = 1;
HAL_DFSDM_FilterDeInit(&hAudioInDfsdmFilter[mic_num]);
/* MIC filters initialization */
__HAL_DFSDM_FILTER_RESET_HANDLE_STATE(&hAudioInDfsdmFilter[mic_num]);
hAudioInDfsdmFilter[mic_num].Instance = FilterInstance[mic_num];
hAudioInDfsdmFilter[mic_num].Init.RegularParam.Trigger = DFSDM_FILTER_SW_TRIGGER;
hAudioInDfsdmFilter[mic_num].Init.RegularParam.FastMode = ENABLE;
hAudioInDfsdmFilter[mic_num].Init.RegularParam.DmaMode = ENABLE;
hAudioInDfsdmFilter[mic_num].Init.InjectedParam.Trigger = DFSDM_FILTER_SW_TRIGGER;
hAudioInDfsdmFilter[mic_num].Init.InjectedParam.ScanMode = DISABLE;
hAudioInDfsdmFilter[mic_num].Init.InjectedParam.DmaMode = DISABLE;
hAudioInDfsdmFilter[mic_num].Init.InjectedParam.ExtTrigger = DFSDM_FILTER_EXT_TRIG_TIM8_TRGO;
hAudioInDfsdmFilter[mic_num].Init.InjectedParam.ExtTriggerEdge = DFSDM_FILTER_EXT_TRIG_BOTH_EDGES;
hAudioInDfsdmFilter[mic_num].Init.FilterParam.SincOrder = DFSDM_FILTER_ORDER(hAudioIn.Frequency);
hAudioInDfsdmFilter[mic_num].Init.FilterParam.Oversampling = DFSDM_OVER_SAMPLING(hAudioIn.Frequency);
hAudioInDfsdmFilter[mic_num].Init.FilterParam.IntOversampling = 1;
if (HAL_OK != HAL_DFSDM_FilterInit(&hAudioInDfsdmFilter[mic_num]))
{
return AUDIO_ERROR;
}
HAL_DFSDM_ChannelDeInit(&hAudioInDfsdmChannel[mic_num]);
/* MIC channels initialization */
__HAL_DFSDM_CHANNEL_RESET_HANDLE_STATE(&hAudioInDfsdmChannel[mic_num]);
hAudioInDfsdmChannel[mic_num].Init.OutputClock.Activation = ENABLE;
hAudioInDfsdmChannel[mic_num].Init.OutputClock.Selection = DFSDM_CHANNEL_OUTPUT_CLOCK_AUDIO;
hAudioInDfsdmChannel[mic_num].Init.OutputClock.Divider = DFSDM_CLOCK_DIVIDER(hAudioIn.Frequency);
hAudioInDfsdmChannel[mic_num].Init.Input.Multiplexer = DFSDM_CHANNEL_EXTERNAL_INPUTS;
hAudioInDfsdmChannel[mic_num].Init.Input.DataPacking = DFSDM_CHANNEL_STANDARD_MODE;
hAudioInDfsdmChannel[mic_num].Init.SerialInterface.SpiClock = DFSDM_CHANNEL_SPI_CLOCK_INTERNAL;
hAudioInDfsdmChannel[mic_num].Init.Awd.FilterOrder = DFSDM_CHANNEL_SINC1_ORDER;
hAudioInDfsdmChannel[mic_num].Init.Awd.Oversampling = 10;
hAudioInDfsdmChannel[mic_num].Init.Offset = 0;
hAudioInDfsdmChannel[mic_num].Init.RightBitShift = DFSDM_MIC_BIT_SHIFT(hAudioIn.Frequency);
hAudioInDfsdmChannel[mic_num].Instance = ChannelInstance[mic_num];
hAudioInDfsdmChannel[mic_num].Init.Input.Pins = DigitalMicPins[mic_num];
hAudioInDfsdmChannel[mic_num].Init.SerialInterface.Type = DigitalMicType[mic_num];
if (HAL_OK != HAL_DFSDM_ChannelInit(&hAudioInDfsdmChannel[mic_num]))
{
return AUDIO_ERROR;
}
filter_ch = Channel4Filter[mic_num];
/* Configure injected channel */
if (HAL_OK != HAL_DFSDM_FilterConfigRegChannel(&hAudioInDfsdmFilter[mic_num], filter_ch,
DFSDM_CONTINUOUS_CONV_ON))
{
return AUDIO_ERROR;
}
}
return AUDIO_OK;
}