Ниже приведен пример кода работы DMA в связке с SPI, USART и акселерометром MEMS платы DISCOVERY.
Процесс работы прост - считывается значения регистров акселерометра, и передается
через DMA на периферию USART2, которая отправляет данные через переходник RS-232-
>USB на компьютер, и визуализируется в виде графика на дисплее. Чтоб не загружать
страницу, сюда небыли помещены #defin-ы с указателями на адреса регистров
STM32F407VG, но по названиям думаю тут все понятно, какие регистры используются. О
том как определять адреса регистров по документации читайте в начальных статьях по
программированию STM32.
- void SysTick_Handler(void)
- {
- GPIOE_BSRR|=0x80000;
- DMA2_S3CR|=0x1;
- }
- void USART_TX(uint32_t y)
- {
- USART2_DR=y-127;// центрируем график с осей по центру экрана
- while (!(USART2_SR&0x80)==0x80){}
- }
- void SystemInit(void)
- {
- }
- uint8_t x[] ={0xA9,0};//Адрес регистров осей акселерометра которые будут считываться.
- uint8_t y[2];
- uint8_t z;
- uint32_t i;
- void USART_ini(void)
- {
- RCC_GPIO|=0x1;
- GPIOA_MODER|=0xA0;
- GPIOA_AFRL|=0x7700;
- RCC_UART2|=0x20000;
- USART2_BRR=0x683;
- USART2_CR3|=0x80;
- USART2_CR1|=0x8;
- NVIC_ISER1|=0x40;
- USART2_CR1|=0x2000;
- }
- void SPI_ini(void)
- {
- RCC_GPIO|=0x19;
- GPIOA_MODER|=0xA800;
- GPIOA_AFRL|=0x55500000;
- GPIOE_MODER|=0x40;
- GPIOE_PUPDR|=0x40;
- GPIOE_BSRR|=0x8;
- RCC_SPI1|=0x1000;
- SPI1_CR1 |= 0x0002 |0x0001;
- SPI1_CR1 |=0x0300|0x0028;
- SPI1_CR1 |=0x04;
- SPI1_CRCPR=7;
- SPI1_CR2|=0x3;
- SPI1_CR1|=0x0040;
- GPIOE_BSRR=0x80000;
- SPI1_DR=0x20;
- while (!(SPI1_SR&0x1)==0x1){};
- z=SPI1_DR;
- SPI1_DR=0x97;
- while (!(SPI1_SR&0x1)==0x01){}
- z=SPI1_DR;
- GPIOE_BSRR=0x8;
- }
- void DMA_ini(void)
- {
- DMA1_RCC|=0x200000;
- DMA2_RCC|=0x400000;
- //.....................TX
- DMA2_S3CR= 0x06000000;//DMA_Channel_3;
- DMA2_S3PAR=0x4001300C;//SPI->DR
- DMA2_S3M0AR= (uint32_t)x;
- DMA2_S3CR|= 0x40;//DMA_DIR_MemoryToPeripheral;
- DMA2_S3NDTR=2;
- DMA2_S3CR|=0x0400;
- DMA2_S3CR|=0x10000;
- //DMA2_S3CR|=0x8;
- //DMA2_S3CR|=0x100;//DMA_CIRCULAR
- DMA2_S3CR|=0x10;
- NVIC_ISER1=0x8000000;
- DMA2_S3CR|=0x10;
- //....................RX
- DMA2_S0CR= 0x06000000;//DMA_Channel_3;
- DMA2_S0PAR=0x4001300C;//SPI->DR
- DMA2_S0M0AR=(uint32_t)y;
- DMA2_S0CR|= 0;//peripheralToMemory
- DMA2_S0NDTR=2;
- DMA2_S0CR|=0x400;
- DMA2_S0CR|=0x10000;
- //DMA2_S0CR|=0x100;
- DMA2_S0CR|=0x10;
- NVIC_ISER1=0x1000000;
- DMA2_S0CR|=0x10;
- } void DMA2_Stream0_IRQHandler(void)//...........SPI->RX
- {
- GPIOE_BSRR=0x8;
- DMA2_LIFCR=0x20;
- USART_TX(y[1]);
- }
- void DMA2_Stream3_IRQHandler(void)//...........SPI->TX
- {
- GPIOE_BSRR=0x80000;
- if((DMA2_LISR&0x8000000)==0x8000000)
- {DMA2_LIFCR=0x8000000;
- DMA2_S0CR|=0x1;}
- }
- void DMA1_Stream6_IRQHandler(void)
- {
- if((DMA_HISR&0x200000)==0x200000)
- DMA_HIFCR=0x200000;
- }
- int main(void)
- {
- USART_ini();
- SPI_ini();
- DMA_ini();
- GPIOD_MODER|=0x55000000;
- GPIOD_OTYPER|=0x55000000;
- SysTic_RVR=0xFFF;
- SysTic_CVR=0x0;
- SysTic_CTRL_Status=0x10007;
- while(1)
- {
- GPIOD_ODR=0xF000;
- for(i=0;i<1000000;i++){};
- GPIOD_ODR=0x0;
- for(i=0;i<1000000;i++){};
- }
- }
Комментариев нет:
Отправить комментарий