/** * @brief SAI MSP Init * @param hsai : pointer to a SAI_HandleTypeDef structure * @retval None */ void HAL_SAI_MspInit(SAI_HandleTypeDef *hsai) { GPIO_InitTypeDef GPIO_InitStruct; /* Enable SAI clock */ AUDIO_SAIx_CLK_ENABLE(); /* Enable GPIO clock */ AUDIO_SAIx_MCK_SCK_SD_FS_ENABLE(); /* CODEC_SAI pins configuration: FS, SCK, MCK and SD pins ------------------*/ GPIO_InitStruct.Pin = AUDIO_SAIx_FS_PIN | AUDIO_SAIx_SCK_PIN | AUDIO_SAIx_SD_PIN | AUDIO_SAIx_MCK_PIN; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = AUDIO_SAIx_MCK_SCK_SD_FS_AF; HAL_GPIO_Init(AUDIO_SAIx_MCK_SCK_SD_FS_GPIO_PORT, &GPIO_InitStruct); /* Enable the DMA clock */ AUDIO_SAIx_DMAx_CLK_ENABLE(); if(hsai->Instance == AUDIO_SAIx) { /* Configure the hDmaSai handle parameters */ hDmaSai.Init.Request = DMA_REQUEST_1; hDmaSai.Init.Direction = DMA_MEMORY_TO_PERIPH; hDmaSai.Init.PeriphInc = DMA_PINC_DISABLE; hDmaSai.Init.MemInc = DMA_MINC_ENABLE; hDmaSai.Init.PeriphDataAlignment = AUDIO_SAIx_DMAx_PERIPH_DATA_SIZE; hDmaSai.Init.MemDataAlignment = AUDIO_SAIx_DMAx_MEM_DATA_SIZE; hDmaSai.Init.Mode = DMA_NORMAL; hDmaSai.Init.Priority = DMA_PRIORITY_HIGH; hDmaSai.Instance = AUDIO_SAIx_DMAx_CHANNEL; /* Associate the DMA handle */ __HAL_LINKDMA(hsai, hdmatx, hDmaSai); /* Deinitialize the Stream for new transfer */ HAL_DMA_DeInit(&hDmaSai); /* Configure the DMA Stream */ HAL_DMA_Init(&hDmaSai); } /* SAI DMA IRQ Channel configuration */ HAL_NVIC_SetPriority(AUDIO_SAIx_DMAx_IRQ, AUDIO_OUT_IRQ_PREPRIO, 0); HAL_NVIC_EnableIRQ(AUDIO_SAIx_DMAx_IRQ); }
/** * @brief SAI MSP Init. * @param hsai : pointer to a SAI_HandleTypeDef structure that contains * the configuration information for SAI module. * @retval None */ void HAL_SAI_MspInit(SAI_HandleTypeDef *hsai) { GPIO_InitTypeDef GPIO_Init; /* Enable SAI2 clock */ AUDIO_SAIx_CLK_ENABLE(); /* Configure GPIOs used for SAI2 */ AUDIO_SAIx_MCLK_ENABLE(); AUDIO_SAIx_SCK_SD_ENABLE(); AUDIO_SAIx_FS_ENABLE(); /* CODEC_SAI pins configuration: FS, SCK, MCK and SD pins ------------------*/ GPIO_Init.Pin = AUDIO_SAIx_FS_PIN; GPIO_Init.Mode = GPIO_MODE_AF_PP; GPIO_Init.Pull = GPIO_NOPULL; GPIO_Init.Speed = GPIO_SPEED_HIGH; GPIO_Init.Alternate = AUDIO_SAIx_FS_SD_MCLK_AF; HAL_GPIO_Init(AUDIO_SAIx_FS_GPIO_PORT, &GPIO_Init); GPIO_Init.Pin = AUDIO_SAIx_SCK_PIN; GPIO_Init.Mode = GPIO_MODE_AF_PP; GPIO_Init.Pull = GPIO_NOPULL; GPIO_Init.Speed = GPIO_SPEED_HIGH; GPIO_Init.Alternate = AUDIO_SAIx_SCK_AF; HAL_GPIO_Init(AUDIO_SAIx_SCK_SD_GPIO_PORT, &GPIO_Init); GPIO_Init.Pin = AUDIO_SAIx_SD_PIN; GPIO_Init.Mode = GPIO_MODE_AF_PP; GPIO_Init.Pull = GPIO_NOPULL; GPIO_Init.Speed = GPIO_SPEED_HIGH; GPIO_Init.Alternate = AUDIO_SAIx_FS_SD_MCLK_AF; HAL_GPIO_Init(AUDIO_SAIx_SCK_SD_GPIO_PORT, &GPIO_Init); GPIO_Init.Pin = AUDIO_SAIx_MCLK_PIN; GPIO_Init.Mode = GPIO_MODE_AF_PP; GPIO_Init.Pull = GPIO_NOPULL; GPIO_Init.Speed = GPIO_SPEED_HIGH; GPIO_Init.Alternate = AUDIO_SAIx_FS_SD_MCLK_AF; HAL_GPIO_Init(AUDIO_SAIx_MCLK_GPIO_PORT, &GPIO_Init); /* Configure DMA used for SAI2 */ __HAL_RCC_DMA2_CLK_ENABLE(); if(hsai->Instance == AUDIO_SAIx) { hSaiDma.Init.Channel = DMA_CHANNEL_3; hSaiDma.Init.Direction = DMA_MEMORY_TO_PERIPH; hSaiDma.Init.PeriphInc = DMA_PINC_DISABLE; hSaiDma.Init.MemInc = DMA_MINC_ENABLE; hSaiDma.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; hSaiDma.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; hSaiDma.Init.Mode = DMA_CIRCULAR; hSaiDma.Init.Priority = DMA_PRIORITY_HIGH; hSaiDma.Init.FIFOMode = DMA_FIFOMODE_ENABLE; hSaiDma.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; hSaiDma.Init.MemBurst = DMA_MBURST_SINGLE; hSaiDma.Init.PeriphBurst = DMA_PBURST_SINGLE; /* Select the DMA instance to be used for the transfer : DMA2_Stream6 */ hSaiDma.Instance = DMA2_Stream6; /* Associate the DMA handle */ __HAL_LINKDMA(hsai, hdmatx, hSaiDma); /* Deinitialize the Stream for new transfer */ HAL_DMA_DeInit(&hSaiDma); /* Configure the DMA Stream */ if (HAL_OK != HAL_DMA_Init(&hSaiDma)) { Error_Handler(); } } HAL_NVIC_SetPriority(DMA2_Stream6_IRQn, 0x01, 0); HAL_NVIC_EnableIRQ(DMA2_Stream6_IRQn); }
/** * @brief Initializes BSP_AUDIO_OUT MSP. * @param hsai: SAI handle * @retval None */ void BSP_AUDIO_OUT_MspInit(SAI_HandleTypeDef *hsai, void *Params) { static DMA_HandleTypeDef hdma_saiTx; GPIO_InitTypeDef GPIO_InitStruct; /* Enable SAI clock */ AUDIO_SAIx_CLK_ENABLE(); /* Enable GPIO clock */ AUDIO_SAIx_MCLK_SCK_ENABLE(); AUDIO_SAIx_SD_FS_ENABLE(); /* CODEC_SAI pins configuration: FS, SCK, MCK and SD pins ------------------*/ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; GPIO_InitStruct.Alternate = AUDIO_SAIx_MCLK_SD_FS_AF; GPIO_InitStruct.Pin = AUDIO_SAIx_FS_PIN | AUDIO_SAIx_SD_PIN; HAL_GPIO_Init(AUDIO_SAIx_SD_FS_GPIO_PORT, &GPIO_InitStruct); GPIO_InitStruct.Alternate = AUDIO_SAIx_MCLK_SD_FS_AF; GPIO_InitStruct.Pin = AUDIO_SAIx_MCK_PIN; HAL_GPIO_Init(AUDIO_SAIx_MCLK_SCK_GPIO_PORT, &GPIO_InitStruct); GPIO_InitStruct.Alternate = AUDIO_SAIx_SCK_AF; GPIO_InitStruct.Pin = AUDIO_SAIx_SCK_PIN ; HAL_GPIO_Init(AUDIO_SAIx_MCLK_SCK_GPIO_PORT, &GPIO_InitStruct); /* Enable the DMA clock */ AUDIO_SAIx_DMAx_CLK_ENABLE(); if(hsai->Instance == AUDIO_SAIx) { /* Configure the hdma_saiTx handle parameters */ hdma_saiTx.Init.Channel = DMA_CHANNEL_0; hdma_saiTx.Init.Direction = DMA_MEMORY_TO_PERIPH; hdma_saiTx.Init.PeriphInc = DMA_PINC_DISABLE; hdma_saiTx.Init.MemInc = DMA_MINC_ENABLE; hdma_saiTx.Init.PeriphDataAlignment = AUDIO_SAIx_DMAx_PERIPH_DATA_SIZE; hdma_saiTx.Init.MemDataAlignment = AUDIO_SAIx_DMAx_MEM_DATA_SIZE; hdma_saiTx.Init.Mode = DMA_CIRCULAR; hdma_saiTx.Init.Priority = DMA_PRIORITY_HIGH; hdma_saiTx.Init.FIFOMode = DMA_FIFOMODE_ENABLE; hdma_saiTx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; hdma_saiTx.Init.MemBurst = DMA_MBURST_SINGLE; hdma_saiTx.Init.PeriphBurst = DMA_PBURST_SINGLE; hdma_saiTx.Instance = DMA2_Stream7; /* Associate the DMA handle */ __HAL_LINKDMA(hsai, hdmatx, hdma_saiTx); /* Deinitialize the Stream for new transfer */ HAL_DMA_DeInit(&hdma_saiTx); /* Configure the DMA Stream */ HAL_DMA_Init(&hdma_saiTx); } /* SAI DMA IRQ Channel configuration */ HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, AUDIO_OUT_IRQ_PREPRIO, 0); HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn); }