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: ST_401_84MHZ mbed
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
Generated on Sun Jul 24 2022 03:56:57 by
1.7.2