Developer от Бога

DV

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

STM32. Передача данных по USART

В демонстрационной плате Discovery на чипе STM32F407VG нет периферии для тестирования UART, поэтому чтоб в полной мере изучить передачу данных этим интерфейсом понадобятся некоторые дополнительные приспособления. Конечно можно обойтись и внутренними резервами, передавая сигнал от ножки к ножке замкнув их, но для более наглядной демонстрации лучше купить переходник RS-232->USB, и используя разные терминалы симулирующие работу COM порта на компьютере передавать данные на микроконтроллер, а также принимать от микроконтроллера видя сразу результат принятого текста.
В даном примере мы будем работать с периферией USART2 в STM32F407VG.
Начинается код традиционно с установкой тактирования выводов и самого модуля UART2 в регистре RCC_UART2. Так как порт GPIOA уже имеет некоторое значение по умолчанию в регистре GPIOA_MODER, последующие значения записываем через оператор "ИЛИ". Выводы UART2 отвечающие прием/передача (RX/TX) соответственно занимают пины PA2,PA3 и попадают в диапазон регистра GPIOA_AFRL (ножки 0-7). Номер альтернативной функции для UART2 равен 7 (вместе с UART1 и UART3, см . figure 26, Selecting an alternate function в документации). В GPIOA_AFRL устанавливаем значение соответствующее для AF7- 0x7700; (0b0111 - в биты соответствующие пинам PA2,PA3):



В регистр скорости передачи данных устанавливаем USART2_BRR=0x683; как получить данное значение читайте в STM32. USART


  1. int main (void)
  2. {
  3. uint32_t i,k=0;
  4. RCC_UART2=0x20000; //тактирование UART2
  5. //.инициализация портов для UART2…
  6. GPIOA_MODER|=0xA0; //выводы UART как альтернативная функция
  7. GPIOA_AFRL=0x7700; //номер альтернативной функции
  8. //…………….инициализация UART2………
  9. USART2_BRR=0x683; //скорость передачи/приема
  10. USART2_CR1=0xC; //включить передачу и прием
  11. USART2_CR1|=0x2000; //запуск UART, идет поиск стартового бита
  12. while(1)
  13. {
  14. while(!(USART2_SR&0x20)); //проверка бита RXNE на наличие принятых данных
  15. k=USART2_DR; //чтение принятых данных с компьютера
  16. if (k==0x39) //анализ полученных данных
  17. GPIOD_ODR=0xF000;
  18. else
  19. {
  20. GPIOD_ODR=0;
  21. }
  22. USART2_DR=k; //отправка данных
  23. while(!(USART2_SR&0x40)){}; // проверка бита TC отправлены ли данные
  24. }
  25. }

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

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