in AZ3166/src/libraries/Audio/src/stm32412g_discovery_audio.c [825:908]
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;
}