Ниже приведен пример кода работы 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++){};
 - }
 - }
 
Комментариев нет:
Отправить комментарий