AUDIO DISCO_F746NG audioloop basic example
Dependencies: BSP_DISCO_F746NG
main.cpp@5:66c230f74325, 2019-11-20 (annotated)
- 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?
User | Revision | Line number | New 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 | } |