Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* USER CODE BEGIN Header */
- /**
- ******************************************************************************
- * @file : main.c
- * @brief : Main program body
- ******************************************************************************
- * @attention
- *
- * <h2><center>© Copyright (c) 2021 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under BSD 3-Clause license,
- * the "License"; You may not use this file except in compliance with the
- * License. You may obtain a copy of the License at:
- * opensource.org/licenses/BSD-3-Clause
- *
- ******************************************************************************
- */
- /* USER CODE END Header */
- /* Includes ------------------------------------------------------------------*/
- #include "main.h"
- #include <stdint.h>
- int I2S1_TxBUFF[4];
- int I2S1_RxBUFF[4];
- uint8_t I2S1_TC = 0;
- uint8_t I2S1_HC = 0;
- void INIT_DMA(void);
- void INIT_CLOCK(void);
- void INIT_GPIO(void);
- void INIT_I2S(void);
- void INIT_INTERRUPT(void);
- void INIT_CLOCK() {
- FLASH -> ACR &= ~((FLASH_ACR_LATENCY) |
- (FLASH_ACR_WRHIGHFREQ));
- FLASH -> ACR |= (FLASH_ACR_LATENCY_4WS) |
- (FLASH_ACR_WRHIGHFREQ_2);
- RCC -> APB4ENR &= ~(RCC_APB4ENR_SYSCFGEN);
- RCC -> APB4ENR |= (RCC_APB4ENR_SYSCFGEN);
- PWR -> D3CR &= ~(PWR_D3CR_VOS);
- PWR -> D3CR |= PWR_D3CR_VOS_SCALE1;
- PWR ->CR3 &= ~(PWR_CR3_LDOEN);
- PWR ->CR3 |= (PWR_CR3_LDOEN);
- SYSCFG -> PWRCR |= (SYSCFG_PWRCR_ODEN);
- while (!((PWR -> D3CR) & (PWR_D3CR_VOSRDY)));
- RCC -> PLLCKSELR &= ~(RCC_PLLCKSELR_DIVM1);
- RCC -> PLLCKSELR |= (RCC_PLLCKSELR_DIVM1_DIV4);
- RCC -> PLLCFGR &= ~(RCC_PLLCFGR_PLL1RGE);
- RCC -> PLLCFGR |= (RCC_PLLCFGR_PLL1RGE_8MHz_16MHz);
- RCC -> PLL1DIVR &= ~ (RCC_PLL1DIVR_N1);
- RCC -> PLL1DIVR |= (RCC_PLL1DIVR_N1_60);
- RCC -> D1CFGR |= (RCC_D1CFGR_HPRE_DIV2) |
- (RCC_D1CFGR_D1PPRE_DIV2);
- if (((RCC->D1CFGR) & (RCC_D1CFGR_HPRE_DIV2)) != RCC_D1CFGR_HPRE_DIV2) {
- //exit(0);
- }
- if (((RCC->D1CFGR) & (RCC_D1CFGR_D1PPRE_DIV2)) != RCC_D1CFGR_D1PPRE_DIV2) {
- //exit(0);
- }
- RCC -> D2CFGR |= (RCC_D2CFGR_D2PPRE1_DIV2) |
- (RCC_D2CFGR_D2PPRE2_DIV2);
- RCC -> D3CFGR |= RCC_D3CFGR_D3PPRE_DIV2;
- RCC -> CR |= RCC_CR_PLL1ON;
- while (!((RCC -> CR) & (RCC_CR_PLL1RDY)));
- RCC -> CFGR &= ~(RCC_CFGR_SW);
- RCC -> CFGR |= RCC_CFGR_SW_PLL1;
- if ((( RCC -> CFGR) & (RCC_CFGR_SWS)) != (RCC_CFGR_SWS_PLL1)) {
- //exit(0);
- }
- }
- void INIT_GPIO() {
- // ! ---- PINS USED
- // PA4 = I2S1_WS
- // PA5 = I2S1_CK
- // PA6 = MISO
- // PA7 = MOSI
- // PC4 = MCK
- // GPIOA & C Clock
- RCC->AHB4ENR &= ~((RCC_AHB4ENR_GPIOAEN) |
- (RCC_AHB4ENR_GPIOCEN));
- RCC->AHB4ENR |= (RCC_AHB4ENR_GPIOAEN) |
- (RCC_AHB4ENR_GPIOCEN);
- GPIOA->MODER &= ~((GPIO_MODER_MODE4) |
- (GPIO_MODER_MODE5) |
- (GPIO_MODER_MODE6) |
- (GPIO_MODER_MODE7));
- GPIOA->MODER |= (GPIO_MODER_MODE4_AF) |
- (GPIO_MODER_MODE5_AF) |
- (GPIO_MODER_MODE6_AF) |
- (GPIO_MODER_MODE7_AF);
- GPIOC->MODER &= ~(GPIO_MODER_MODE4);
- GPIOC->MODER |= (GPIO_MODER_MODE4_AF);
- GPIOA->OSPEEDR &= ~((GPIO_OSPEEDR_OSPEED4) |
- (GPIO_OSPEEDR_OSPEED5) |
- (GPIO_OSPEEDR_OSPEED6) |
- (GPIO_OSPEEDR_OSPEED7));
- GPIOA->OSPEEDR |= (GPIO_OSPEEDR_OSPEED4_VERY_HIGH_SPEED) |
- (GPIO_OSPEEDR_OSPEED5_VERY_HIGH_SPEED) |
- (GPIO_OSPEEDR_OSPEED6_VERY_HIGH_SPEED) |
- (GPIO_OSPEEDR_OSPEED7_VERY_HIGH_SPEED);
- GPIOC->OSPEEDR &= ~((GPIO_OSPEEDR_OSPEED4));
- GPIOC->OSPEEDR |= (GPIO_OSPEEDR_OSPEED4_VERY_HIGH_SPEED);
- GPIOA->AFR[0] &= ~((GPIO_AFRL_AFSEL4) |
- (GPIO_AFRL_AFSEL5) |
- (GPIO_AFRL_AFSEL6) |
- (GPIO_AFRL_AFSEL7));
- GPIOA->AFR[0] |= (GPIO_AFRL_AFSEL4_I2S1_WS) |
- (GPIO_AFRL_AFSEL5_I2S1_CK) |
- (GPIO_AFRL_AFSEL6_I2S1_MISO) |
- (GPIO_AFRL_AFSEL7_I2S1_MOSI);
- GPIOC->AFR[0] &= ~(GPIO_AFRL_AFSEL4);
- GPIOC->AFR[0] |= (GPIO_AFRL_AFSEL4_I2S1_MCK);
- }
- void INIT_DMA() {
- // ENABLE DMA
- RCC->AHB1ENR &= ~(RCC_AHB1ENR_DMA1EN);
- RCC->AHB1ENR |= RCC_AHB1ENR_DMA1EN;
- //Setup DMA
- DMAMUX1_Channel0->CCR &= ~(DMAMUX_CxCR_DMAREQ_ID);
- DMAMUX1_Channel0->CCR |= (DMAMUX_CxCR_DMAREQ_ID_I2S1_Rx);
- DMAMUX1_Channel1->CCR &= ~(DMAMUX_CxCR_DMAREQ_ID);
- DMAMUX1_Channel1->CCR |= (DMAMUX_CxCR_DMAREQ_ID_I2S1_Tx);
- DMA1_Stream0->CR &= ~((DMA_SxCR_CT) |
- (DMA_SxCR_PL) |
- (DMA_SxCR_MSIZE) |
- (DMA_SxCR_PSIZE) |
- (DMA_SxCR_MINC) |
- (DMA_SxCR_CIRC) |
- (DMA_SxCR_DIR) |
- (DMA_SxCR_PFCTRL)|
- (DMA_SxCR_TCIE) |
- (DMA_SxCR_HTIE));
- DMA1_Stream0->CR |= (DMA_SxCR_CT_MEM0) |
- (DMA_SxCR_PL_VERY_HIGH) |
- (DMA_SxCR_MSIZE_32BIT) |
- (DMA_SxCR_PSIZE_32BIT) |
- (DMA_SxCR_MINC) |
- (DMA_SxCR_CIRC) |
- (DMA_SxCR_DIR_PERI_TO_MEM) |
- (DMA_SxCR_PFCTRL_DMA_FLOW) |
- (DMA_SxCR_TCIE) |
- (DMA_SxCR_HTIE);
- DMA1_Stream1->CR &= ~((DMA_SxCR_CT) |
- (DMA_SxCR_PL) |
- (DMA_SxCR_MSIZE) |
- (DMA_SxCR_PSIZE) |
- (DMA_SxCR_MINC) |
- (DMA_SxCR_CIRC) |
- (DMA_SxCR_DIR) |
- (DMA_SxCR_PFCTRL)|
- (DMA_SxCR_TCIE) |
- (DMA_SxCR_HTIE));
- DMA1_Stream1->CR |= (DMA_SxCR_CT_MEM0) |
- (DMA_SxCR_PL_VERY_HIGH) |
- (DMA_SxCR_MSIZE_32BIT) |
- (DMA_SxCR_PSIZE_32BIT) |
- (DMA_SxCR_MINC) |
- (DMA_SxCR_CIRC) |
- (DMA_SxCR_DIR_MEM_TO_PERI) |
- (DMA_SxCR_PFCTRL_DMA_FLOW);
- DMA1_Stream0->NDTR = 4;
- DMA1_Stream1->NDTR = 4;
- DMA1_Stream0->PAR = (int)&SPI1->RXDR;
- DMA1_Stream0->M0AR = (int)I2S1_RxBUFF;
- DMA1_Stream1->PAR = (int)&SPI1->TXDR;
- DMA1_Stream1->M0AR = (int)I2S1_TxBUFF;
- DMA1_Stream0->CR |= DMA_SxCR_EN;
- DMA1_Stream1->CR |= DMA_SxCR_EN;
- }
- void INIT_I2S() {
- RCC->APB2ENR |= (RCC_APB2ENR_SPI1EN);
- RCC -> PLLCKSELR &= ~(RCC_PLLCKSELR_DIVM2);
- RCC -> PLLCKSELR |= (RCC_PLLCKSELR_DIVM2_DIV10);
- RCC -> PLL2FRACR = 0;
- RCC -> PLL2FRACR = (RCC_PLL2FRACR_FRACN2_7209);
- RCC -> PLLCFGR &= ~((RCC_PLLCFGR_PLL2VCOSEL) |
- (RCC_PLLCFGR_PLL2RGE) |
- (RCC_PLLCFGR_PLL2FRACEN) |
- (RCC_PLLCFGR_DIVP2EN) |
- (RCC_PLLCFGR_DIVQ2EN) |
- (RCC_PLLCFGR_DIVR2EN));
- RCC -> PLLCFGR |= (RCC_PLLCFGR_PLL2VCOSEL_WIDE_RANGE) |
- (RCC_PLLCFGR_PLL2RGE_8MHz_16MHz) |
- (RCC_PLLCFGR_DIVP2EN) |
- (RCC_PLLCFGR_PLL2FRACEN);
- RCC -> PLL2DIVR &= ~((RCC_PLL2DIVR_N2) |
- (RCC_PLL2DIVR_P2));
- RCC -> PLL2DIVR |= (RCC_PLL2DIVR_N2_122) |
- (RCC_PLL2DIVR_P2_8);
- RCC -> D2CCIP1R &= ~(RCC_D2CCIP1R_SPI123SEL);
- RCC -> D2CCIP1R |= (RCC_D2CCIP1R_SPI123SEL_PLL2_P_CK);
- RCC -> CR &= ~(RCC_CR_PLL2ON);
- RCC -> CR |= (RCC_CR_PLL2ON);
- while (!((RCC -> CR) & (RCC_CR_PLL2RDY)));
- SPI1->I2SCFGR = 0x00;
- SPI1->CFG1 &= ~((SPI_CFG1_RXDMAEN) |
- (SPI_CFG1_TXDMAEN));
- SPI1->CFG1 |= (SPI_CFG1_RXDMAEN) |
- (SPI_CFG1_TXDMAEN);
- SPI1->I2SCFGR |= (SPI_I2SCFGR_MCKOE) |
- (SPI_I2SCFGR_I2SDIV_2) |
- (SPI_I2SCFGR_DATFMT_LEFT) |
- (SPI_I2SCFGR_I2SSTD_I2S) |
- (SPI_I2SCFGR_I2SCFG_MASTER_FULL) |
- (SPI_I2SCFGR_I2SMOD_I2S);
- SPI1->I2SCFGR |= (SPI_I2SCFGR_DATLEN_24BIT);
- SPI1->I2SCFGR |= (SPI_I2SCFGR_CHLEN_32BIT);
- SPI1->CR1 |= SPI_CR1_SPE;
- SPI1->CR1 |= SPI_CR1_CSTART;
- }
- void INIT_INTERRUPT() {
- NVIC_SetPriority(DMA1_Stream0_IRQn,0);
- NVIC_EnableIRQ(DMA1_Stream0_IRQn);
- }
- int main(void) {
- INIT_CLOCK();
- INIT_GPIO();
- INIT_DMA();
- INIT_I2S();
- INIT_INTERRUPT();
- while (1) {
- if (I2S1_HC == 1) {
- for (int i = 0; i < 2; i++) {
- I2S1_TxBUFF[i] = I2S1_RxBUFF[i];
- }
- I2S1_HC = 0;
- }
- if (I2S1_TC == 1) {
- for (int i = 2; i < 4; i++) {
- I2S1_TxBUFF[i] = I2S1_RxBUFF[i];
- }
- I2S1_TC = 0;
- }
- }
- }
- void DMA1_Stream0_IRQHandler() {
- if (((DMA1 -> LISR) & (DMA_LISR_HTIF0)) != 0) {
- DMA1 -> LIFCR |= DMA_LIFCR_CHTIF0;
- I2S1_HC = 1;
- }
- if (((DMA1 -> LISR) & (DMA_LISR_TCIF0)) != 0) {
- DMA1 -> LIFCR |= DMA_LIFCR_CTCIF0;
- I2S1_TC = 1;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement