uint8_t BSP_AUDIO_IN_ConfigMicDefault()

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;
}