DISCO-F746NGのAudioOutから正弦波をスイープとして出力します。ダブルバッファリングを使って、リアルタイムにデータ生成をしています。 This program outputs sine sweep from AudioOut on DISCO-F746NG. The program uses double buffering when generates data signals.

Dependencies:   BSP_DISCO_F746NG_patch_fixed LCD_DISCO_F746NG mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers BSP_overwrite.cpp Source File

BSP_overwrite.cpp

00001 #include "main.h"
00002 
00003 void BSP_AUDIO_OUT_HalfTransfer_CallBack(void)
00004 {
00005     fill_buffer(0, BufferSize / 2);
00006     BSP_AUDIO_OUT_ChangeBuffer((uint16_t*)&sweep_buffer[0], BufferByteSize / 2);
00007 }
00008 
00009 void BSP_AUDIO_OUT_TransferComplete_CallBack(void)
00010 {
00011     fill_buffer(BufferSize / 2, BufferSize / 2);
00012     BSP_AUDIO_OUT_ChangeBuffer((uint16_t*)&sweep_buffer[BufferSize / 2], BufferByteSize / 2);
00013 }
00014 
00015 void BSP_AUDIO_OUT_Error_CallBack(void)
00016 {
00017     error_trap();
00018 }
00019 
00020 DMA_HandleTypeDef hdma_sai_tx;
00021 
00022 void AUDIO_OUT_SAIx_DMAx_IRQHandler(void)
00023 {
00024     HAL_DMA_IRQHandler(&hdma_sai_tx);
00025 }
00026 
00027 void BSP_AUDIO_OUT_MspInit(SAI_HandleTypeDef *hsai, void *Params)
00028 {
00029     //static DMA_HandleTypeDef hdma_sai_tx;
00030     GPIO_InitTypeDef  gpio_init_structure;
00031 
00032     /* Enable SAI clock */
00033     AUDIO_OUT_SAIx_CLK_ENABLE();
00034 
00035     /* Enable GPIO clock */
00036     AUDIO_OUT_SAIx_MCLK_ENABLE();
00037     AUDIO_OUT_SAIx_SCK_SD_ENABLE();
00038     AUDIO_OUT_SAIx_FS_ENABLE();
00039 
00040     /* CODEC_SAI pins configuration: FS, SCK, MCK and SD pins ------------------*/
00041     gpio_init_structure.Pin = AUDIO_OUT_SAIx_FS_PIN;
00042     gpio_init_structure.Mode = GPIO_MODE_AF_PP;
00043     gpio_init_structure.Pull = GPIO_NOPULL;
00044     gpio_init_structure.Speed = GPIO_SPEED_HIGH;
00045     gpio_init_structure.Alternate = AUDIO_OUT_SAIx_FS_SD_MCLK_AF;
00046     HAL_GPIO_Init(AUDIO_OUT_SAIx_FS_GPIO_PORT, &gpio_init_structure);
00047 
00048     gpio_init_structure.Pin = AUDIO_OUT_SAIx_SCK_PIN;
00049     gpio_init_structure.Mode = GPIO_MODE_AF_PP;
00050     gpio_init_structure.Pull = GPIO_NOPULL;
00051     gpio_init_structure.Speed = GPIO_SPEED_HIGH;
00052     gpio_init_structure.Alternate = AUDIO_OUT_SAIx_SCK_AF;
00053     HAL_GPIO_Init(AUDIO_OUT_SAIx_SCK_SD_GPIO_PORT, &gpio_init_structure);
00054 
00055     gpio_init_structure.Pin =  AUDIO_OUT_SAIx_SD_PIN;
00056     gpio_init_structure.Mode = GPIO_MODE_AF_PP;
00057     gpio_init_structure.Pull = GPIO_NOPULL;
00058     gpio_init_structure.Speed = GPIO_SPEED_HIGH;
00059     gpio_init_structure.Alternate = AUDIO_OUT_SAIx_FS_SD_MCLK_AF;
00060     HAL_GPIO_Init(AUDIO_OUT_SAIx_SCK_SD_GPIO_PORT, &gpio_init_structure);
00061 
00062     gpio_init_structure.Pin = AUDIO_OUT_SAIx_MCLK_PIN;
00063     gpio_init_structure.Mode = GPIO_MODE_AF_PP;
00064     gpio_init_structure.Pull = GPIO_NOPULL;
00065     gpio_init_structure.Speed = GPIO_SPEED_HIGH;
00066     gpio_init_structure.Alternate = AUDIO_OUT_SAIx_FS_SD_MCLK_AF;
00067     HAL_GPIO_Init(AUDIO_OUT_SAIx_MCLK_GPIO_PORT, &gpio_init_structure);
00068 
00069     /* Enable the DMA clock */
00070     AUDIO_OUT_SAIx_DMAx_CLK_ENABLE();
00071 
00072     if(hsai->Instance == AUDIO_OUT_SAIx) {
00073         /* Configure the hdma_saiTx handle parameters */
00074         hdma_sai_tx.Init.Channel             = AUDIO_OUT_SAIx_DMAx_CHANNEL;
00075         hdma_sai_tx.Init.Direction           = DMA_MEMORY_TO_PERIPH;
00076         hdma_sai_tx.Init.PeriphInc           = DMA_PINC_DISABLE;
00077         hdma_sai_tx.Init.MemInc              = DMA_MINC_ENABLE;
00078         hdma_sai_tx.Init.PeriphDataAlignment = AUDIO_OUT_SAIx_DMAx_PERIPH_DATA_SIZE;
00079         hdma_sai_tx.Init.MemDataAlignment    = AUDIO_OUT_SAIx_DMAx_MEM_DATA_SIZE;
00080         hdma_sai_tx.Init.Mode                = DMA_CIRCULAR;
00081         hdma_sai_tx.Init.Priority            = DMA_PRIORITY_HIGH;
00082         hdma_sai_tx.Init.FIFOMode            = DMA_FIFOMODE_ENABLE;
00083         hdma_sai_tx.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL;
00084         hdma_sai_tx.Init.MemBurst            = DMA_MBURST_SINGLE;
00085         hdma_sai_tx.Init.PeriphBurst         = DMA_PBURST_SINGLE;
00086 
00087         hdma_sai_tx.Instance = AUDIO_OUT_SAIx_DMAx_STREAM;
00088 
00089         /* Associate the DMA handle */
00090         __HAL_LINKDMA(hsai, hdmatx, hdma_sai_tx);
00091 
00092         /* Deinitialize the Stream for new transfer */
00093         HAL_DMA_DeInit(&hdma_sai_tx);
00094 
00095         /* Configure the DMA Stream */
00096         HAL_DMA_Init(&hdma_sai_tx);
00097     }
00098     
00099     /* SAI DMA IRQ Channel configuration */
00100     HAL_NVIC_SetPriority(AUDIO_OUT_SAIx_DMAx_IRQ, AUDIO_OUT_IRQ_PREPRIO, 0);
00101     HAL_NVIC_EnableIRQ(AUDIO_OUT_SAIx_DMAx_IRQ);
00102 }