5. STM32. Программирование STM32F103. USART

Содержание

Мы уже использовали последовательный порт для программирования микроконтроллера. Теперь применим его по прямому назначению. У STM32F103 есть 3 последовательных USART порта. Мы рассмотрим пример с USART1. Остальные порты работают аналогично. В этом примере мы подключим микроконтроллер к компьютеру с помощью UART-USB переходника и будем использовать терминальную программу для передачи команд микроконтроллеру.

Схема

STM32F103_UART

На компьютере будем использовать терминальную программу Putty. Можно любую другую, которая работает с последовательным портом. Рассмотрим пример для STM32, который будет работать как простенький терминал: принимать команды с компьютера и обрабатывать их. Команды будут две: ON, OFF. Конечно, они будут включать и выключать светодиод на плате. Полный текст программы приведен в конце статьи, а сейчас разберем как это работает.

Инициализация USART1

  • Включаем тактирование модуля USART1 и порта GPIOA (ноги TX и RXUSART1 подключены к — PA9, PA10). О тактировании говорилось в предыдущей статье.
  • Конфигурируем NVIC. NVIC — контроллер приоритетных векторных прерываний. О нем будет отдельный разговор. Сегодня надо усвоить, что все прерывания настраиваются в NVIC.
  • Конфигурируем GPIO (PA9, PA10). Это ноги TX и RX.
  • Конфигурируем USART1
  • Включаем USART1
  • Включаем прерывания, которое срабатывает при поступлении байта в USART1.

Как видно из кода инициализации, порт USART1 будет работать на скорости 115200. В настройке консольной программы нужно указать такую же скорость порта.

Разбор программы

Прежде всего мы проверяем, флаг USART_FLAG_RXNE

и убеждаемся, что прилетел байт. Обработчик прерываний USART1_IRQHandler может вызываться и другими событиями. Затем полученный символ сохраняем в RX_BUF, проверяя переполнения буфера. Если прилетает конец строки (символ с кодом 13), то есть в консоли терминала нажали клавишу Enter, тогда выставляем наш флажок RX_FLAG_END_LINE. По нему мы будем знать, что нужно разобрать строку набранную в консоли терминала (то есть, пришло время разобрать содержимое буфера RX_BUF), и, если в буфере будет известная команда (ON или OFF) — выполнить ее.

Обратите внимание, что в обработчике прерываний USART1_IRQHandler мы не будем выполнять довольно тяжелую процедуру обработки команд. Мы только установим флажок, а обработку будем делать в основном цикле программы. Это делается для того, чтобы как можно быстрее завершить обработку прерывания, так как могут ждать обработки другие прерывания. STM32 имеет приоритеты прерываний и обработка прерывания может быть прервана прерыванием с большим приоритетом. Но, несмотря на это, лучше, чтобы обработка прерываний выполнялась так быстро, как это возможно.

Последняя команда в процедуре обработки прерывания:

отправляет принятый символ обратно в терминал, то есть выполняет функцию Echo.

Теперь рассмотрим что происходит в главном цикле программы.

Мы ожидаем, когда будет нажат Enter, проверяя наш флаг RX_FLAG_END_LINE:

Когда он прилетает, в консоль терминала выводится строка которую мы будем анализировать:

А потом проверяем принятую строку и, если это одна из известных команд, — включаем или выключаем светодиод:

Полный текст программы


Источник: blog.avislab.com