Advertisement
Guest User

Untitled

a guest
Jun 7th, 2021
327
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.01 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.  
  24. #include <stdint.h>
  25.  
  26.  int I2S1_TxBUFF[4];
  27.  int I2S1_RxBUFF[4];
  28.  
  29. uint8_t I2S1_TC = 0;
  30. uint8_t I2S1_HC = 0;
  31.  
  32. void INIT_DMA(void);
  33. void INIT_CLOCK(void);
  34. void INIT_GPIO(void);
  35. void INIT_I2S(void);
  36. void INIT_INTERRUPT(void);
  37.  
  38. void INIT_CLOCK() {
  39.  
  40.     FLASH -> ACR &= ~((FLASH_ACR_LATENCY)   |
  41.                          (FLASH_ACR_WRHIGHFREQ));
  42.  
  43.         FLASH -> ACR |= (FLASH_ACR_LATENCY_4WS) |
  44.                         (FLASH_ACR_WRHIGHFREQ_2);
  45.         RCC -> APB4ENR &= ~(RCC_APB4ENR_SYSCFGEN);
  46.             RCC -> APB4ENR |= (RCC_APB4ENR_SYSCFGEN);
  47.  
  48.             PWR -> D3CR &= ~(PWR_D3CR_VOS);
  49.             PWR -> D3CR |= PWR_D3CR_VOS_SCALE1;
  50.  
  51.             PWR ->CR3 &= ~(PWR_CR3_LDOEN);
  52.             PWR ->CR3 |= (PWR_CR3_LDOEN);
  53.  
  54.             SYSCFG -> PWRCR |= (SYSCFG_PWRCR_ODEN);
  55.  
  56.             while (!((PWR -> D3CR) & (PWR_D3CR_VOSRDY)));
  57.  
  58.             RCC -> PLLCKSELR &= ~(RCC_PLLCKSELR_DIVM1);
  59.                 RCC -> PLLCKSELR |= (RCC_PLLCKSELR_DIVM1_DIV4);
  60.  
  61.                 RCC -> PLLCFGR   &= ~(RCC_PLLCFGR_PLL1RGE);
  62.                 RCC -> PLLCFGR   |=  (RCC_PLLCFGR_PLL1RGE_8MHz_16MHz);
  63.  
  64.                 RCC -> PLL1DIVR  &= ~ (RCC_PLL1DIVR_N1);
  65.                 RCC -> PLL1DIVR  |= (RCC_PLL1DIVR_N1_60);
  66.  
  67.                 RCC -> D1CFGR |= (RCC_D1CFGR_HPRE_DIV2)  |
  68.                                  (RCC_D1CFGR_D1PPRE_DIV2);
  69.  
  70.                 if (((RCC->D1CFGR) & (RCC_D1CFGR_HPRE_DIV2)) != RCC_D1CFGR_HPRE_DIV2) {
  71.  
  72.                     //exit(0);
  73.                 }
  74.  
  75.                 if (((RCC->D1CFGR) & (RCC_D1CFGR_D1PPRE_DIV2)) != RCC_D1CFGR_D1PPRE_DIV2) {
  76.  
  77.                     //exit(0);
  78.                 }
  79.  
  80.                 RCC -> D2CFGR |= (RCC_D2CFGR_D2PPRE1_DIV2) |
  81.                                  (RCC_D2CFGR_D2PPRE2_DIV2);
  82.  
  83.                 RCC -> D3CFGR |= RCC_D3CFGR_D3PPRE_DIV2;
  84.  
  85.                 RCC -> CR     |= RCC_CR_PLL1ON;
  86.  
  87.                 while (!((RCC -> CR) & (RCC_CR_PLL1RDY)));
  88.  
  89.                 RCC -> CFGR &= ~(RCC_CFGR_SW);
  90.                 RCC -> CFGR |= RCC_CFGR_SW_PLL1;
  91.  
  92.                 if ((( RCC -> CFGR) & (RCC_CFGR_SWS)) != (RCC_CFGR_SWS_PLL1)) {
  93.  
  94.                     //exit(0);
  95.                }
  96. }
  97.  
  98. void INIT_GPIO() {
  99.  
  100.     // ! ---- PINS USED
  101.     // PA4 = I2S1_WS
  102.     // PA5 = I2S1_CK
  103.     // PA6 = MISO
  104.     // PA7 = MOSI
  105.     // PC4 = MCK
  106.  
  107.     // GPIOA & C Clock
  108.     RCC->AHB4ENR &= ~((RCC_AHB4ENR_GPIOAEN) |
  109.                       (RCC_AHB4ENR_GPIOCEN));
  110.  
  111.     RCC->AHB4ENR |= (RCC_AHB4ENR_GPIOAEN) |
  112.                     (RCC_AHB4ENR_GPIOCEN);
  113.  
  114.  
  115.     GPIOA->MODER &= ~((GPIO_MODER_MODE4) |
  116.                       (GPIO_MODER_MODE5) |
  117.                       (GPIO_MODER_MODE6) |
  118.                       (GPIO_MODER_MODE7));
  119.  
  120.     GPIOA->MODER |= (GPIO_MODER_MODE4_AF) |
  121.                     (GPIO_MODER_MODE5_AF) |
  122.                     (GPIO_MODER_MODE6_AF) |
  123.                     (GPIO_MODER_MODE7_AF);
  124.  
  125.     GPIOC->MODER &= ~(GPIO_MODER_MODE4);
  126.     GPIOC->MODER |=  (GPIO_MODER_MODE4_AF);
  127.  
  128.  
  129.     GPIOA->OSPEEDR &= ~((GPIO_OSPEEDR_OSPEED4) |
  130.                         (GPIO_OSPEEDR_OSPEED5) |
  131.                         (GPIO_OSPEEDR_OSPEED6) |
  132.                         (GPIO_OSPEEDR_OSPEED7));
  133.  
  134.     GPIOA->OSPEEDR |=   (GPIO_OSPEEDR_OSPEED4_VERY_HIGH_SPEED) |
  135.                         (GPIO_OSPEEDR_OSPEED5_VERY_HIGH_SPEED) |
  136.                         (GPIO_OSPEEDR_OSPEED6_VERY_HIGH_SPEED) |
  137.                         (GPIO_OSPEEDR_OSPEED7_VERY_HIGH_SPEED);
  138.  
  139.     GPIOC->OSPEEDR &= ~((GPIO_OSPEEDR_OSPEED4));
  140.     GPIOC->OSPEEDR |=   (GPIO_OSPEEDR_OSPEED4_VERY_HIGH_SPEED);
  141.  
  142.     GPIOA->AFR[0] &= ~((GPIO_AFRL_AFSEL4) |
  143.                        (GPIO_AFRL_AFSEL5) |
  144.                        (GPIO_AFRL_AFSEL6) |
  145.                        (GPIO_AFRL_AFSEL7));
  146.  
  147.     GPIOA->AFR[0] |=   (GPIO_AFRL_AFSEL4_I2S1_WS)   |
  148.                        (GPIO_AFRL_AFSEL5_I2S1_CK)   |
  149.                        (GPIO_AFRL_AFSEL6_I2S1_MISO) |
  150.                        (GPIO_AFRL_AFSEL7_I2S1_MOSI);
  151.  
  152.     GPIOC->AFR[0] &= ~(GPIO_AFRL_AFSEL4);
  153.     GPIOC->AFR[0] |=  (GPIO_AFRL_AFSEL4_I2S1_MCK);
  154. }
  155.  
  156. void INIT_DMA() {
  157.  
  158.     // ENABLE DMA
  159.     RCC->AHB1ENR &= ~(RCC_AHB1ENR_DMA1EN);
  160.     RCC->AHB1ENR |= RCC_AHB1ENR_DMA1EN;
  161.  
  162.     //Setup DMA
  163.     DMAMUX1_Channel0->CCR &= ~(DMAMUX_CxCR_DMAREQ_ID);
  164.     DMAMUX1_Channel0->CCR |=  (DMAMUX_CxCR_DMAREQ_ID_I2S1_Rx);
  165.  
  166.     DMAMUX1_Channel1->CCR &= ~(DMAMUX_CxCR_DMAREQ_ID);
  167.     DMAMUX1_Channel1->CCR |=  (DMAMUX_CxCR_DMAREQ_ID_I2S1_Tx);
  168.  
  169.     DMA1_Stream0->CR &= ~((DMA_SxCR_CT)    |
  170.                           (DMA_SxCR_PL)    |
  171.                           (DMA_SxCR_MSIZE) |
  172.                           (DMA_SxCR_PSIZE) |
  173.                           (DMA_SxCR_MINC)  |
  174.                           (DMA_SxCR_CIRC)  |
  175.                           (DMA_SxCR_DIR)   |
  176.                           (DMA_SxCR_PFCTRL)|
  177.                           (DMA_SxCR_TCIE)  |
  178.                           (DMA_SxCR_HTIE));
  179.  
  180.     DMA1_Stream0->CR |=   (DMA_SxCR_CT_MEM0)           |
  181.                           (DMA_SxCR_PL_VERY_HIGH)      |
  182.                           (DMA_SxCR_MSIZE_32BIT)       |
  183.                           (DMA_SxCR_PSIZE_32BIT)       |
  184.                           (DMA_SxCR_MINC)              |
  185.                           (DMA_SxCR_CIRC)              |
  186.                           (DMA_SxCR_DIR_PERI_TO_MEM)   |
  187.                           (DMA_SxCR_PFCTRL_DMA_FLOW)   |
  188.                           (DMA_SxCR_TCIE)              |
  189.                           (DMA_SxCR_HTIE);
  190.  
  191.     DMA1_Stream1->CR &= ~((DMA_SxCR_CT)    |
  192.                           (DMA_SxCR_PL)    |
  193.                           (DMA_SxCR_MSIZE) |
  194.                           (DMA_SxCR_PSIZE) |
  195.                           (DMA_SxCR_MINC)  |
  196.                           (DMA_SxCR_CIRC)  |
  197.                           (DMA_SxCR_DIR)   |
  198.                           (DMA_SxCR_PFCTRL)|
  199.                           (DMA_SxCR_TCIE)  |
  200.                           (DMA_SxCR_HTIE));
  201.  
  202.     DMA1_Stream1->CR |=   (DMA_SxCR_CT_MEM0)           |
  203.                           (DMA_SxCR_PL_VERY_HIGH)      |
  204.                           (DMA_SxCR_MSIZE_32BIT)       |
  205.                           (DMA_SxCR_PSIZE_32BIT)       |
  206.                           (DMA_SxCR_MINC)              |
  207.                           (DMA_SxCR_CIRC)              |
  208.                           (DMA_SxCR_DIR_MEM_TO_PERI)   |
  209.                           (DMA_SxCR_PFCTRL_DMA_FLOW);
  210.  
  211.     DMA1_Stream0->NDTR = 4;
  212.     DMA1_Stream1->NDTR = 4;
  213.  
  214.     DMA1_Stream0->PAR = (int)&SPI1->RXDR;
  215.     DMA1_Stream0->M0AR = (int)I2S1_RxBUFF;
  216.  
  217.     DMA1_Stream1->PAR = (int)&SPI1->TXDR;
  218.     DMA1_Stream1->M0AR = (int)I2S1_TxBUFF;
  219.  
  220.     DMA1_Stream0->CR |= DMA_SxCR_EN;
  221.                                                          DMA1_Stream1->CR |= DMA_SxCR_EN;
  222.  
  223. }
  224.  
  225.  
  226. void INIT_I2S() {
  227.  
  228.     RCC->APB2ENR |= (RCC_APB2ENR_SPI1EN);
  229.  
  230.     RCC -> PLLCKSELR &= ~(RCC_PLLCKSELR_DIVM2);
  231.             RCC -> PLLCKSELR |=  (RCC_PLLCKSELR_DIVM2_DIV10);
  232.  
  233.             RCC -> PLL2FRACR = 0;
  234.             RCC -> PLL2FRACR = (RCC_PLL2FRACR_FRACN2_7209);
  235.  
  236.             RCC -> PLLCFGR   &= ~((RCC_PLLCFGR_PLL2VCOSEL) |
  237.                                   (RCC_PLLCFGR_PLL2RGE)    |
  238.                                   (RCC_PLLCFGR_PLL2FRACEN) |
  239.                                   (RCC_PLLCFGR_DIVP2EN)    |
  240.                                   (RCC_PLLCFGR_DIVQ2EN)    |
  241.                                   (RCC_PLLCFGR_DIVR2EN));
  242.  
  243.             RCC -> PLLCFGR   |= (RCC_PLLCFGR_PLL2VCOSEL_WIDE_RANGE) |
  244.                                 (RCC_PLLCFGR_PLL2RGE_8MHz_16MHz)    |
  245.                                 (RCC_PLLCFGR_DIVP2EN)               |
  246.                                 (RCC_PLLCFGR_PLL2FRACEN);
  247.  
  248.             RCC -> PLL2DIVR  &= ~((RCC_PLL2DIVR_N2) |
  249.                                   (RCC_PLL2DIVR_P2));
  250.  
  251.             RCC -> PLL2DIVR  |= (RCC_PLL2DIVR_N2_122) |
  252.                                 (RCC_PLL2DIVR_P2_8);
  253.             RCC -> D2CCIP1R &= ~(RCC_D2CCIP1R_SPI123SEL);
  254.                 RCC -> D2CCIP1R |=  (RCC_D2CCIP1R_SPI123SEL_PLL2_P_CK);
  255.  
  256.                 RCC -> CR &= ~(RCC_CR_PLL2ON);
  257.                 RCC -> CR |=  (RCC_CR_PLL2ON);
  258.  
  259.                 while (!((RCC -> CR) & (RCC_CR_PLL2RDY)));
  260.  
  261.                 SPI1->I2SCFGR = 0x00;
  262.                     SPI1->CFG1 &= ~((SPI_CFG1_RXDMAEN) |
  263.                                     (SPI_CFG1_TXDMAEN));
  264.  
  265.                                      SPI1->CFG1 |= (SPI_CFG1_RXDMAEN) |
  266.                                                    (SPI_CFG1_TXDMAEN);
  267.                                      SPI1->I2SCFGR |= (SPI_I2SCFGR_MCKOE)              |
  268.                                                       (SPI_I2SCFGR_I2SDIV_2)           |
  269.                                                       (SPI_I2SCFGR_DATFMT_LEFT)        |
  270.                                                       (SPI_I2SCFGR_I2SSTD_I2S)         |
  271.                                                       (SPI_I2SCFGR_I2SCFG_MASTER_FULL) |
  272.                                                       (SPI_I2SCFGR_I2SMOD_I2S);
  273.                                      SPI1->I2SCFGR |= (SPI_I2SCFGR_DATLEN_24BIT);
  274.                                                 SPI1->I2SCFGR |= (SPI_I2SCFGR_CHLEN_32BIT);
  275.  
  276.  
  277.                                                      SPI1->CR1 |= SPI_CR1_SPE;
  278.                                                      SPI1->CR1 |= SPI_CR1_CSTART;
  279.  
  280. }
  281.  
  282. void INIT_INTERRUPT() {
  283.     NVIC_SetPriority(DMA1_Stream0_IRQn,0);
  284.     NVIC_EnableIRQ(DMA1_Stream0_IRQn);
  285. }
  286.  
  287. int main(void) {
  288.  
  289.     INIT_CLOCK();
  290.     INIT_GPIO();
  291.     INIT_DMA();
  292.     INIT_I2S();
  293.     INIT_INTERRUPT();
  294.  
  295.     while (1) {
  296.  
  297.         if (I2S1_HC == 1) {
  298.             for (int i = 0; i < 2; i++) {
  299.                 I2S1_TxBUFF[i] = I2S1_RxBUFF[i];
  300.             }
  301.             I2S1_HC = 0;
  302.         }
  303.  
  304.         if (I2S1_TC == 1) {
  305.             for (int i = 2; i < 4; i++) {
  306.                 I2S1_TxBUFF[i] = I2S1_RxBUFF[i];
  307.             }
  308.             I2S1_TC = 0;
  309.         }
  310.     }
  311.  
  312. }
  313.  
  314. void DMA1_Stream0_IRQHandler() {
  315.  
  316.     if (((DMA1 -> LISR) & (DMA_LISR_HTIF0)) != 0) {
  317.         DMA1 -> LIFCR |= DMA_LIFCR_CHTIF0;
  318.  
  319.         I2S1_HC = 1;
  320.     }
  321.  
  322.     if (((DMA1 -> LISR) & (DMA_LISR_TCIF0)) != 0) {
  323.         DMA1 -> LIFCR |= DMA_LIFCR_CTCIF0;
  324.  
  325.         I2S1_TC = 1;
  326.     }
  327. }
  328.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement