Developer от Бога

DV

четверг, 6 июля 2017 г.

STM32. DMA USART

В даном примере мы рассмотрим передачу USART через DMA , на компьютер. Как обсуждалось в статье по передачи данных USART , использовался переходник RS-232->USB , а также терминал в компьютере (скачать который без труда можно в интернете) симулирующий работу COM порта. Сложного в работе связки USART->DMA ничего нет, все тоже самое как в обычной передаче USART , но нужно будет еще провести иннициализацию DMA. Традиционно в примере не будут использоваться библиотеки типа StdPeriph , от которых код только увеличивается, гораздо лаконичнее и очевиднее число установленное в соответствующий регистр.
Программа следующая: светодиоды мигают, и паралельно идет передача DMA. Процессор вмешивается только когда вызывается прерывание.

  1. void SystemInit(void)
  2. {
  3. }
  4. char buffer[]={"iVARIOUS.COM"};// Строка, которую будем передавать
  5. void GPIOD_ini(void) //Процессор занят миганием светодиодов, в то время как DMA передает данные
  6. {
  7. RCC_GPIO|=0x8;
  8. GPIOD_MODER=0x55000000;
  9. GPIOD_PUPDR=0x55000000;
  10. }
  11. void USART2_ini(void)// иннициализация USART2
  12. {
  13. RCC_GPIO|=0x1;// Тактирование порта A, на котором ножки USART2
  14. GPIOA_MODER|=0xA0;
  15. GPIOA_AFRL|=0x7700;
  16. RCC_UART2|=0x20000;
  17. USART2_BRR=0x683; //BaudRate=9600
  18. USART2_CR3|=0x80;
  19. USART2_CR1|=0xC;// включаем передачу и прием
  20. NVIC_ISER1|=0x40;//Прерывание
  21. USART2_CR1|=0x2000;//Запуск USART2
  22. }
  23. void DMA_ini(void)
  24. {
  25. DMA1_RCC|=0x200000;
  26. DMA_S6CR= 0x08000000; //DMA_Channel_4;
  27. DMA_S6PAR=0x40004404;
  28. DMA_S6M0AR= (uint32_t)buffer;
  29. DMA_S6CR|= 0x40; //DMA_DIR_MemoryToPeripheral;
  30. DMA_S6NDTR=sizeof(buffer);
  31. DMA_S6CR|=0x400;
  32. DMA_S6CR|=0x10000;
  33. DMA_S6CR|=0x100;
  34. NVIC_ISER0=0x20000;
  35. DMA_S6CR|=0x10;
  36. }
  37. //------------------
  38. void DMA1_Stream6_IRQHandler(void)
  39. {
  40. if ((DMA_HISR&0x200000) == 0x200000)
  41. {
  42. DMA_HIFCR=0x200000;//DMA_ClearITPendingBit(DMA1_Stream6, DMA_IT_TCIF6);
  43. }
  44. }
  45. //------------------
  46. int main(void)
  47. { uint32_t i=0;
  48. USART2_ini();
  49. DMA_ini();
  50. GPIOD_ini();
  51. DMA_S6CR|=0x1;
  52. while(1)
  53. {
  54. GPIOD_ODR=0xA000;
  55. for(i=0;i<1000000;i++){};
  56. GPIOD_ODR=0;
  57. for(i=0;i<1000000;i++){};
  58. }
  59. }
  60.  

Комментариев нет:

Отправить комментарий