AUDIO DISCO_F746NG audioloop basic example

Dependencies:   BSP_DISCO_F746NG

Committer:
Jerome Coutant
Date:
Wed Nov 20 11:10:32 2019 +0100
Revision:
5:66c230f74325
Parent:
0:da04816fb411
Update with STM32Cube_FW_F7_V1.15.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
adustm 0:da04816fb411 1 #include "mbed.h"
Jerome Coutant 5:66c230f74325 2 #include "stm32746g_discovery_audio.h"
Jerome Coutant 5:66c230f74325 3 #include "stm32746g_discovery_sdram.h"
adustm 0:da04816fb411 4
adustm 0:da04816fb411 5
Jerome Coutant 5:66c230f74325 6 typedef enum {
adustm 0:da04816fb411 7 BUFFER_OFFSET_NONE = 0,
adustm 0:da04816fb411 8 BUFFER_OFFSET_HALF = 1,
adustm 0:da04816fb411 9 BUFFER_OFFSET_FULL = 2,
Jerome Coutant 5:66c230f74325 10 } BUFFER_StateTypeDef;
Jerome Coutant 5:66c230f74325 11
adustm 0:da04816fb411 12
adustm 0:da04816fb411 13 #define AUDIO_BLOCK_SIZE ((uint32_t)512)
Jerome Coutant 5:66c230f74325 14 #define AUDIO_BUFFER_IN SDRAM_DEVICE_ADDR
Jerome Coutant 5:66c230f74325 15 #define AUDIO_BUFFER_OUT (AUDIO_BUFFER_IN + (AUDIO_BLOCK_SIZE * 2))
Jerome Coutant 5:66c230f74325 16
Jerome Coutant 5:66c230f74325 17 volatile uint32_t audio_rec_buffer_state = BUFFER_OFFSET_NONE;
Jerome Coutant 5:66c230f74325 18
Jerome Coutant 5:66c230f74325 19
adustm 0:da04816fb411 20 int main()
adustm 0:da04816fb411 21 {
Jerome Coutant 5:66c230f74325 22 printf("\n\nAUDIO LOOPBACK EXAMPLE START:\n");
Jerome Coutant 5:66c230f74325 23
Jerome Coutant 5:66c230f74325 24 BSP_AUDIO_IN_OUT_Init(INPUT_DEVICE_DIGITAL_MICROPHONE_2, OUTPUT_DEVICE_HEADPHONE, DEFAULT_AUDIO_IN_FREQ, DEFAULT_AUDIO_IN_BIT_RESOLUTION, DEFAULT_AUDIO_IN_CHANNEL_NBR);
Jerome Coutant 5:66c230f74325 25 printf("AUDIO loop from digital micro (U20 & U21 components on board) to headphone (CN10 jack connector)\n");
Jerome Coutant 5:66c230f74325 26
adustm 0:da04816fb411 27
adustm 0:da04816fb411 28 /* Initialize SDRAM buffers */
Jerome Coutant 5:66c230f74325 29 BSP_SDRAM_Init();
Jerome Coutant 5:66c230f74325 30 memset((uint16_t *)AUDIO_BUFFER_IN, 0, AUDIO_BLOCK_SIZE * 2);
Jerome Coutant 5:66c230f74325 31 memset((uint16_t *)AUDIO_BUFFER_OUT, 0, AUDIO_BLOCK_SIZE * 2);
Jerome Coutant 5:66c230f74325 32 printf("SDRAM init done\n");
Jerome Coutant 5:66c230f74325 33
adustm 0:da04816fb411 34 audio_rec_buffer_state = BUFFER_OFFSET_NONE;
adustm 0:da04816fb411 35
adustm 0:da04816fb411 36 /* Start Recording */
Jerome Coutant 5:66c230f74325 37 if (BSP_AUDIO_IN_Record((uint16_t *)AUDIO_BUFFER_IN, AUDIO_BLOCK_SIZE) != AUDIO_OK) {
Jerome Coutant 5:66c230f74325 38 printf("BSP_AUDIO_IN_Record error\n");
Jerome Coutant 5:66c230f74325 39 }
adustm 0:da04816fb411 40
adustm 0:da04816fb411 41 /* Start Playback */
Jerome Coutant 5:66c230f74325 42 BSP_AUDIO_OUT_SetAudioFrameSlot(CODEC_AUDIOFRAME_SLOT_02);
Jerome Coutant 5:66c230f74325 43 if (BSP_AUDIO_OUT_Play((uint16_t *)AUDIO_BUFFER_OUT, AUDIO_BLOCK_SIZE * 2) != AUDIO_OK) {
Jerome Coutant 5:66c230f74325 44 printf("BSP_AUDIO_OUT_Play error\n");
Jerome Coutant 5:66c230f74325 45 }
adustm 0:da04816fb411 46
adustm 0:da04816fb411 47 while (1) {
adustm 0:da04816fb411 48 /* Wait end of half block recording */
Jerome Coutant 5:66c230f74325 49 while (audio_rec_buffer_state == BUFFER_OFFSET_HALF) {
adustm 0:da04816fb411 50 }
adustm 0:da04816fb411 51 audio_rec_buffer_state = BUFFER_OFFSET_NONE;
Jerome Coutant 5:66c230f74325 52
adustm 0:da04816fb411 53 /* Copy recorded 1st half block */
adustm 0:da04816fb411 54 memcpy((uint16_t *)(AUDIO_BUFFER_OUT), (uint16_t *)(AUDIO_BUFFER_IN), AUDIO_BLOCK_SIZE);
Jerome Coutant 5:66c230f74325 55
adustm 0:da04816fb411 56 /* Wait end of one block recording */
Jerome Coutant 5:66c230f74325 57 while (audio_rec_buffer_state == BUFFER_OFFSET_FULL) {
adustm 0:da04816fb411 58 }
adustm 0:da04816fb411 59 audio_rec_buffer_state = BUFFER_OFFSET_NONE;
Jerome Coutant 5:66c230f74325 60
adustm 0:da04816fb411 61 /* Copy recorded 2nd half block */
adustm 0:da04816fb411 62 memcpy((uint16_t *)(AUDIO_BUFFER_OUT + (AUDIO_BLOCK_SIZE)), (uint16_t *)(AUDIO_BUFFER_IN + (AUDIO_BLOCK_SIZE)), AUDIO_BLOCK_SIZE);
adustm 0:da04816fb411 63 }
adustm 0:da04816fb411 64 }
Jerome Coutant 5:66c230f74325 65
Jerome Coutant 5:66c230f74325 66
adustm 0:da04816fb411 67 /*-------------------------------------------------------------------------------------
adustm 0:da04816fb411 68 Callbacks implementation:
adustm 0:da04816fb411 69 the callbacks API are defined __weak in the stm32746g_discovery_audio.c file
adustm 0:da04816fb411 70 and their implementation should be done in the user code if they are needed.
adustm 0:da04816fb411 71 Below some examples of callback implementations.
adustm 0:da04816fb411 72 -------------------------------------------------------------------------------------*/
adustm 0:da04816fb411 73 /**
adustm 0:da04816fb411 74 * @brief Manages the DMA Transfer complete interrupt.
adustm 0:da04816fb411 75 * @param None
adustm 0:da04816fb411 76 * @retval None
adustm 0:da04816fb411 77 */
adustm 0:da04816fb411 78 void BSP_AUDIO_IN_TransferComplete_CallBack(void)
adustm 0:da04816fb411 79 {
Jerome Coutant 5:66c230f74325 80 audio_rec_buffer_state = BUFFER_OFFSET_FULL;
adustm 0:da04816fb411 81 }
adustm 0:da04816fb411 82
adustm 0:da04816fb411 83 /**
adustm 0:da04816fb411 84 * @brief Manages the DMA Half Transfer complete interrupt.
adustm 0:da04816fb411 85 * @param None
adustm 0:da04816fb411 86 * @retval None
adustm 0:da04816fb411 87 */
adustm 0:da04816fb411 88 void BSP_AUDIO_IN_HalfTransfer_CallBack(void)
adustm 0:da04816fb411 89 {
Jerome Coutant 5:66c230f74325 90 audio_rec_buffer_state = BUFFER_OFFSET_HALF;
adustm 0:da04816fb411 91 }
adustm 0:da04816fb411 92
Jerome Coutant 5:66c230f74325 93 /**
Jerome Coutant 5:66c230f74325 94 * @brief Audio IN Error callback function.
Jerome Coutant 5:66c230f74325 95 * @param None
Jerome Coutant 5:66c230f74325 96 * @retval None
Jerome Coutant 5:66c230f74325 97 */
Jerome Coutant 5:66c230f74325 98 void BSP_AUDIO_IN_Error_CallBack(void)
adustm 0:da04816fb411 99 {
Jerome Coutant 5:66c230f74325 100 printf("BSP_AUDIO_IN_Error_CallBack\n");
adustm 0:da04816fb411 101 }