AUDIO loopback with DISCO_H747I

Dependencies:   BSP_DISCO_H747I

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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 }