
AUDIO loopback with DISCO_H747I
Dependencies: BSP_DISCO_H747I
main.cpp
00001 #include "mbed.h" 00002 #include "stm32h747i_discovery.h" 00003 #include "stm32h747i_discovery_audio.h" 00004 00005 extern "C" { 00006 00007 /* Audio frequency */ 00008 #define AUDIO_FREQUENCY BSP_AUDIO_FREQUENCY_16K 00009 #define AUDIO_IN_PDM_BUFFER_SIZE (uint32_t)(128*AUDIO_FREQUENCY/16000*DEFAULT_AUDIO_IN_CHANNEL_NBR) 00010 00011 /* Size of the recorder buffer */ 00012 #define RECORD_BUFFER_SIZE 4096 00013 00014 /* Define record Buf at D3SRAM @0x38000000 since the BDMA for SAI4 use only this memory */ 00015 #if defined (TOOLCHAIN_IAR) /* IAR */ 00016 /* No need to update linker script */ 00017 #pragma location=0x38000000 00018 uint16_t recordPDMBuf[AUDIO_IN_PDM_BUFFER_SIZE]; 00019 #else /* GCC_ARM and ARM */ 00020 /* Linker scripts need to be updated to add RAM_D3 section */ 00021 ALIGN_32BYTES(uint16_t recordPDMBuf[AUDIO_IN_PDM_BUFFER_SIZE]) __attribute__((section(".RAM_D3"))); 00022 #endif 00023 00024 uint16_t playbackBuf[RECORD_BUFFER_SIZE * 2]; 00025 00026 /* Pointer to record_data */ 00027 uint32_t playbackPtr; 00028 00029 extern SAI_HandleTypeDef haudio_out_sai; 00030 extern SAI_HandleTypeDef haudio_in_sai; 00031 00032 00033 /** 00034 * @brief This function handles DMA2 Stream 1 interrupt request. 00035 * @param None 00036 * @retval None 00037 */ 00038 void AUDIO_OUT_SAIx_DMAx_IRQHandler(void) 00039 /* DMA2_Stream1_IRQHandler redefinition in BSP_DISCO_H747I/STM32H747I-Discovery/stm32h747i_discovery_audio.h */ 00040 { 00041 HAL_DMA_IRQHandler(haudio_out_sai.hdmatx); 00042 } 00043 00044 00045 /** 00046 * @brief This function handles BDMA Channel 1 for SAI_PDM interrupt request. 00047 * @param None 00048 * @retval None 00049 */ 00050 void AUDIO_IN_SAI_PDMx_DMAx_IRQHandler(void) 00051 /* BDMA_Channel1_IRQHandler redefinition in BSP_DISCO_H747I/STM32H747I-Discovery/stm32h747i_discovery_audio.h */ 00052 { 00053 HAL_DMA_IRQHandler(haudio_in_sai.hdmarx); 00054 } 00055 00056 00057 /** 00058 * @brief Calculates the remaining file size and new position of the pointer. 00059 * @param None 00060 * @retval None 00061 */ 00062 void BSP_AUDIO_IN_TransferComplete_CallBack(void) 00063 /* weak empty function in BSP_DISCO_H747I/STM32H747I-Discovery/stm32h747i_discovery_audio.c */ 00064 { 00065 if (BSP_AUDIO_IN_GetInterface() == AUDIO_IN_INTERFACE_PDM) { 00066 /* Invalidate Data Cache to get the updated content of the SRAM*/ 00067 SCB_InvalidateDCache_by_Addr((uint32_t *)&recordPDMBuf[AUDIO_IN_PDM_BUFFER_SIZE / 2], AUDIO_IN_PDM_BUFFER_SIZE * 2); 00068 00069 BSP_AUDIO_IN_PDMToPCM((uint16_t *)&recordPDMBuf[AUDIO_IN_PDM_BUFFER_SIZE / 2], &playbackBuf[playbackPtr]); 00070 00071 /* Clean Data Cache to update the content of the SRAM */ 00072 SCB_CleanDCache_by_Addr((uint32_t *)&playbackBuf[playbackPtr], AUDIO_IN_PDM_BUFFER_SIZE / 4); 00073 00074 playbackPtr += AUDIO_IN_PDM_BUFFER_SIZE / 4 / 2; 00075 if (playbackPtr >= RECORD_BUFFER_SIZE) { 00076 playbackPtr = 0; 00077 } 00078 } 00079 } 00080 00081 00082 /** 00083 * @brief Manages the DMA Half Transfer complete interrupt. 00084 * @param None 00085 * @retval None 00086 */ 00087 void BSP_AUDIO_IN_HalfTransfer_CallBack(void) 00088 /* weak empty function in BSP_DISCO_H747I/STM32H747I-Discovery/stm32h747i_discovery_audio.c */ 00089 { 00090 if (BSP_AUDIO_IN_GetInterface() == AUDIO_IN_INTERFACE_PDM) { 00091 /* Invalidate Data Cache to get the updated content of the SRAM*/ 00092 SCB_InvalidateDCache_by_Addr((uint32_t *)&recordPDMBuf[0], AUDIO_IN_PDM_BUFFER_SIZE * 2); 00093 00094 BSP_AUDIO_IN_PDMToPCM((uint16_t *)&recordPDMBuf[0], &playbackBuf[playbackPtr]); 00095 00096 /* Clean Data Cache to update the content of the SRAM */ 00097 SCB_CleanDCache_by_Addr((uint32_t *)&playbackBuf[playbackPtr], AUDIO_IN_PDM_BUFFER_SIZE / 4); 00098 00099 playbackPtr += AUDIO_IN_PDM_BUFFER_SIZE / 4 / 2; 00100 if (playbackPtr >= RECORD_BUFFER_SIZE) { 00101 playbackPtr = 0; 00102 } 00103 } 00104 } 00105 00106 00107 /** 00108 * @brief Audio IN Error callback function 00109 * @param None 00110 * @retval None 00111 */ 00112 void BSP_AUDIO_IN_Error_CallBack(void) 00113 /* weak empty function in BSP_DISCO_H747I/STM32H747I-Discovery/stm32h747i_discovery_audio.c */ 00114 { 00115 MBED_ASSERT(0); 00116 } 00117 00118 } // extern C 00119 00120 00121 int main() 00122 { 00123 printf("\n\nAUDIO LOOPBACK EXAMPLE WITH AUDIO PDM FOR DISCO-H747I\n"); 00124 00125 /* Set audio input interface */ 00126 BSP_AUDIO_IN_SelectInterface(AUDIO_IN_INTERFACE_PDM); 00127 00128 /* Initialize audio IN at REC_FREQ*/ 00129 if (BSP_AUDIO_IN_InitEx(INPUT_DEVICE_DIGITAL_MIC, AUDIO_FREQUENCY, DEFAULT_AUDIO_IN_BIT_RESOLUTION, DEFAULT_AUDIO_IN_CHANNEL_NBR) != AUDIO_OK) { 00130 /* Record Error */ 00131 MBED_ASSERT(0); 00132 } 00133 00134 /* Initialize audio OUT at REC_FREQ*/ 00135 if (BSP_AUDIO_OUT_Init(OUTPUT_DEVICE_HEADPHONE, 50, AUDIO_FREQUENCY) != AUDIO_OK) { 00136 /* Record Error */ 00137 MBED_ASSERT(0); 00138 } 00139 00140 /* Set audio slot */ 00141 BSP_AUDIO_OUT_SetAudioFrameSlot(CODEC_AUDIOFRAME_SLOT_02); 00142 00143 /* Start the record */ 00144 BSP_AUDIO_IN_Record((uint16_t *)recordPDMBuf, AUDIO_IN_PDM_BUFFER_SIZE); 00145 00146 wait_us(1000); // 1 ms 00147 00148 /* Start audio output */ 00149 BSP_AUDIO_OUT_Play((uint16_t *)playbackBuf, RECORD_BUFFER_SIZE * 2); 00150 }
Generated on Thu Jul 14 2022 20:09:32 by
