uint8_t BSP_AUDIO_IN_ConfigMicDefault()

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