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

BSP_overwrite.cpp

Committer:
nanase
Date:
2015-12-26
Revision:
0:ece4ec581d2b

File content as of revision 0:ece4ec581d2b:

#include "main.h"

void BSP_AUDIO_OUT_HalfTransfer_CallBack(void)
{
    fill_buffer(0, BufferSize / 2);
    BSP_AUDIO_OUT_ChangeBuffer((uint16_t*)&sweep_buffer[0], BufferByteSize / 2);
}

void BSP_AUDIO_OUT_TransferComplete_CallBack(void)
{
    fill_buffer(BufferSize / 2, BufferSize / 2);
    BSP_AUDIO_OUT_ChangeBuffer((uint16_t*)&sweep_buffer[BufferSize / 2], BufferByteSize / 2);
}

void BSP_AUDIO_OUT_Error_CallBack(void)
{
    error_trap();
}

DMA_HandleTypeDef hdma_sai_tx;

void AUDIO_OUT_SAIx_DMAx_IRQHandler(void)
{
    HAL_DMA_IRQHandler(&hdma_sai_tx);
}

void BSP_AUDIO_OUT_MspInit(SAI_HandleTypeDef *hsai, void *Params)
{
    //static DMA_HandleTypeDef hdma_sai_tx;
    GPIO_InitTypeDef  gpio_init_structure;

    /* Enable SAI clock */
    AUDIO_OUT_SAIx_CLK_ENABLE();

    /* Enable GPIO clock */
    AUDIO_OUT_SAIx_MCLK_ENABLE();
    AUDIO_OUT_SAIx_SCK_SD_ENABLE();
    AUDIO_OUT_SAIx_FS_ENABLE();

    /* CODEC_SAI pins configuration: FS, SCK, MCK and SD pins ------------------*/
    gpio_init_structure.Pin = AUDIO_OUT_SAIx_FS_PIN;
    gpio_init_structure.Mode = GPIO_MODE_AF_PP;
    gpio_init_structure.Pull = GPIO_NOPULL;
    gpio_init_structure.Speed = GPIO_SPEED_HIGH;
    gpio_init_structure.Alternate = AUDIO_OUT_SAIx_FS_SD_MCLK_AF;
    HAL_GPIO_Init(AUDIO_OUT_SAIx_FS_GPIO_PORT, &gpio_init_structure);

    gpio_init_structure.Pin = AUDIO_OUT_SAIx_SCK_PIN;
    gpio_init_structure.Mode = GPIO_MODE_AF_PP;
    gpio_init_structure.Pull = GPIO_NOPULL;
    gpio_init_structure.Speed = GPIO_SPEED_HIGH;
    gpio_init_structure.Alternate = AUDIO_OUT_SAIx_SCK_AF;
    HAL_GPIO_Init(AUDIO_OUT_SAIx_SCK_SD_GPIO_PORT, &gpio_init_structure);

    gpio_init_structure.Pin =  AUDIO_OUT_SAIx_SD_PIN;
    gpio_init_structure.Mode = GPIO_MODE_AF_PP;
    gpio_init_structure.Pull = GPIO_NOPULL;
    gpio_init_structure.Speed = GPIO_SPEED_HIGH;
    gpio_init_structure.Alternate = AUDIO_OUT_SAIx_FS_SD_MCLK_AF;
    HAL_GPIO_Init(AUDIO_OUT_SAIx_SCK_SD_GPIO_PORT, &gpio_init_structure);

    gpio_init_structure.Pin = AUDIO_OUT_SAIx_MCLK_PIN;
    gpio_init_structure.Mode = GPIO_MODE_AF_PP;
    gpio_init_structure.Pull = GPIO_NOPULL;
    gpio_init_structure.Speed = GPIO_SPEED_HIGH;
    gpio_init_structure.Alternate = AUDIO_OUT_SAIx_FS_SD_MCLK_AF;
    HAL_GPIO_Init(AUDIO_OUT_SAIx_MCLK_GPIO_PORT, &gpio_init_structure);

    /* Enable the DMA clock */
    AUDIO_OUT_SAIx_DMAx_CLK_ENABLE();

    if(hsai->Instance == AUDIO_OUT_SAIx) {
        /* Configure the hdma_saiTx handle parameters */
        hdma_sai_tx.Init.Channel             = AUDIO_OUT_SAIx_DMAx_CHANNEL;
        hdma_sai_tx.Init.Direction           = DMA_MEMORY_TO_PERIPH;
        hdma_sai_tx.Init.PeriphInc           = DMA_PINC_DISABLE;
        hdma_sai_tx.Init.MemInc              = DMA_MINC_ENABLE;
        hdma_sai_tx.Init.PeriphDataAlignment = AUDIO_OUT_SAIx_DMAx_PERIPH_DATA_SIZE;
        hdma_sai_tx.Init.MemDataAlignment    = AUDIO_OUT_SAIx_DMAx_MEM_DATA_SIZE;
        hdma_sai_tx.Init.Mode                = DMA_CIRCULAR;
        hdma_sai_tx.Init.Priority            = DMA_PRIORITY_HIGH;
        hdma_sai_tx.Init.FIFOMode            = DMA_FIFOMODE_ENABLE;
        hdma_sai_tx.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL;
        hdma_sai_tx.Init.MemBurst            = DMA_MBURST_SINGLE;
        hdma_sai_tx.Init.PeriphBurst         = DMA_PBURST_SINGLE;

        hdma_sai_tx.Instance = AUDIO_OUT_SAIx_DMAx_STREAM;

        /* Associate the DMA handle */
        __HAL_LINKDMA(hsai, hdmatx, hdma_sai_tx);

        /* Deinitialize the Stream for new transfer */
        HAL_DMA_DeInit(&hdma_sai_tx);

        /* Configure the DMA Stream */
        HAL_DMA_Init(&hdma_sai_tx);
    }
    
    /* SAI DMA IRQ Channel configuration */
    HAL_NVIC_SetPriority(AUDIO_OUT_SAIx_DMAx_IRQ, AUDIO_OUT_IRQ_PREPRIO, 0);
    HAL_NVIC_EnableIRQ(AUDIO_OUT_SAIx_DMAx_IRQ);
}