В даном примере мы рассмотрим передачу USART через DMA , на компьютер. Как обсуждалось в статье по передачи данных USART ,
использовался переходник RS-232->USB , а также терминал в компьютере (скачать который без труда можно в интернете)
симулирующий работу COM порта. Сложного в работе связки USART->DMA ничего нет, все тоже самое как в обычной передаче USART
, но нужно будет еще провести иннициализацию DMA. Традиционно в примере не будут использоваться библиотеки типа StdPeriph
, от которых код только увеличивается, гораздо лаконичнее и очевиднее число установленное в соответствующий регистр.
Программа следующая: светодиоды мигают, и паралельно идет передача DMA. Процессор вмешивается только когда вызывается прерывание.
Программа следующая: светодиоды мигают, и паралельно идет передача DMA. Процессор вмешивается только когда вызывается прерывание.
- void SystemInit(void)
- {
- }
- char buffer[]={"iVARIOUS.COM"};// Строка, которую будем передавать
- void GPIOD_ini(void) //Процессор занят миганием светодиодов, в то время как DMA передает данные
- {
- RCC_GPIO|=0x8;
- GPIOD_MODER=0x55000000;
- GPIOD_PUPDR=0x55000000;
- }
- void USART2_ini(void)// иннициализация USART2
- {
- RCC_GPIO|=0x1;// Тактирование порта A, на котором ножки USART2
- GPIOA_MODER|=0xA0;
- GPIOA_AFRL|=0x7700;
- RCC_UART2|=0x20000;
- USART2_BRR=0x683; //BaudRate=9600
- USART2_CR3|=0x80;
- USART2_CR1|=0xC;// включаем передачу и прием
- NVIC_ISER1|=0x40;//Прерывание
- USART2_CR1|=0x2000;//Запуск USART2
- }
- void DMA_ini(void)
- {
- DMA1_RCC|=0x200000;
- DMA_S6CR= 0x08000000; //DMA_Channel_4;
- DMA_S6PAR=0x40004404;
- DMA_S6M0AR= (uint32_t)buffer;
- DMA_S6CR|= 0x40; //DMA_DIR_MemoryToPeripheral;
- DMA_S6NDTR=sizeof(buffer);
- DMA_S6CR|=0x400;
- DMA_S6CR|=0x10000;
- DMA_S6CR|=0x100;
- NVIC_ISER0=0x20000;
- DMA_S6CR|=0x10;
- }
- //------------------
- void DMA1_Stream6_IRQHandler(void)
- {
- if ((DMA_HISR&0x200000) == 0x200000)
- {
- DMA_HIFCR=0x200000;//DMA_ClearITPendingBit(DMA1_Stream6, DMA_IT_TCIF6);
- }
- }
- //------------------
- int main(void)
- { uint32_t i=0;
- USART2_ini();
- DMA_ini();
- GPIOD_ini();
- DMA_S6CR|=0x1;
- while(1)
- {
- GPIOD_ODR=0xA000;
- for(i=0;i<1000000;i++){};
- GPIOD_ODR=0;
- for(i=0;i<1000000;i++){};
- }
- }
Комментариев нет:
Отправить комментарий