понедельник, 3 января 2022 г.

Передача по UART на stm32f103c8, Си и CMSIS

 UART (универсальный асинхронный приемник передатчик) часто используется для связи микроконтроллера с другими устройствами. Например по UART в микроконтроллер stm32f103c8 может записываться программа. Для этого, в данном микроконтроллере, имеется аппаратная поддержка данного интерфейса. В stm32f103c8 есть некоторое количество UARTов на случай если одного не хватит. Но программируется данный микроконтроллер через UART1 (а точнее USART1). Режим программирования по UART1 есть тогда когда на BOOT0 есть напряжение логической единицы. Если нет то UART1 может использоваться как обычный UART для связи микроконтроллера с другими устройствами. Этот UART удобно использовать для связи микроконтроллера с компьютером через USB-UART переходник, который также используется для записи программы, т.к. при этом схему не придется чем либо ещё дополнять. Чтобы использовать USART1 нужно включить его тактирование а также тактирвание порта A т.к. пины этого USARTа находятся на данном порту.


Тактирование их включается установкой битов 2 и 14 регистра APB2ENR.


Через пин PA9 (TX) происходит передача поэтому его надо настроить на push-pull выход с альтернативной функцией.



Пин PA10 (RX) можно не настраивать т.к. изначально он уже настроен как надо для данного случая. В регистр USART1->BRR надо записать число которое определит скорость передачи данных. В данный регистр заноситься число на которое делиться частота шины от которой тактируется USART чтобы получилась нужная скорость. Т.е. если например нужна скорость 9600 бод а частота шины 72 000 000 Гц (по умолчанию) то в регистр нужно занести = 72 000 000 / 9600 = 7500.

Чтобы разблокировать UART и передачу по нему, нужно установить биты 3 и 13 регистра USART1->CR1.


Для начала, по традиции, можно передать на компьютер строку "Hello World!". Для этого нужно создать массив символов с данной строкой а также счетчик для обнаружения конца строки.
Массивы и переменные следует объявлять в начале функции а не в середине и конце а также в коде не следует применять "магические цифры" но для простоты в целях образования при первом изучении можно этим пренебречь однако всё же стоит иметь в виду что пренебрежение данными правилами может приводить к трудноуловимым "багам" (на языке Си) и снижать удобочитаемость кода. 
 Чтобы отправить символ по UART его надо записать в регистр данных выбранного UARTа. Но сделать это следует только тогда когда регистр для приема байта данных с целью его последующей отправки свободен. Чтобы определить занятость данного регистра есть специальный флаг который является битом 7 статусного регистра выбранного UARTа.

Если данный бит установлен то все старые биты данных переданы и можно записывать в регистр данных новый бит.

Для того чтобы передалась вся строка, а не только первый символ, следует инкрементировать счетчик и обнулить его если он досчитал до конца строки.


А также добавить небольшую задержку чтобы символы не слишком быстро появлялись в терминале. Виде по данной теме:


КАРТА БЛОГА (содержание)

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

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