Guest User

Untitled

a guest
Jun 5th, 2021
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.15 KB | None | 0 0
  1. /* USER CODE BEGIN Header */
  2. /**
  3. ******************************************************************************
  4. * @file : main.c
  5. * @brief : Main program body
  6. ******************************************************************************
  7. * @attention
  8. *
  9. * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
  10. * All rights reserved.</center></h2>
  11. *
  12. * This software component is licensed by ST under BSD 3-Clause license,
  13. * the "License"; You may not use this file except in compliance with the
  14. * License. You may obtain a copy of the License at:
  15. * opensource.org/licenses/BSD-3-Clause
  16. *
  17. ******************************************************************************
  18. */
  19. /* USER CODE END Header */
  20. /* Includes ------------------------------------------------------------------*/
  21.  
  22. #include "main.h"
  23. #include <stdint.h>
  24.  
  25. int RxBuff_inline[4];
  26. int TxBuff_inline[4];
  27.  
  28. uint8_t I2S1_TC = 0;
  29. uint8_t I2S1_HC = 0;
  30.  
  31. void INIT_DMA(void);
  32. void INIT_CLOCK(void);
  33.  
  34. void INIT_CLOCK() {
  35. //Obtaining 480 MHz
  36. //DIVM1: 4
  37. //DIVN1: 60
  38. //DIVP1: 2
  39. //D1CPRE: 1
  40.  
  41. // FLASH_ACR
  42. // MASKING: FLASH_ACR
  43. // RESET Value: 0x37
  44. FLASH -> ACR &= ~FLASH_ACR_LATENCY;
  45. FLASH -> ACR &= ~FLASH_ACR_WRHIGHFREQ;
  46. // WRITING: FLASH_ACR
  47. FLASH -> ACR |= FLASH_ACR_LATENCY_4WS;
  48. FLASH -> ACR |= FLASH_ACR_WRHIGHFREQ_2;
  49. // CHECKING:
  50. if (((FLASH -> ACR) & (FLASH_ACR_LATENCY_4WS)) == FLASH_ACR_LATENCY_4WS){
  51.  
  52. } else{
  53. //NO
  54. }
  55.  
  56.  
  57. // PWR_C3R
  58. // MASKING:
  59. PWR -> CR3 &= ~PWR_CR3_LDOEN;
  60. // WRITING:
  61. PWR -> CR3 |= PWR_CR3_LDOEN;
  62.  
  63.  
  64. // PWR_D3CR
  65. // MASKING:
  66. // PWR -> D3CR &= ~PWR_D3CR_VOS;
  67. // WRITING:
  68. PWR -> D3CR |= PWR_D3CR_VOS1;
  69.  
  70. // RCC_APB4ENR
  71. // MASKING:
  72. RCC -> APB4ENR &= ~RCC_APB4ENR_SYSCFGEN;
  73. // WRITING:
  74. RCC -> APB4ENR |= RCC_APB4ENR_SYSCFGEN;
  75.  
  76. // SYSCFG_PWRCR
  77. // MASKING:
  78. SYSCFG -> PWRCR &= ~SYSCFG_PWRCR_ODEN;
  79. // WRITING:
  80. SYSCFG -> PWRCR |= SYSCFG_PWRCR_ODEN;
  81.  
  82. // PWR_D3CR
  83. // WAITING:
  84. while (((PWR -> D3CR) & (PWR_D3CR_VOSRDY)) == 0){};
  85.  
  86. // RCC_CFGR
  87. // MASKING:
  88. RCC -> CFGR &= ~RCC_CFGR_SW;
  89. // WRITING:
  90. RCC -> CFGR |= RCC_CFGR_SW_PLL1;
  91.  
  92. // RCC_PLL1DIVR
  93. // MASKING:
  94. RCC -> PLL1DIVR &= ~RCC_PLL1DIVR_P1;
  95. RCC -> PLL1DIVR &= ~RCC_PLL1DIVR_N1;
  96. // WRITING:
  97. RCC -> PLL1DIVR |= RCC_PLL1DIVR_P1_2;
  98. RCC -> PLL1DIVR |= RCC_PLL1DIVR_N1_60;
  99.  
  100. // RCC_PLLCKSELR
  101. // MASKING:
  102. RCC -> PLLCKSELR &= ~RCC_PLLCKSELR_DIVM1;
  103. RCC -> PLLCKSELR &= ~RCC_PLLCKSELR_PLLSRC;
  104. // WRITING:
  105. RCC -> PLLCKSELR |= RCC_PLLCKSELR_DIVM1_4;
  106. RCC -> PLLCKSELR |= RCC_PLLCKSELR_PLLSRC_HSI;
  107.  
  108. // RCC_D1CFGR
  109. // MASKING:
  110. RCC -> D1CFGR &= ~RCC_D1CFGR_D1CPRE;
  111. RCC -> D1CFGR &= ~RCC_D1CFGR_HPRE;
  112. RCC -> D1CFGR &= ~RCC_D1CFGR_D1PPRE;
  113. // Writing:
  114. RCC -> D1CFGR |= RCC_D1CFGR_D1CPRE_DIV1;
  115. RCC -> D1CFGR |= RCC_D1CFGR_HPRE_DIV2;
  116. RCC -> D1CFGR |= RCC_D1CFGR_D1PPRE_2;
  117.  
  118.  
  119. // RCC_D2CFGR
  120. // MASKING:
  121. RCC -> D2CFGR &= ~RCC_D2CFGR_D2PPRE1;
  122. RCC -> D2CFGR &= ~RCC_D2CFGR_D2PPRE2;
  123. // WRITING:
  124. RCC -> D2CFGR |= RCC_D2CFGR_D2PPRE1_DIV2;
  125. RCC -> D2CFGR |= RCC_D2CFGR_D2PPRE2_DIV2;
  126.  
  127. // RCC_D3CFGR
  128. // MASKING:
  129. RCC -> D3CFGR &= ~RCC_D3CFGR_D3PPRE;
  130. // WRITING:
  131. RCC -> D3CFGR |= RCC_D3CFGR_D3PPRE_DIV2;
  132.  
  133. // RCC_PLLCFGR
  134. // MASKING:
  135. RCC -> PLLCFGR &= ~RCC_PLLCFGR_PLL1RGE;
  136. RCC -> PLLCFGR &= ~RCC_PLLCFGR_PLL1VCOSEL;
  137. // WRITING:
  138. RCC -> PLLCFGR |= RCC_PLLCFGR_PLL1RGE_8_16;
  139. RCC -> PLLCFGR |= RCC_PLLCFGR_Wide_VCO_Range;
  140. RCC -> PLLCFGR |= RCC_PLLCFGR_DIVP1EN;
  141.  
  142. // RCC_CR
  143. // MASKING:
  144. RCC -> CR &= ~RCC_CR_PLLON;
  145. // WRITING:
  146. RCC -> CR |= RCC_CR_PLLON;
  147. // WAITING:
  148. while (((RCC -> CR) & (RCC_CR_PLL1RDY)) == 0){};
  149. }
  150.  
  151. void INIT_DMA() {
  152.  
  153. //Setting Clock for 192kHz
  154. //N = 122
  155. //P = 4
  156. //M = 10
  157. //FRACT = 7209
  158.  
  159. // RCC_PLL2DIVR
  160. // MASKING:
  161. RCC -> PLL2DIVR &= ~RCC_PLL2DIVR_P2;
  162. RCC -> PLL2DIVR &= ~RCC_PLL2DIVR_N2;
  163. // WRITING:
  164. RCC -> PLL2DIVR |= RCC_PLL2DIVR_P2_DIV8; // P
  165. RCC -> PLL2DIVR |= RCC_PLL2DIVR_N2_MULT122; // N
  166.  
  167. // RCC_PLLCKSELR
  168. // MASKING:
  169. RCC -> PLLCKSELR &= ~RCC_PLLCKSELR_DIVM2;
  170. // WRITING:
  171. RCC -> PLLCKSELR |= RCC_PLLCKSELR_DIVM2_DIV10; // M
  172.  
  173. // RCC_PLL2FRACR
  174. // MASKING:
  175. RCC -> PLL2FRACR &= ~RCC_PLL2FRACR_FRACN2;
  176. // WRITING:
  177. RCC -> PLL2FRACR |= RCC_PLL2FRACR_FRACN_7209; // FRAC
  178.  
  179. // RCC_PLLCFGR
  180. // MASKING:
  181. RCC -> PLLCFGR &= ~RCC_PLLCFGR_DIVP2EN;
  182. RCC -> PLLCFGR &= ~RCC_PLLCFGR_PLL2RGE;
  183. RCC -> PLLCFGR &= ~RCC_PLLCFGR_PLL2VCOSEL;
  184. RCC -> PLLCFGR &= ~RCC_PLLCFGR_PLL2FRACEN;
  185. // WRITING:
  186. RCC -> PLLCFGR |= RCC_PLLCFGR_DIVP2EN;
  187. RCC -> PLLCFGR |= RCC_PLLCFGR_PLL2RGE_4_8;
  188. RCC -> PLLCFGR |= RCC_PLLCFGR_PLL2VCOSEL_192_836;
  189. RCC -> PLLCFGR |= RCC_PLLCFGR_PLL2FRACEN;
  190.  
  191. // RCC_CR
  192. // MASKING:
  193. RCC -> CR &= ~RCC_CR_PLL2ON;
  194. // WRITING:
  195. RCC -> CR |= RCC_CR_PLL2ON;
  196. // WAITING:
  197. while (((RCC -> CR) & (RCC_CR_PLL2RDY)) == 0){};
  198.  
  199. // ENALBING CLOCKS
  200.  
  201. // RCC_AHB4ENR
  202. // MASKING:
  203. RCC -> AHB4ENR &= ~ RCC_AHB4ENR_GPIOAEN;
  204. RCC -> AHB4ENR &= ~ RCC_AHB4ENR_GPIOCEN;
  205. // WRITING:
  206. RCC -> AHB4ENR |= RCC_AHB4ENR_GPIOAEN;
  207. RCC -> AHB4ENR |= RCC_AHB4ENR_GPIOCEN;
  208.  
  209. // RCC_APB2ENR
  210. // MASKING:
  211. RCC -> APB2ENR &= ~RCC_APB2ENR_SPI1EN;
  212. // WRITING:
  213. RCC -> APB2ENR |= RCC_APB2ENR_SPI1EN;
  214.  
  215. // CHANGING CLOCKS OF PERIPHERALS
  216. // RCC_D2CCIP1R
  217. // MASKING;
  218. RCC -> D2CCIP1R &= ~RCC_D2CCIP1R_SPI123SEL;
  219. // WRITING:
  220. RCC -> D2CCIP1R |= RCC_D2CCIP1R_SPI123SEL_PLL2_P_CK;
  221.  
  222. // CHANGING GPIO PINS TO ALETERNATIVE
  223. // GPIOx_MODER
  224. // MASKING
  225. GPIOA -> MODER &= ~GPIO_MODER_MODE4;
  226. GPIOA -> MODER &= ~GPIO_MODER_MODE5;
  227. GPIOA -> MODER &= ~GPIO_MODER_MODE6;
  228. GPIOA -> MODER &= ~GPIO_MODER_MODE7;
  229. GPIOC -> MODER &= ~GPIO_MODER_MODE4;
  230. // WRITING:
  231. GPIOA -> MODER |= GPIO_MODER_MODE4_ALT;
  232. GPIOA -> MODER |= GPIO_MODER_MODE5_ALT;
  233. GPIOA -> MODER |= GPIO_MODER_MODE6_ALT;
  234. GPIOA -> MODER |= GPIO_MODER_MODE7_ALT;
  235. GPIOC -> MODER |= GPIO_MODER_MODE4_ALT;
  236.  
  237.  
  238. GPIOA -> OSPEEDR &= ~GPIO_OSPEEDR_OSPEED7;
  239. GPIOA -> OSPEEDR |= GPIO_OSPEEDR_OSPEED7_VERY_HIGH;
  240.  
  241. //SETTING ALT FUNCTIONS TO PINS
  242. // GPIOx_AFRL
  243. // MASKING:
  244. GPIOA -> AFR[0] &= ~GPIO_AFRL_AFSEL4;
  245. GPIOA -> AFR[0] &= ~GPIO_AFRL_AFSEL5;
  246. GPIOA -> AFR[0] &= ~GPIO_AFRL_AFSEL6;
  247. GPIOA -> AFR[0] &= ~GPIO_AFRL_AFSEL7;
  248. GPIOC -> AFR[0] &= ~GPIO_AFRL_AFSEL4;
  249. // WRITING;
  250. GPIOA -> AFR[0] |= GPIO_AFRL_AFSEL4_AF5;
  251. GPIOA -> AFR[0] |= GPIO_AFRL_AFSEL5_AF5;
  252. GPIOA -> AFR[0] |= GPIO_AFRL_AFSEL6_AF5;
  253. GPIOA -> AFR[0] |= GPIO_AFRL_AFSEL7_AF5;
  254. GPIOC -> AFR[0] |= GPIO_AFRL_AFSEL4_AF5;
  255.  
  256. RCC -> AHB1ENR &= ~RCC_AHB1ENR_DMA1EN;
  257. // WRITING:
  258. RCC -> AHB1ENR |= RCC_AHB1ENR_DMA1EN;
  259.  
  260. // ENABLING DMA1
  261. // RCC_AHB1ENR
  262. // MASKING:
  263. // MASKING:
  264.  
  265.  
  266. // DMA1_Stream0_CR
  267. // DMA1_Stream1_CR
  268. // MASKING:
  269. DMA1_Stream0 -> CR &= ~DMA_SxCR_CT;
  270. DMA1_Stream0 -> CR &= ~DMA_SxCR_PL;
  271. DMA1_Stream0 -> CR &= ~DMA_SxCR_MSIZE;
  272. DMA1_Stream0 -> CR &= ~DMA_SxCR_PSIZE;
  273. DMA1_Stream0 -> CR &= ~DMA_SxCR_MINC;
  274. DMA1_Stream0 -> CR &= ~DMA_SxCR_CIRC;
  275. DMA1_Stream0 -> CR &= ~DMA_SxCR_DIR;
  276. DMA1_Stream0 -> CR &= ~DMA_SxCR_PFCTRL;
  277. DMA1_Stream0 -> CR &= ~DMA_SxCR_TCIE;
  278. DMA1_Stream0 -> CR &= ~DMA_SxCR_HTIE;
  279.  
  280. DMA1_Stream1 -> CR &= ~DMA_SxCR_CT;
  281. DMA1_Stream1 -> CR &= ~DMA_SxCR_PL;
  282. DMA1_Stream1 -> CR &= ~DMA_SxCR_MSIZE;
  283. DMA1_Stream1 -> CR &= ~DMA_SxCR_PSIZE;
  284. DMA1_Stream1 -> CR &= ~DMA_SxCR_MINC;
  285. DMA1_Stream1 -> CR &= ~DMA_SxCR_CIRC;
  286. DMA1_Stream1 -> CR &= ~DMA_SxCR_DIR;
  287. DMA1_Stream1 -> CR &= ~DMA_SxCR_PFCTRL;
  288. // WRITING:
  289. DMA1_Stream0 -> CR |= DMA_SxCR_CT_MEM0;
  290. DMA1_Stream0 -> CR |= DMA_SxCR_PL_Very_High;
  291. DMA1_Stream0 -> CR |= DMA_SxCR_MSIZE_32BIT;
  292. DMA1_Stream0 -> CR |= DMA_SxCR_PSIZE_32BIT;
  293. DMA1_Stream0 -> CR |= DMA_SxCR_MINC;
  294. DMA1_Stream0 -> CR |= DMA_SxCR_CIRC;
  295. DMA1_Stream0 -> CR |= DMA_SxCR_DIR_P_TO_M;
  296. DMA1_Stream0 -> CR |= DMA_SxCR_PFCTRL_DMAFLOW;
  297. DMA1_Stream0 -> CR |= DMA_SxCR_TCIE;
  298. DMA1_Stream0 -> CR |= DMA_SxCR_HTIE;
  299.  
  300. DMA1_Stream1 -> CR |= DMA_SxCR_CT_MEM0;
  301. DMA1_Stream1 -> CR |= DMA_SxCR_PL_Very_High;
  302. DMA1_Stream1 -> CR |= DMA_SxCR_MSIZE_32BIT;
  303. DMA1_Stream1 -> CR |= DMA_SxCR_PSIZE_32BIT;
  304. DMA1_Stream1 -> CR |= DMA_SxCR_MINC;
  305. DMA1_Stream1 -> CR |= DMA_SxCR_CIRC;
  306. DMA1_Stream1 -> CR |= DMA_SxCR_DIR_M_TO_P;
  307. DMA1_Stream1 -> CR |= DMA_SxCR_PFCTRL_DMAFLOW;
  308.  
  309. // DMA_SxNDTR
  310. // WRITING:
  311. DMA1_Stream0 -> NDTR = 0x4;
  312. DMA1_Stream1 -> NDTR = 0x4;
  313.  
  314. // DMA_SxPAR
  315. // WRITING:
  316. DMA1_Stream0 -> PAR = (uint32_t) & SPI1 -> RXDR;
  317. DMA1_Stream1 -> PAR = (uint32_t) & SPI1 -> TXDR;
  318.  
  319. // DMA_SxM0AR
  320. // WRITING:
  321. DMA1_Stream0 -> M0AR = (uint32_t) RxBuff_inline;
  322. DMA1_Stream1 -> M0AR = (uint32_t) TxBuff_inline;
  323.  
  324. // DMA_SxCR
  325. // WRITING:
  326. DMA1_Stream0 -> CR |= DMA_SxCR_EN;
  327. DMA1_Stream1 -> CR |= DMA_SxCR_EN;
  328.  
  329. DMAMUX1_Channel0 -> CCR &= ~DMAMUX_CxCR_DMAREQ_ID;
  330. DMAMUX1_Channel1 -> CCR &= ~DMAMUX_CxCR_DMAREQ_ID;
  331. // WRITING:
  332. DMAMUX1_Channel0 -> CCR |= DMAMUX_CxCR_DMAREQ_ID_SPI1_Rx; //Rx
  333. DMAMUX1_Channel1 -> CCR |= DMAMUX_CxCR_DMAREQ_ID_SPI1_Tx; //Tx
  334.  
  335. // Setting up the SPI/I2S Peripheral
  336. // MASKING:
  337. SPI1->I2SCFGR = 0x00;
  338. SPI1 -> CFG1 |= SPI_CFG1_RXDMAEN;
  339. SPI1 -> CFG1 |= SPI_CFG1_TXDMAEN |
  340. (SPI_CFG1_FTHLV_4_Data);
  341. SPI1->I2SCFGR |= (SPI_I2SCFGR_MCKOE) |
  342. (SPI_I2SCFGR_I2SDIV_2) |
  343. (SPI_I2SCFGR_I2SSTD_I2STAND) |
  344. (SPI_I2SCFGR_DATFMT_LAlign) |
  345. (SPI_I2SCFGR_I2SCFG_MASTER_FULLDUPLEX) |
  346. (SPI_I2SCFGR_I2SMOD_I2S_PCM_MODE);
  347. SPI1->I2SCFGR |= (SPI_I2SCFGR_CHNEL_32BIT_WIDE);
  348. SPI1->I2SCFGR |= (SPI_I2SCFGR_DATALEN_24BIT);
  349. SPI1->CR1 |= SPI_CR1_SPE;
  350. SPI1->CR1 |= SPI_CR1_CSTART;
  351.  
  352. NVIC_EnableIRQ(DMA1_Stream0_IRQn);
  353. NVIC_SetPriority(DMA1_Stream0_IRQn,0);
  354. }
  355.  
  356.  
  357. int main (void) {
  358.  
  359. INIT_CLOCK();
  360. INIT_DMA();
  361.  
  362. while (1) {
  363.  
  364.  
  365.  
  366.  
  367. if (I2S1_HC == 1) {
  368. for (int i = 0; i < 2; i++) {
  369. TxBuff_inline[i] = RxBuff_inline[i];
  370. }
  371. I2S1_HC = 0;
  372. }
  373.  
  374. if (I2S1_TC == 1) {
  375. for (int i = 2; i < 4; i++) {
  376. TxBuff_inline[i] = RxBuff_inline[i];
  377. }
  378. I2S1_TC = 0;
  379. }
  380.  
  381.  
  382. }
  383.  
  384.  
  385. }
  386.  
  387.  
  388. void DMA1_Stream0_IRQHandler() {
  389.  
  390. if (((DMA1->LISR) & (DMA_LISR_HTIF0)) != 0) {
  391. DMA1->LIFCR |= DMA_LIFCR_CHTIF0;
  392.  
  393. I2S1_HC = 1;
  394. }
  395.  
  396. if (((DMA1->LISR) & (DMA_LISR_TCIF0)) != 0) {
  397. DMA1->LIFCR |= DMA_LIFCR_CTCIF0;
  398.  
  399. I2S1_TC = 1;
  400. }
  401. }
Advertisement
Add Comment
Please, Sign In to add comment