lab 1 code

Dependencies:   CMSIS-DSP_for_STM32F746G BSP_DISCO_F746NG

Committer:
bmazzeo
Date:
Tue Dec 31 18:43:43 2019 +0000
Revision:
18:255d15af49f2
Parent:
17:eb85a2387dd4
Child:
19:479f611941a8
Single trace with two channels working excellently. Good place to revert to if there are problems in the future.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bmazzeo 9:f5b37c71856d 1 /**
bmazzeo 9:f5b37c71856d 2 ******************************************************************************
bmazzeo 9:f5b37c71856d 3 * @file main.c
bmazzeo 9:f5b37c71856d 4 * @author Brian Mazzeo
bmazzeo 9:f5b37c71856d 5 * @brief This file provides a set of code for signal processing in 487.
bmazzeo 9:f5b37c71856d 6 * Parts are taken from example code from STMIcroelectronics
bmazzeo 9:f5b37c71856d 7 ******************************************************************************
bmazzeo 9:f5b37c71856d 8 * @attention
bmazzeo 13:61131aac4031 9 * This code was specifically developed for BYU ECEn 487 course
bmazzeo 13:61131aac4031 10 * Introduction to Digital Signal Processing.
bmazzeo 9:f5b37c71856d 11 *
bmazzeo 9:f5b37c71856d 12 *
bmazzeo 9:f5b37c71856d 13 ******************************************************************************
bmazzeo 9:f5b37c71856d 14 */
bmazzeo 9:f5b37c71856d 15
bmazzeo 9:f5b37c71856d 16
adustm 0:da04816fb411 17 #include "mbed.h"
Jerome Coutant 5:66c230f74325 18 #include "stm32746g_discovery_audio.h"
Jerome Coutant 5:66c230f74325 19 #include "stm32746g_discovery_sdram.h"
bmazzeo 6:e689075b04ed 20 #include "stm32746g_discovery_lcd.h"
adustm 0:da04816fb411 21
Jerome Coutant 5:66c230f74325 22 typedef enum {
adustm 0:da04816fb411 23 BUFFER_OFFSET_NONE = 0,
adustm 0:da04816fb411 24 BUFFER_OFFSET_HALF = 1,
adustm 0:da04816fb411 25 BUFFER_OFFSET_FULL = 2,
Jerome Coutant 5:66c230f74325 26 } BUFFER_StateTypeDef;
Jerome Coutant 5:66c230f74325 27
bmazzeo 18:255d15af49f2 28 #define HALF_AUDIO_BLOCK_SAMPLES ((uint32_t)128) // Number of samples (L and R) in half block
bmazzeo 18:255d15af49f2 29 #define HALF_AUDIO_BLOCK_SIZE ((uint32_t)256) // Number of samples (L and R) in full block
bmazzeo 18:255d15af49f2 30 #define AUDIO_BLOCK_SIZE ((uint32_t)512)
bmazzeo 6:e689075b04ed 31
bmazzeo 9:f5b37c71856d 32 #define SDRAM_DEVICE_ADDR_AUDIO_MEM ((uint32_t)0xC0400000)
bmazzeo 9:f5b37c71856d 33 #define AUDIO_BUFFER_IN SDRAM_DEVICE_ADDR_AUDIO_MEM
bmazzeo 9:f5b37c71856d 34 #define AUDIO_BUFFER_OUT (AUDIO_BUFFER_IN + (AUDIO_BLOCK_SIZE * 2))
Jerome Coutant 5:66c230f74325 35
bmazzeo 8:d1c41eca57f0 36 #define OSC_START_X_POS 20
bmazzeo 6:e689075b04ed 37 #define OSC_LINE_SIZE 256
bmazzeo 17:eb85a2387dd4 38 #define OSC_Y_POS 110
bmazzeo 7:e1dfd64eba81 39 #define AUDIO_DRAW_LIMIT 30
bmazzeo 6:e689075b04ed 40
bmazzeo 9:f5b37c71856d 41 Timer timer;
bmazzeo 9:f5b37c71856d 42
Jerome Coutant 5:66c230f74325 43 volatile uint32_t audio_rec_buffer_state = BUFFER_OFFSET_NONE;
bmazzeo 17:eb85a2387dd4 44 static void Erase_Trace(uint16_t Xpos, uint16_t Ypos, uint16_t Length);
bmazzeo 17:eb85a2387dd4 45 static void Draw_Trace(uint16_t Xpos, uint16_t Ypos, uint16_t* Mem_start, uint16_t Length);
bmazzeo 16:b7dca59ab076 46 static void Audio_to_Float(uint16_t* buffer_in, float* L_out, float* R_out, uint16_t Length);
bmazzeo 16:b7dca59ab076 47 static void Float_to_Audio(float* L_in, float* R_in, uint16_t* buffer_out, uint16_t Length);
Jerome Coutant 5:66c230f74325 48
bmazzeo 14:18f159d48340 49 /* To do converstion to float */
bmazzeo 14:18f159d48340 50 float L_channel_float[HALF_AUDIO_BLOCK_SIZE];
bmazzeo 14:18f159d48340 51 float R_channel_float[HALF_AUDIO_BLOCK_SIZE];
bmazzeo 14:18f159d48340 52
bmazzeo 14:18f159d48340 53 /* Back conversion to integer */
bmazzeo 16:b7dca59ab076 54 uint16_t Processed_audio[HALF_AUDIO_BLOCK_SIZE];
bmazzeo 14:18f159d48340 55
bmazzeo 14:18f159d48340 56 /* Useful variables during looping */
bmazzeo 9:f5b37c71856d 57 uint32_t counter = 0;
bmazzeo 10:a82b64ea1d11 58 char buf[40];
bmazzeo 13:61131aac4031 59 int first_half_time = 0;
bmazzeo 13:61131aac4031 60 int second_half_time = 0;
bmazzeo 13:61131aac4031 61 int total_time = 0;
bmazzeo 9:f5b37c71856d 62
adustm 0:da04816fb411 63 int main()
adustm 0:da04816fb411 64 {
bmazzeo 13:61131aac4031 65 /* Initialize the LCD Screen and display information */
bmazzeo 6:e689075b04ed 66 BSP_LCD_Init();
bmazzeo 6:e689075b04ed 67 BSP_LCD_LayerDefaultInit(LTDC_ACTIVE_LAYER, LCD_FB_START_ADDRESS);
bmazzeo 6:e689075b04ed 68 BSP_LCD_SelectLayer(LTDC_ACTIVE_LAYER);
bmazzeo 6:e689075b04ed 69
bmazzeo 6:e689075b04ed 70 BSP_LCD_Clear(LCD_COLOR_BLACK);
bmazzeo 6:e689075b04ed 71 BSP_LCD_SetFont(&LCD_DEFAULT_FONT);
bmazzeo 6:e689075b04ed 72
bmazzeo 6:e689075b04ed 73 BSP_LCD_SetBackColor(LCD_COLOR_BLACK);
bmazzeo 6:e689075b04ed 74 BSP_LCD_SetTextColor(LCD_COLOR_ORANGE);
bmazzeo 7:e1dfd64eba81 75 BSP_LCD_DisplayStringAt(0, 0, (uint8_t *)"487 Mic Audio Test Code", LEFT_MODE);
bmazzeo 17:eb85a2387dd4 76 BSP_LCD_SetTextColor(LCD_COLOR_BLUE);
bmazzeo 17:eb85a2387dd4 77 BSP_LCD_DisplayStringAt(0, OSC_Y_POS - 20, (uint8_t *)"L", LEFT_MODE);
bmazzeo 17:eb85a2387dd4 78 BSP_LCD_SetTextColor(LCD_COLOR_GREEN);
bmazzeo 17:eb85a2387dd4 79 BSP_LCD_DisplayStringAt(0, OSC_Y_POS, (uint8_t *)"R", LEFT_MODE);
bmazzeo 6:e689075b04ed 80
bmazzeo 13:61131aac4031 81
bmazzeo 13:61131aac4031 82 /* Initialize the Audio Interface */
Jerome Coutant 5:66c230f74325 83 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);
adustm 0:da04816fb411 84
adustm 0:da04816fb411 85 /* Initialize SDRAM buffers */
Jerome Coutant 5:66c230f74325 86 BSP_SDRAM_Init();
Jerome Coutant 5:66c230f74325 87 memset((uint16_t *)AUDIO_BUFFER_IN, 0, AUDIO_BLOCK_SIZE * 2);
Jerome Coutant 5:66c230f74325 88 memset((uint16_t *)AUDIO_BUFFER_OUT, 0, AUDIO_BLOCK_SIZE * 2);
Jerome Coutant 5:66c230f74325 89
adustm 0:da04816fb411 90
adustm 0:da04816fb411 91 /* Start Recording */
bmazzeo 13:61131aac4031 92 if (BSP_AUDIO_IN_Record((uint16_t *)AUDIO_BUFFER_IN, AUDIO_BLOCK_SIZE) != AUDIO_OK) { printf("BSP_AUDIO_IN_Record error\n"); }
adustm 0:da04816fb411 93
adustm 0:da04816fb411 94 /* Start Playback */
Jerome Coutant 5:66c230f74325 95 BSP_AUDIO_OUT_SetAudioFrameSlot(CODEC_AUDIOFRAME_SLOT_02);
bmazzeo 13:61131aac4031 96 if (BSP_AUDIO_OUT_Play((uint16_t *)AUDIO_BUFFER_OUT, AUDIO_BLOCK_SIZE * 2) != AUDIO_OK) { printf("BSP_AUDIO_OUT_Play error\n"); }
bmazzeo 13:61131aac4031 97
adustm 0:da04816fb411 98
bmazzeo 9:f5b37c71856d 99 timer.start();
adustm 0:da04816fb411 100 while (1) {
bmazzeo 6:e689075b04ed 101 /* First Half */
bmazzeo 13:61131aac4031 102 /* Wait end of half block recording before going on in the first half cycle*/
bmazzeo 11:4256dbbb0c89 103 while (audio_rec_buffer_state != BUFFER_OFFSET_HALF) {}
bmazzeo 9:f5b37c71856d 104
bmazzeo 13:61131aac4031 105 /* This captures the time of an entire cycle */
bmazzeo 9:f5b37c71856d 106 total_time = timer.read_us();
bmazzeo 13:61131aac4031 107
bmazzeo 13:61131aac4031 108 /* Reset the timer counter to zero */
bmazzeo 9:f5b37c71856d 109 timer.reset();
Jerome Coutant 5:66c230f74325 110
bmazzeo 13:61131aac4031 111 /* Plot traces of first half block recording */
bmazzeo 18:255d15af49f2 112 Erase_Trace(OSC_START_X_POS, OSC_Y_POS, HALF_AUDIO_BLOCK_SAMPLES);
bmazzeo 18:255d15af49f2 113 Draw_Trace(OSC_START_X_POS, OSC_Y_POS, (uint16_t *) AUDIO_BUFFER_IN, HALF_AUDIO_BLOCK_SAMPLES);
bmazzeo 18:255d15af49f2 114
bmazzeo 14:18f159d48340 115 /* Convert data to floating point representation for processing */
bmazzeo 18:255d15af49f2 116 //Audio_to_Float((uint16_t *) AUDIO_BUFFER_IN, (float *) L_channel_float, (float *) R_channel_float, HALF_AUDIO_BLOCK_SAMPLES);
bmazzeo 18:255d15af49f2 117 //Float_to_Audio((float *) L_channel_float, (float *) R_channel_float, (uint16_t *) Processed_audio, HALF_AUDIO_BLOCK_SAMPLES);
bmazzeo 14:18f159d48340 118
bmazzeo 13:61131aac4031 119 /* Copy recorded 1st half block into the audio buffer that goes out */
bmazzeo 16:b7dca59ab076 120 memcpy((uint16_t *)(AUDIO_BUFFER_OUT), (uint16_t *)(AUDIO_BUFFER_IN), AUDIO_BLOCK_SIZE);
bmazzeo 13:61131aac4031 121
bmazzeo 13:61131aac4031 122 /* Capture the timing of the first half processing */
bmazzeo 9:f5b37c71856d 123 first_half_time = timer.read_us();
bmazzeo 13:61131aac4031 124 /* End First Half */
bmazzeo 8:d1c41eca57f0 125
bmazzeo 6:e689075b04ed 126 /* Second Half */
adustm 0:da04816fb411 127 /* Wait end of one block recording */
bmazzeo 11:4256dbbb0c89 128 while (audio_rec_buffer_state != BUFFER_OFFSET_FULL) {}
bmazzeo 9:f5b37c71856d 129
bmazzeo 13:61131aac4031 130 /* Plot traces of second half block recording */
bmazzeo 18:255d15af49f2 131 Erase_Trace(OSC_START_X_POS+HALF_AUDIO_BLOCK_SAMPLES, OSC_Y_POS, HALF_AUDIO_BLOCK_SAMPLES);
bmazzeo 18:255d15af49f2 132 Draw_Trace(OSC_START_X_POS+ HALF_AUDIO_BLOCK_SAMPLES, OSC_Y_POS, (uint16_t *) (AUDIO_BUFFER_IN + (AUDIO_BLOCK_SIZE)), HALF_AUDIO_BLOCK_SAMPLES);
bmazzeo 13:61131aac4031 133
bmazzeo 13:61131aac4031 134 /* Compute important cycle information and display it*/
bmazzeo 6:e689075b04ed 135 counter++;
bmazzeo 10:a82b64ea1d11 136 sprintf(buf, "Cycles: %9d", counter);
bmazzeo 6:e689075b04ed 137 BSP_LCD_SetTextColor(LCD_COLOR_RED);
bmazzeo 10:a82b64ea1d11 138 BSP_LCD_DisplayStringAt(0, 46, (uint8_t *) buf, LEFT_MODE);
bmazzeo 10:a82b64ea1d11 139 sprintf(buf, "1:%6d 2:%6d T:%6d", first_half_time, second_half_time, total_time);
bmazzeo 10:a82b64ea1d11 140 BSP_LCD_DisplayStringAt(0, 20, (uint8_t *) buf, LEFT_MODE);
bmazzeo 13:61131aac4031 141
bmazzeo 13:61131aac4031 142 /* Copy recorded 2nd half block into audio output buffer */
bmazzeo 13:61131aac4031 143 memcpy((uint16_t *)(AUDIO_BUFFER_OUT + (AUDIO_BLOCK_SIZE)), (uint16_t *)(AUDIO_BUFFER_IN + (AUDIO_BLOCK_SIZE)), AUDIO_BLOCK_SIZE);
bmazzeo 18:255d15af49f2 144
bmazzeo 13:61131aac4031 145 /* Change the recording buffer state to reflect the status of the buffer */
bmazzeo 13:61131aac4031 146 audio_rec_buffer_state = BUFFER_OFFSET_NONE;
bmazzeo 9:f5b37c71856d 147
bmazzeo 13:61131aac4031 148 /* Measures the amount of time to process the second half */
bmazzeo 9:f5b37c71856d 149 second_half_time = timer.read_us();
bmazzeo 9:f5b37c71856d 150
bmazzeo 13:61131aac4031 151 /* End Second Half */
adustm 0:da04816fb411 152 }
adustm 0:da04816fb411 153 }
Jerome Coutant 5:66c230f74325 154
bmazzeo 7:e1dfd64eba81 155 /**
bmazzeo 7:e1dfd64eba81 156 * @brief Draws a trace of the data line.
bmazzeo 7:e1dfd64eba81 157 * @param Xpos: X position
bmazzeo 7:e1dfd64eba81 158 * @param L_Ypos: Left channel Y position
bmazzeo 7:e1dfd64eba81 159 * @param R_Ypos: Right channel Y position
bmazzeo 7:e1dfd64eba81 160 * @param Mem_start: Start of memory location
bmazzeo 7:e1dfd64eba81 161 * @param Length: length of trace
bmazzeo 7:e1dfd64eba81 162 * @retval None
bmazzeo 7:e1dfd64eba81 163 */
bmazzeo 17:eb85a2387dd4 164 void Erase_Trace(uint16_t Xpos, uint16_t Ypos, uint16_t Length)
bmazzeo 7:e1dfd64eba81 165 {
bmazzeo 7:e1dfd64eba81 166 BSP_LCD_SetTextColor(LCD_COLOR_BROWN);
bmazzeo 17:eb85a2387dd4 167 BSP_LCD_FillRect(Xpos, Ypos - AUDIO_DRAW_LIMIT, Length, AUDIO_DRAW_LIMIT);
bmazzeo 17:eb85a2387dd4 168 BSP_LCD_FillRect(Xpos, Ypos+1, Length, AUDIO_DRAW_LIMIT);
bmazzeo 7:e1dfd64eba81 169
bmazzeo 17:eb85a2387dd4 170 BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
bmazzeo 17:eb85a2387dd4 171 BSP_LCD_DrawHLine(Xpos, Ypos, Length);
bmazzeo 7:e1dfd64eba81 172
bmazzeo 7:e1dfd64eba81 173 }
bmazzeo 7:e1dfd64eba81 174
Jerome Coutant 5:66c230f74325 175
bmazzeo 6:e689075b04ed 176 /**
bmazzeo 6:e689075b04ed 177 * @brief Draws a trace of the data line.
bmazzeo 6:e689075b04ed 178 * @param Xpos: X position
bmazzeo 7:e1dfd64eba81 179 * @param L_Ypos: Left channel Y position
bmazzeo 7:e1dfd64eba81 180 * @param R_Ypos: Right channel Y position
bmazzeo 6:e689075b04ed 181 * @param Mem_start: Start of memory location
bmazzeo 6:e689075b04ed 182 * @param Length: length of trace
bmazzeo 6:e689075b04ed 183 * @retval None
bmazzeo 6:e689075b04ed 184 */
bmazzeo 17:eb85a2387dd4 185 void Draw_Trace(uint16_t Xpos, uint16_t Ypos, uint16_t* Mem_start, uint16_t Length)
bmazzeo 6:e689075b04ed 186 {
bmazzeo 7:e1dfd64eba81 187 uint16_t i;
bmazzeo 7:e1dfd64eba81 188 uint32_t data_value;
bmazzeo 18:255d15af49f2 189 uint16_t* mem_address;
bmazzeo 7:e1dfd64eba81 190 char buf[10];
bmazzeo 7:e1dfd64eba81 191 int16_t L_audio_value;
bmazzeo 7:e1dfd64eba81 192 int16_t R_audio_value;
bmazzeo 6:e689075b04ed 193
bmazzeo 16:b7dca59ab076 194 //data_value = *((uint32_t*) Mem_start);
bmazzeo 16:b7dca59ab076 195 //L_audio_value = (int16_t) ((data_value >> 16) & 0xFFFF);
bmazzeo 16:b7dca59ab076 196 //R_audio_value = (int16_t) (data_value & 0xFFFF);
bmazzeo 18:255d15af49f2 197
bmazzeo 18:255d15af49f2 198 mem_address = Mem_start;
bmazzeo 7:e1dfd64eba81 199
bmazzeo 8:d1c41eca57f0 200 for (i=0; i<Length; i++)
bmazzeo 6:e689075b04ed 201 {
bmazzeo 18:255d15af49f2 202 //mem_address = (uint32_t*) Mem_start + i;
bmazzeo 18:255d15af49f2 203 //data_value = *((uint16_t*) mem_address);
bmazzeo 18:255d15af49f2 204 //L_audio_value = (int16_t) ((data_value >> 16) & 0xFFFF);
bmazzeo 18:255d15af49f2 205 //R_audio_value = (int16_t) (data_value & 0xFFFF);
bmazzeo 18:255d15af49f2 206
bmazzeo 18:255d15af49f2 207 L_audio_value = (int16_t) *mem_address;
bmazzeo 18:255d15af49f2 208 mem_address++;
bmazzeo 18:255d15af49f2 209 R_audio_value = (int16_t) *mem_address;
bmazzeo 18:255d15af49f2 210 mem_address++;
bmazzeo 7:e1dfd64eba81 211
bmazzeo 17:eb85a2387dd4 212 L_audio_value = L_audio_value / 100;
bmazzeo 17:eb85a2387dd4 213 R_audio_value = R_audio_value / 100;
bmazzeo 7:e1dfd64eba81 214
bmazzeo 7:e1dfd64eba81 215 if (L_audio_value > AUDIO_DRAW_LIMIT) {L_audio_value = AUDIO_DRAW_LIMIT;}
bmazzeo 7:e1dfd64eba81 216 else if (L_audio_value < -AUDIO_DRAW_LIMIT) {L_audio_value = -AUDIO_DRAW_LIMIT;}
bmazzeo 7:e1dfd64eba81 217
bmazzeo 7:e1dfd64eba81 218 if (R_audio_value > AUDIO_DRAW_LIMIT) {R_audio_value = AUDIO_DRAW_LIMIT;}
bmazzeo 7:e1dfd64eba81 219 else if (R_audio_value < -AUDIO_DRAW_LIMIT) {R_audio_value = -AUDIO_DRAW_LIMIT;}
bmazzeo 7:e1dfd64eba81 220
bmazzeo 17:eb85a2387dd4 221 BSP_LCD_DrawPixel(Xpos + i, (uint16_t) ((int16_t) Ypos + L_audio_value), LCD_COLOR_BLUE);
bmazzeo 17:eb85a2387dd4 222 BSP_LCD_DrawPixel(Xpos + i, (uint16_t) ((int16_t) Ypos + R_audio_value), LCD_COLOR_GREEN);
bmazzeo 6:e689075b04ed 223 }
bmazzeo 6:e689075b04ed 224
bmazzeo 6:e689075b04ed 225 }
bmazzeo 14:18f159d48340 226
bmazzeo 14:18f159d48340 227 /**
bmazzeo 14:18f159d48340 228 * @brief Converts audio data in buffer to floating point representation.
bmazzeo 14:18f159d48340 229 * @param buffer_in: Pointer to Audio buffer start location
bmazzeo 14:18f159d48340 230 * @param L_out: Pointer to Left channel out data (float)
bmazzeo 14:18f159d48340 231 * @param R_out: Pointer to Right channel out data (float)
bmazzeo 14:18f159d48340 232 * @param Length: length of data to convert
bmazzeo 14:18f159d48340 233 * @retval None
bmazzeo 14:18f159d48340 234 */
bmazzeo 16:b7dca59ab076 235 void Audio_to_Float(uint16_t* buffer_in, float* L_out, float* R_out, uint16_t Length)
bmazzeo 14:18f159d48340 236 {
bmazzeo 14:18f159d48340 237 uint16_t i;
bmazzeo 14:18f159d48340 238 uint32_t data_value;
bmazzeo 16:b7dca59ab076 239 uint16_t* audio_mem_address;
bmazzeo 16:b7dca59ab076 240 uint16_t* L_chan_mem_address;
bmazzeo 16:b7dca59ab076 241 uint16_t* R_chan_mem_address;
bmazzeo 14:18f159d48340 242 float L_audio_value;
bmazzeo 14:18f159d48340 243 float R_audio_value;
bmazzeo 6:e689075b04ed 244
bmazzeo 14:18f159d48340 245 for (i=0; i<Length; i++)
bmazzeo 14:18f159d48340 246 {
bmazzeo 16:b7dca59ab076 247 audio_mem_address = (uint16_t*) buffer_in + i;
bmazzeo 16:b7dca59ab076 248 L_chan_mem_address = (uint16_t*) L_out + i;
bmazzeo 16:b7dca59ab076 249 R_chan_mem_address = (uint16_t*) R_out + i;
bmazzeo 16:b7dca59ab076 250 data_value = *((uint16_t*) audio_mem_address);
bmazzeo 14:18f159d48340 251 L_audio_value = (float) ((int16_t) ((data_value >> 16) & 0xFFFF));
bmazzeo 14:18f159d48340 252 R_audio_value = (float) ((int16_t) (data_value & 0xFFFF));
bmazzeo 14:18f159d48340 253
bmazzeo 16:b7dca59ab076 254 *L_chan_mem_address = L_audio_value;
bmazzeo 14:18f159d48340 255 *R_chan_mem_address = R_audio_value;
bmazzeo 14:18f159d48340 256 }
bmazzeo 14:18f159d48340 257 }
bmazzeo 14:18f159d48340 258
bmazzeo 14:18f159d48340 259 /**
bmazzeo 14:18f159d48340 260 * @brief Converts audio data in buffer to floating point representation.
bmazzeo 14:18f159d48340 261 * @param L_out: Pointer to Left channel in data (float)
bmazzeo 14:18f159d48340 262 * @param R_out: Pointer to Right channel in data (float)
bmazzeo 14:18f159d48340 263 * @param buffer_out: Pointer to combined 32 bit (two 16-bit int samples)
bmazzeo 14:18f159d48340 264 * @param Length: length of data to convert
bmazzeo 14:18f159d48340 265 * @retval None
bmazzeo 14:18f159d48340 266 */
bmazzeo 16:b7dca59ab076 267 void Float_to_Audio(float* L_in, float* R_in, uint16_t* buffer_out, uint16_t Length)
bmazzeo 14:18f159d48340 268 {
bmazzeo 14:18f159d48340 269 uint16_t i;
bmazzeo 14:18f159d48340 270 uint32_t data_value;
bmazzeo 14:18f159d48340 271 uint16_t* audio_mem_address;
bmazzeo 14:18f159d48340 272 uint16_t* L_chan_mem_address;
bmazzeo 14:18f159d48340 273 uint16_t* R_chan_mem_address;
bmazzeo 14:18f159d48340 274 float L_audio_value;
bmazzeo 14:18f159d48340 275 float R_audio_value;
bmazzeo 14:18f159d48340 276
bmazzeo 14:18f159d48340 277 for (i=0; i<Length; i++)
bmazzeo 14:18f159d48340 278 {
bmazzeo 14:18f159d48340 279 L_chan_mem_address = (uint16_t*) L_in + i;
bmazzeo 14:18f159d48340 280 R_chan_mem_address = (uint16_t*) R_in + i;
bmazzeo 14:18f159d48340 281 audio_mem_address = (uint16_t*) buffer_out + i;
bmazzeo 14:18f159d48340 282
bmazzeo 14:18f159d48340 283 L_audio_value = *((uint16_t*) L_chan_mem_address);
bmazzeo 14:18f159d48340 284 R_audio_value = *((uint16_t*) R_chan_mem_address);
bmazzeo 14:18f159d48340 285
bmazzeo 14:18f159d48340 286 data_value = (((uint32_t) ((int16_t) L_audio_value)) << 16) | ((uint32_t) ((int16_t) R_audio_value));
bmazzeo 14:18f159d48340 287 *audio_mem_address = data_value;
bmazzeo 14:18f159d48340 288 }
bmazzeo 14:18f159d48340 289 }
bmazzeo 14:18f159d48340 290
bmazzeo 14:18f159d48340 291
bmazzeo 14:18f159d48340 292
bmazzeo 6:e689075b04ed 293
bmazzeo 6:e689075b04ed 294
adustm 0:da04816fb411 295 /*-------------------------------------------------------------------------------------
adustm 0:da04816fb411 296 Callbacks implementation:
adustm 0:da04816fb411 297 the callbacks API are defined __weak in the stm32746g_discovery_audio.c file
adustm 0:da04816fb411 298 and their implementation should be done in the user code if they are needed.
adustm 0:da04816fb411 299 Below some examples of callback implementations.
adustm 0:da04816fb411 300 -------------------------------------------------------------------------------------*/
adustm 0:da04816fb411 301 /**
adustm 0:da04816fb411 302 * @brief Manages the DMA Transfer complete interrupt.
adustm 0:da04816fb411 303 * @param None
adustm 0:da04816fb411 304 * @retval None
adustm 0:da04816fb411 305 */
adustm 0:da04816fb411 306 void BSP_AUDIO_IN_TransferComplete_CallBack(void)
adustm 0:da04816fb411 307 {
Jerome Coutant 5:66c230f74325 308 audio_rec_buffer_state = BUFFER_OFFSET_FULL;
adustm 0:da04816fb411 309 }
adustm 0:da04816fb411 310
adustm 0:da04816fb411 311 /**
adustm 0:da04816fb411 312 * @brief Manages the DMA Half Transfer complete interrupt.
adustm 0:da04816fb411 313 * @param None
adustm 0:da04816fb411 314 * @retval None
adustm 0:da04816fb411 315 */
adustm 0:da04816fb411 316 void BSP_AUDIO_IN_HalfTransfer_CallBack(void)
adustm 0:da04816fb411 317 {
Jerome Coutant 5:66c230f74325 318 audio_rec_buffer_state = BUFFER_OFFSET_HALF;
adustm 0:da04816fb411 319 }
adustm 0:da04816fb411 320
Jerome Coutant 5:66c230f74325 321 /**
Jerome Coutant 5:66c230f74325 322 * @brief Audio IN Error callback function.
Jerome Coutant 5:66c230f74325 323 * @param None
Jerome Coutant 5:66c230f74325 324 * @retval None
Jerome Coutant 5:66c230f74325 325 */
Jerome Coutant 5:66c230f74325 326 void BSP_AUDIO_IN_Error_CallBack(void)
adustm 0:da04816fb411 327 {
Jerome Coutant 5:66c230f74325 328 printf("BSP_AUDIO_IN_Error_CallBack\n");
adustm 0:da04816fb411 329 }