Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: ADXL345 AUDIO_DISCO_F746NG BSP_DISCO_F746NG LCD_DISCO_F746NG SDRAM_DISCO_F746NG TS_DISCO_F746NG mbed-dev
Fork of Workshop_5 by
Revision 0:da04816fb411, committed 2016-03-24
- Comitter:
- adustm
- Date:
- Thu Mar 24 20:32:24 2016 +0000
- Child:
- 1:00e079bad171
- Commit message:
- AUDIO for DISCO_F746NG audioloop basic example
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/AUDIO_DISCO_F746NG.lib Thu Mar 24 20:32:24 2016 +0000 @@ -0,0 +1,1 @@ +AUDIO_DISCO_F746NG#6f035eff38e4
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/BSP_DISCO_F746NG.lib Thu Mar 24 20:32:24 2016 +0000 @@ -0,0 +1,1 @@ +BSP_DISCO_F746NG#7d9191caffa4
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SDRAM_DISCO_F746NG.lib Thu Mar 24 20:32:24 2016 +0000 @@ -0,0 +1,1 @@ +SDRAM_DISCO_F746NG#da3afd33bc07
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Thu Mar 24 20:32:24 2016 +0000
@@ -0,0 +1,136 @@
+#include "mbed.h"
+#include "AUDIO_DISCO_F746NG.h"
+#include "SDRAM_DISCO_F746NG.h"
+
+AUDIO_DISCO_F746NG audio;
+// audio IN_OUT buffer is stored in the SDRAM, SDRAM needs to be initialized and FMC enabled
+SDRAM_DISCO_F746NG sdram;
+
+DigitalOut led_green(LED1);
+DigitalOut led_red(LED2);
+Serial pc(USBTX, USBRX);
+
+typedef enum
+{
+ BUFFER_OFFSET_NONE = 0,
+ BUFFER_OFFSET_HALF = 1,
+ BUFFER_OFFSET_FULL = 2,
+}BUFFER_StateTypeDef;
+
+#define AUDIO_BLOCK_SIZE ((uint32_t)512)
+#define AUDIO_BUFFER_IN SDRAM_DEVICE_ADDR /* In SDRAM */
+#define AUDIO_BUFFER_OUT (SDRAM_DEVICE_ADDR + (AUDIO_BLOCK_SIZE * 2)) /* In SDRAM */
+__IO uint32_t audio_rec_buffer_state = BUFFER_OFFSET_NONE;
+static uint8_t SetSysClock_PLL_HSE_200MHz();
+int main()
+{
+ SetSysClock_PLL_HSE_200MHz();
+ pc.baud(9600);
+
+ pc.printf("\n\nAUDIO LOOPBACK EXAMPLE START:\n");
+ led_red = 0;
+
+ pc.printf("\nAUDIO RECORD INIT OK\n");
+ pc.printf("Microphones sound streamed to headphones\n");
+
+ /* Initialize SDRAM buffers */
+ memset((uint16_t*)AUDIO_BUFFER_IN, 0, AUDIO_BLOCK_SIZE*2);
+ memset((uint16_t*)AUDIO_BUFFER_OUT, 0, AUDIO_BLOCK_SIZE*2);
+ audio_rec_buffer_state = BUFFER_OFFSET_NONE;
+
+ /* Start Recording */
+ audio.IN_Record((uint16_t*)AUDIO_BUFFER_IN, AUDIO_BLOCK_SIZE);
+
+ /* Start Playback */
+ audio.OUT_SetAudioFrameSlot(CODEC_AUDIOFRAME_SLOT_02);
+ audio.OUT_Play((uint16_t*)AUDIO_BUFFER_OUT, AUDIO_BLOCK_SIZE * 2);
+
+
+ while (1) {
+ /* Wait end of half block recording */
+ while(audio_rec_buffer_state == BUFFER_OFFSET_HALF) {
+ }
+ audio_rec_buffer_state = BUFFER_OFFSET_NONE;
+ /* Copy recorded 1st half block */
+ memcpy((uint16_t *)(AUDIO_BUFFER_OUT), (uint16_t *)(AUDIO_BUFFER_IN), AUDIO_BLOCK_SIZE);
+ /* Wait end of one block recording */
+ while(audio_rec_buffer_state == BUFFER_OFFSET_FULL) {
+ }
+ audio_rec_buffer_state = BUFFER_OFFSET_NONE;
+ /* Copy recorded 2nd half block */
+ memcpy((uint16_t *)(AUDIO_BUFFER_OUT + (AUDIO_BLOCK_SIZE)), (uint16_t *)(AUDIO_BUFFER_IN + (AUDIO_BLOCK_SIZE)), AUDIO_BLOCK_SIZE);
+ }
+}
+/*-------------------------------------------------------------------------------------
+ Callbacks implementation:
+ the callbacks API are defined __weak in the stm32746g_discovery_audio.c file
+ and their implementation should be done in the user code if they are needed.
+ Below some examples of callback implementations.
+ -------------------------------------------------------------------------------------*/
+/**
+ * @brief Manages the DMA Transfer complete interrupt.
+ * @param None
+ * @retval None
+ */
+void BSP_AUDIO_IN_TransferComplete_CallBack(void)
+{
+ audio_rec_buffer_state = BUFFER_OFFSET_FULL;
+ return;
+}
+
+/**
+ * @brief Manages the DMA Half Transfer complete interrupt.
+ * @param None
+ * @retval None
+ */
+void BSP_AUDIO_IN_HalfTransfer_CallBack(void)
+{
+ audio_rec_buffer_state = BUFFER_OFFSET_HALF;
+ return;
+}
+
+static uint8_t SetSysClock_PLL_HSE_200MHz()
+{
+ RCC_ClkInitTypeDef RCC_ClkInitStruct;
+ RCC_OscInitTypeDef RCC_OscInitStruct;
+
+ // Enable power clock
+ __PWR_CLK_ENABLE();
+
+ // Enable HSE oscillator and activate PLL with HSE as source
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_ON; /* External xtal on OSC_IN/OSC_OUT */
+
+ // Warning: this configuration is for a 25 MHz xtal clock only
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+ RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
+ RCC_OscInitStruct.PLL.PLLM = 25; // VCO input clock = 1 MHz (25 MHz / 25)
+ RCC_OscInitStruct.PLL.PLLN = 400; // VCO output clock = 400 MHz (1 MHz * 400)
+ RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; // PLLCLK = 200 MHz (400 MHz / 2)
+ RCC_OscInitStruct.PLL.PLLQ = 8; // USB clock = 50 MHz (400 MHz / 8)
+
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ return 0; // FAIL
+ }
+
+ // Activate the OverDrive to reach the 216 MHz Frequency
+ if (HAL_PWREx_EnableOverDrive() != HAL_OK)
+ {
+ return 0; // FAIL
+ }
+
+ // Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers
+ RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 200 MHz
+ RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // 200 MHz
+ RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; // 50 MHz
+ RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; // 100 MHz
+
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_7) != HAL_OK)
+ {
+ return 0; // FAIL
+ }
+ HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_4);
+ return 1; // OK
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-dev.lib Thu Mar 24 20:32:24 2016 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed-dev/#740f8f9b184c
