p igmon / Mbed 2 deprecated DMA_I2S_Test

Dependencies:   ST_401_84MHZ mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 /*
00002     Nucleo F401RE Board
00003     DMA Transmit sample   
00004 
00005     I2S Master Transmit (Enable MCK out)
00006     Phillips Format 16bit
00007     Dubble DMA Buffer
00008 
00009 
00010 
00011 
00012 */
00013 
00014 #include "mbed.h"
00015 #include <math.h>
00016 #include "cmsis.h"
00017 #include "pinmap.h"
00018 #include "PinNames.h"
00019 #include "error.h"
00020 #include "stm32f401xe.h"
00021 #include "stm32f4xx.h"
00022 #include "stm32f4xx_hal.h"
00023 #include "stm32f4xx_hal_dma_ex.h"
00024 #include "stm32f4xx_hal_dma.h"
00025 #include "stm32f4xx_hal_i2s.h"
00026 #include "sine_wave.h"
00027 #include "saw_wave.h"
00028 #include "ST_F401_84MHZ.h" 
00029 
00030 Serial pc(SERIAL_TX, SERIAL_RX);
00031 DigitalOut myled(LED1);
00032 
00033 #define I2S_BUFFERSIZE 256
00034 #define DMA_TRANSFERCOUNT (I2S_BUFFERSIZE<<1) 
00035 int16_t dmabuffer[2][DMA_TRANSFERCOUNT];//DMA Double Buffer
00036 
00037 static const PinMap PinMap_I2S_MCK[] = {
00038     {PC_6,  SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
00039 //    {PC_7,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
00040     {NC,    NC,    0}
00041 };
00042 
00043 static const PinMap PinMap_I2S_CK[] = {
00044     {PB_10,  SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
00045     {PB_13,  SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
00046 //    {PD_3,  SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
00047 //    {PC_10,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
00048     {NC,    NC,    0}
00049 };
00050 
00051 static const PinMap PinMap_I2S_WS[] = {
00052     {PB_12,  SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
00053     {PB_9,  SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
00054 //    {PA_15,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
00055     {NC,    NC,    0}
00056 };
00057 
00058 static const PinMap PinMap_I2S_SD[] = {
00059     {PC_3,  SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
00060     {PB_15,  SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
00061 //    {PC_12,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
00062 //    {PD_6,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI3)},
00063     {NC,    NC,    0}
00064 };
00065 
00066    
00067   DMA_InitTypeDef DMA_InitType ={
00068     DMA_CHANNEL_0,
00069     DMA_MEMORY_TO_PERIPH,
00070     DMA_PINC_DISABLE,
00071     DMA_MINC_ENABLE,             
00072     DMA_PDATAALIGN_HALFWORD,
00073     DMA_MDATAALIGN_WORD,
00074     DMA_CIRCULAR,//DMA_PFCTRL,//
00075     DMA_PRIORITY_HIGH,
00076     DMA_FIFOMODE_DISABLE,//DMA_FIFOMODE_ENABLE,
00077     DMA_FIFO_THRESHOLD_HALFFULL,
00078     DMA_MBURST_SINGLE,
00079     DMA_PBURST_SINGLE
00080    };
00081 
00082 DMA_HandleTypeDef DMA_HandleType ={
00083     DMA1_Stream4,
00084     DMA_InitType,
00085     HAL_UNLOCKED,
00086     HAL_DMA_STATE_RESET,//HAL_DMA_STATE_READY
00087     NULL,
00088     NULL,
00089     NULL,
00090     NULL,
00091     NULL,
00092     NULL    
00093 };
00094 
00095 I2S_InitTypeDef my_I2S_InitType ={
00096     I2S_MODE_MASTER_TX,
00097     I2S_STANDARD_PHILLIPS,
00098     I2S_DATAFORMAT_16B,
00099     I2S_MCLKOUTPUT_ENABLE,
00100     I2S_AUDIOFREQ_44K,
00101     I2S_CPOL_LOW,
00102     I2S_CLOCK_PLL,
00103     I2S_FULLDUPLEXMODE_DISABLE    
00104 };
00105 
00106 HAL_I2S_StateTypeDef my_I2S_StateTypeDef={
00107    HAL_I2S_STATE_RESET     
00108 };
00109 
00110 HAL_I2S_ErrorTypeDef my_I2S_ErorTypeDef={
00111     HAL_I2S_ERROR_NONE
00112 };
00113     
00114 I2S_HandleTypeDef my_I2S_HandleTypeDef = {
00115      SPI2,
00116      my_I2S_InitType,
00117      (uint16_t*)&dmabuffer[0][0],  
00118      I2S_BUFFERSIZE,
00119      NULL,
00120      NULL,
00121      NULL,
00122      NULL,
00123      &DMA_HandleType,//&my_DMA_HamdleType,    
00124      NULL,
00125      HAL_UNLOCKED, 
00126      my_I2S_StateTypeDef,
00127      my_I2S_ErorTypeDef  
00128 };    
00129 
00130 void init_dmabuffer(void){
00131     for (int i =0;i < I2S_BUFFERSIZE;i++){
00132         dmabuffer[0][i*2] = sine_wave[i];// 1st Buffer Lch 
00133         dmabuffer[0][i*2+1] = saw_wave[i];// 1nd Buffer Rch 
00134         dmabuffer[1][i*2] = sine_wave[i];// 2nd Buffer Lch
00135         dmabuffer[1][i*2+1] = saw_wave[i];// 2nd Buffer Rch
00136     }
00137 }
00138 
00139 #define PLLI2S_N  271
00140 #define PLLI2S_R  2
00141     
00142 int main() {
00143     F401_init84 myinit(0); 
00144     pc.baud(9600);
00145     pc.printf("CPU SystemCoreClock is %d Hz\r\n", SystemCoreClock);
00146     init_dmabuffer();
00147     
00148     /* Configure the I2S PLL */
00149     RCC->PLLI2SCFGR = (PLLI2S_N << 6) | (PLLI2S_R << 28);
00150     /* Enable the I2S PLL */
00151     RCC->CR |= RCC_CR_PLLI2SON;
00152     /* Wait until the I2S PLL is ready */
00153     while (!(RCC->CR & RCC_CR_PLLI2SRDY));
00154 
00155     __SPI2_CLK_ENABLE();
00156     __DMA1_CLK_ENABLE();
00157 
00158     pinmap_pinout(PC_6, PinMap_I2S_MCK);
00159     pinmap_pinout(PB_13, PinMap_I2S_CK);
00160     pinmap_pinout(PB_12, PinMap_I2S_WS);
00161     pinmap_pinout(PB_15, PinMap_I2S_SD);
00162 
00163     pin_mode(PC_6, PullUp);
00164     pin_mode(PB_13, PullUp);
00165     pin_mode(PB_12, PullUp);
00166     pin_mode(PB_15, PullUp);
00167  
00168     if(HAL_DMA_Init(&DMA_HandleType)!= HAL_OK) pc.printf("Eror in HAL_DMA_Init \n\r");
00169     
00170     if (HAL_I2S_Init(&my_I2S_HandleTypeDef)!= HAL_OK)  pc.printf("Eror in HAL_I2S_Init \n\r");
00171 
00172     volatile uint32_t *I2S_DR = &SPI2->DR; 
00173     if(HAL_DMAEx_MultiBufferStart_IT(&DMA_HandleType ,(uint32_t)&dmabuffer[0][0] ,(uint32_t )I2S_DR ,(uint32_t)&dmabuffer[1][0] ,DMA_TRANSFERCOUNT)!=HAL_OK) pc.printf("Eror in HAL_DMAEx_MultiBufferStart_IT \n\r");
00174 
00175      SPI2->I2SCFGR |= SPI_I2SCFGR_I2SE;
00176      /* Enable Tx DMA Request */  
00177      SPI2->CR2 |= SPI_CR2_TXDMAEN;
00178 
00179     pc.printf("DMA M0AR =%4x M1AR =%4x PAR = %4x \n\r"  ,DMA1_Stream4->M0AR  ,DMA1_Stream4->M1AR ,DMA1_Stream4->PAR);
00180     pc.printf("I2S CR2 = %4x \n\r" ,SPI2->CR2);
00181     pc.printf("I2S SR = %4x \n\r" ,SPI2->SR);
00182     pc.printf("I2S I2SCFGR = %4x \n\r" ,SPI2->I2SCFGR);
00183     pc.printf("I2S I2SPR = %4x \n\r" ,SPI2->I2SPR);
00184     pc.printf("RCC->PLLI2SCFGR = %4x \n\r" ,RCC->PLLI2SCFGR);
00185  
00186     HAL_RCC_MCOConfig(uint32_t RCC_MCO2, RCC_MCO2SOURCE_PLLI2SCLK, RCC_MCODIV_5);
00187  
00188   while(1) { 
00189         wait_ms(500);
00190   }
00191 }
00192