Stm32 не работает uart

Embedder’s life

STM32 и неработающий USART

В прошлой статье я обещал ее продолжение с практикой, однако пока у меня нет ни времени, ни вдохновения писать про цифровые фильтры. Вместо этого сегодня я хочу поведать общественности о небольших граблях, на которые я наступил при работе с USART’ом на STM32, авось кому пригодится.

В данный момент я работаю над чем-то вроде транслятора протокола для проприетарной системы устройств. Этот самый транслятор собран на контроллере STM32F100C8 по той причине, что в оном чипе есть необходимые три USART’а. С ними (точнее, как будет видно дальше, с выводами контроллера, к которым они подключаются) и приключились странности. Я написал код, залил его в чип и приготовился наблюдать данные, выходящие со всех трех USART’ов (тест). Однако данные наблюдались только с одного канала, притом что, естесственно, инициализация у всех каналов абсолютно одинаковая. Я чесал репу, тыкал осциллографом и удивлялся; грешил на непропай… Но нет, все цепи звонились вполне нормально.

Потом я заметил интересную закономерность: проявлял себя ровно тот USART, к которому был подключен мой переходничок USB-UART. Все выглядело так, как будто выходы сконфигурированы в режиме открытого стока — переходник подтягивает шину данных к единице и все работает, а когда тыкаешь осциллографом, то, конечно, ничего не видно. Но отчего? Я ведь конфигурировал их в режиме двухтактного выхода.

Читайте также:  Колонка velton mx3 как настроить

Разгадка оказалась простой. Режим работы конкретного вывода задается в регистрах GPIOx_CRH и GPIOx_CRL. Для каждой ножки там имеется набор из двух битов MODE и двух битов CNF. Биты MODE задают режим работы — вход или выход с задаваемой максимальной скоростью; биты CNF — режим работы, в случае выхода это открытый коллектор или двухтактный выход. При этом, назначение битов CNF меняется соответственно режиму, заданному битами MODE.

Проблема оказалась в том, что изначально выходы настроены на высокоимпедансный вход. Это, конечно, разумно. Только вот высокоимпедансный вход в виде CNF-битов обозначается вовсе не нулем, а значением 0b01.

Чтобы в режиме выхода подключить двухтактный каскад для альтернативной функции, надо записать в CNF значение 0b10. Ну я и записал — операцией побитового ИЛИ. Однако же, очевидно, при этом там осталась и единичка по умолчанию, стоящая в младшем бите соответствующего CNF-поля. Таким образом, суммарно там получилось 0b11, а это значение уже обозначает режим открытого стока, который я и наблюдал. Вот так.

Решил я это простым обнулением регистров GPIOx_CRH/ GPIOx_CRL перед записью в них конфигов, чтобы не заморачиваться со снятием конкретных битов. При этом для остальных выводов получается, что они находятся в режиме аналогового входа, что, в общем, не страшно.

Для большей понятности цитата из даташита с комментариями:

Какая мораль? Безусловно, ненулевое по умолчанию значение регистра — это плохо, так как сбивает с толку. Тем более, что чаще всего встречаются регистры, после сброса все же содержащие ноль во всех битах. А тут какая-то экзотика… Тем не менее да, внимательное чтение документации спасает и тут.

Источник

STM32F103, проблема с UART на скорости 9600

Сколько не отправляй байт, все ровно приходят 3 первых байта и все. Проверено на разных платах, на другом МК STM32F103VET, ничего не меняется , как только ставлю скорость 9600 пакет перестает приходить полностью.Я уже бьюсь второй день и не пойму в чем дело , грешу на CubeMX и HAL , так как недавно обновил до последней версии. Даже не знаю что еще попробовать и как устранить эту проблему.

PS: компилятор Keil , связка для проверки : плата —ПК ,через RS485 переходник (китай)

Помощь в написании контрольных, курсовых и дипломных работ здесь.

UART и STM32F103
Здравствуйте, уважаемые! Начал тут заниматься STM32, перейдя на него с AtMega. Возник вопрос — как.

Прием по UART STM32F103
Здравствуйте. Тема заезженная, знаю- прием по ЮАРТу. Прежде чем сюда писать по изучал 3-4 статьи и.

atmega16 Uart работает только на 9600
Контроллер принимает данные с терминала только на скорости 9600бод. Контроллер тактируется от.

STM32F103 + DMA + UART отправка данных с прерыванием
Всем доброго дня. Прошу помощи , а то уже сломал мозг. Нужно отправить данные через DMA1 USORT2 с.

Блин , ну это вообще пипец, поставил скорость повыше через одну от 9600 а именно 19200, стало приходить стабильно не три символа а 5, но не весь пакет из 9 байт .Это вообще ни в какие ворота не лезет, что за хрень происходит ? У меня уже подозрение на китайский переходник RS485-USB , я не знаю как он там аппаратно переводит RE DE в режим прием-передача, может он раньше времени переводит их из режима прием на режим передачи и из за этого прием пакета обрывается на низких скоростях.

Добавлено через 59 минут
Жесть , оказывается и на скорости 115200 не все приходит, просто те что я слал пакеты по modbus влазили , а я взял для эксперимента и расширил длину пакет и он перестал весь приходить. Я и еще один вариант попробовал , запустил второй USART через RS232 и подключил для проверки к ПК , та же фигня , пакет приходит не весь, чем меньше скорость тем меньше байт из пакета приходит. Так что дело не в переходнике 485 и не в 232, дело или в связке CubeMX-HAL-Keil, или в компе. Сейчас еще попробую в Atollic сделать проект , если не поможет , буду смотреть через отладчик что происходит или напишу свою функцию отправки пакета. Я просто в ступоре , первый раз сталкиваюсь с подобной проблемой

Добавлено через 39 минут
Проверил в режиме отладки, если проходить функцию HAL_UART_Transmit по шагам то все байты приходят, но если ее пропустить то пакет приходит не весь .

Источник

[РЕШЕНО] Не работает UART на stm32l151

Не получается заставить работать UART , хочу пересылать команды между компьютером и МК stm32L151, пользуюсь miniUSB/UART cp2102 для подключения.

Rx мк подключил к Tx ttl перходника
Tx мк подключил к Rx ttl переходника
GND переходника подключил к GND платы

Команды с переходника уходят это видно на логическом анализаторе
В режиме дебага прерывание не вызывается

Помощь в написании контрольных, курсовых и дипломных работ здесь.

[РЕШЕНО]Проблемы с UART на F407 (дискавери)
Привет всем 🙂 Вот понадобилось поработать с UART на F407. Набросал тестовую программку. Там.

Буфер Uart на Си(решено)
первый опыт ваяния чего либо на Си. до этого неплохо делал программки на асме и в принципе не знал.

[Решено] Неверный UART на ATmega328P
Здатуте товарищи. Я уже с начала недели бьюсь над гатством с UART под мегу 328. Помница была тема.

[решено] Помогите разобраться с UART
Здравствуйте. Нужна помощь с UART-ом у кого есть опыт, подскажите. Ниже мой несложный протокол.

GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USORT1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USORT1);. п осле GPIO_Init.
И ногу RX не надо в IN режим, пусть тоже AF будет.

Не указана среда, где все это собирается. Если кокос, то решение простое: найти функцию Default_Riset_Homdler в файле stortup_stm32l1xx_XX.c и раскоментировать все, что там закоментировано (зачем они это сделали для L1 серии — без понятия).

Именно. Проц отправляет что-то и сразу это же получает. Для отладки — самое то.

Если про ядро, то да, в режиме LPR (low power run) максимальная частота 131кГц.
Если про UART — его скорость задается делителем USORT_BRR, который расчитывается в зависимости от текущих настроек тактирования.
На частоте 131кГц (в LPR) максимальная скорость USORT составит:
при oversampling=16: 8192бит/с
при oversampling=8 : 16384бит/с

Если про ядро, то да, в режиме LPR (low power run) максимальная частота 131кГц.
Если про UART — его скорость задается делителем USORT_BRR, который расчитывается в зависимости от текущих настроек тактирования.
На частоте 131кГц (в LPR) максимальная скорость USORT составит:
при oversampling=16: 8192бит/с
при oversampling=8 : 16384бит/с

а что происходит с RTC и тд,
меняется только частота ядра или AHB, APB тоже? вне зависимости от частоты внешнего кварца?
не совсем понимаю это

[ Решено ] A6 GSM модуль — проблема с UART
Играюсь с GSM модулем Aithinker A6. Подключил его к компьютеру через USB — UART адаптер. Сам.

Не работает UART
Добрый день, У меня не получается запустить uart на модуле stm32 (для pinboard) имеется 2.

Не работает прием по UART
Отладочная плата stm32vlDyscovery. Контроллер не получает данные, прерывание не происходит при.

Как работает UART ?
В принципе, как работает UART понятно. Интересует другой вопрос. Если я пошлю байт на Tx, который.

Источник

ОБОРУДОВАНИЕ
ТЕХНОЛОГИИ
РАЗРАБОТКИ

Блог технической поддержки моих разработок

Урок 20. Интерфейс UART в STM32. Работа с ним через регистры CMSIS. Использование прерывания UART.

Получим необходимый минимум информации об интерфейсах UART микроконтроллеров STM32. Научимся управлять ими через регистры библиотеки CMSIS.

UART – это наиболее распространенный последовательный интерфейс передачи данных. Через него к микроконтроллеру могут быть подключены самые разные устройства: от миниатюрного цифрового датчика, до компьютера. На базе UART могут создаваться даже локальные сети. Нам этот интерфейс необходим как минимум для отладки программ.

Протокол интерфейса UART.

Данные передаются асинхронным последовательным кодом.

Интерфейс называется асинхронным. Это означает, что данные могут быть переданы в любой момент, без использования между приемником и передатчиком синхронизирующих импульсов. В одну сторону данные предаются с помощью одного сигнала. Сам сигнал содержит как данные, так и синхронизирующую информацию.

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

В режиме ожидания сигнал на входе приемника находится в высоком уровне. Первым передается стартовый бит. Он всегда имеет низкий уровень. По первому перепаду сигнала в низкий уровень приемник начинает отсчитывать внутренние синхроимпульсы. Зная скорость передачи, а значит и период поступления входных битов, приемник считывает состояние следующих 8 битов. В конце передатчик формирует стоп-бит, всегда высокого уровня.

Все биты передаются за одинаковые промежутки времени. Время передачи одного бита определяет скорость передачи интерфейса. Часто она указывается в бодах (бит в секунду). Как я писал выше, кроме собственно данных в поток добавляются биты синхронизации. Таким образом, для передачи байта требуется не 8, а 10 битов.

Погрешность скорости передачи не должна превышать 5% (рекомендуется не более 1,5 %.)

Я рассказываю о самом распространенном формате протокола UART. Бывают варианты с различными количествами битов данных, обычно от 5 до 9. Могут использоваться форматы с двумя стоповыми битами. Иногда добавляется бит контроля четности. Но такие варианты используются редко.

Главное, что надо знать:

  • в неактивном режиме (состоянии ожидания) выход передатчика UART находится в высоком состоянии;
  • передача байта начинается со стартового бита, который равен 0 (низкий уровень сигнала);
  • передача байта заканчивается стоповым битом, который равен 1 (высокий уровень сигнала);
  • данные передаются, начиная с младшего бита;
  • для передачи байта требуется 10 битов;
  • время передачи одного байта вычисляется исходя из скорости обмена и количества битов в пакете (10 бит при передаче байта).

Существуют стандартные скорости передачи интерфейса UART. Наиболее распространены следующие.

Скорость передачи,
бод
Время передачи одного бита, мкс Время передачи байта,
мкс
4800 208 2083
9600 104 1042
19200 52 521
38400 26 260
57600 17 174
115200 8,7 87

Обмен данными через UART происходит в дуплексном режиме. Т.е. передача и прием данных могут происходить одновременно.

У интерфейса UART существуют 2 сигнала RX и TX. Иногда их маркируют RXD и TXD, подчеркивая, что это сигналы передачи данных.

При подключении двух UART устройств сигналы RX соединяются с сигналами TX. Используется перекрестная схема соединения.

UART в микроконтроллерах STM32.

У микроконтроллеров STM32F103C8T6 целых 3 интерфейса UART. Они имеют одинаковые структуры и функциональные возможности.

Не повторяя информацию об общепринятых функциях UART, я бы выделил следующие возможности этого интерфейса в микроконтроллерах STM32.

  • При частоте тактирования 72 МГц скорость передачи данных до 4,5 Мбит/сек.
  • Размерность передаваемых данных 8 или 9 бит.
  • Могут быть заданы форматы с 1 или 2 стоповыми битами.
  • Интерфейс поддерживает физический уровень протокола инфракрасного порта (IRDA).
  • Также поддерживается интерфейс контактных смарт-карт ISO 7816.
  • Передача и прием данных могут происходить с использованием контроллера прямого доступа к памяти (DMA).
  • Интерфейс может работать в синхронном режиме.

Я коротко, упрощенно расскажу, как работает UART STM32.

Вот часть функциональной схемы интерфейса, через которую происходит передача и прием данных. Все остальное – это управляющая часть. Я ее не привел.

Передающая и приемная часть работают совершенно независимо друг от друга. Из общего у них только тактовый генератор. Т.е. могут быть задействован только приемник, или только передатчик. Приемник и передатчик могут работать с разными устройствами, разными протоколами верхнего уровня и т.п. Единственно у них должна быть одинаковая скорость и формат данных.

Собственно передатчик состоит из 2 регистров: регистра сдвига (Transmit Shift Register) и буферного регистра (TDR).

Данное загружается в буферный регистр передатчика. Программно доступен только он. Если передача предыдущего данного закончена и регистр сдвига пуст, то данное перегружается в него, сдвигается и побитно поступает на выход TX. Как только данное перегружено в регистр сдвига, буферный регистр освобождается и в него может быть загружено новое слово. Оно будет ждать окончания передачи и автоматически перегрузится в сдвиговый регистр.

Таким образом, происходит буферизация данных передатчика. Это позволяет реализовывать передачу данных без пауз между словами. После загрузки буферного регистра есть время на запись нового данного, равное времени передачи. Если успевать заполнять буферный регистр, то данные будут передаваться сплошным потоком.

Об окончании передачи данных регистром сдвига и освобождении буферного регистра сообщают специальные флаги. По ним могут быть сформированы прерывания.

Приемная часть устройства также состоит из двух регистров: регистра сдвига (Receive Shift Register) и буферного регистра (RDR). С входа RX данные поступают на сдвиговый регистр, сдвигаются и, после формирования полного слова, перегружаются в буферный регистр. Буферный регистр доступен программно. Из него считывается полученное данное. Если данные поступают сплошным потоком, без пауз, то после приема данного есть время, равное времени передачи слова, на то, чтобы считать его из буферного регистра. Иначе придет новое данное, а старое будет потеряно.

Регистры UART.

Регистров много, битов еще больше. Я не претендую на подробное описание регистров UART. Приведу только информацию, необходимую нам в ближайших уроках.

USART_SR — регистр состояния.

Прежде всего, нам интересны флаги, сообщающие о состоянии приема и передачи.

  • Бит 7 TXE. Буферный регистр передатчика пуст. Флаг становится равным 1 после того, как данное перегружается в регистр сдвига. Т.е. флаг сообщает о том, что буферный регистр пуст, может быть загружено новое данное. Флаг устанавливается аппаратно и сбрасывается после записи байта в буферный регистр USART_DR.
  • Бит 6 TC. Флаг устанавливается аппаратно и сообщает о том, что передача данного закончена, сдвиговый регистр пуст. Если предыдущий флаг (TXE) говорит о том, что можно в буферный регистр загружать новое данное. Физическая передача может продолжаться, на выходе TX возможно идет поток битов. То флаг TC сообщает, что все биты переданы. Часто этот момент необходимо определять для отключения передатчика шинного интерфейса сети, например, в интерфейсе RS-485. Сбрасывается флаг последовательным чтением регистров USART_SR и USART_DR.
  • Бит 5 RXNE. Буферный регистр приема не пуст. Флаг сообщает, что в буферном регистре приемника есть данное. Данное должно быть считано до прихода следующего, иначе оно будет потеряно. Сбрасывается флаг при чтении регистра USART_DR.

UART способен определить некоторые ошибки приема данных, возникающие из-за искажения сигнала при передаче или за счет неправильных программных операций с ним. Об ошибках сигнализируют следующие 4 бита.

  • Бит 3 ORE. Ошибка переполнения. Флаг устанавливается в случае, если в приемный буферный регистр поступило новое данное, а предыдущее считано не было. Т.е. при потере данного.
  • Бит 2 NE. Флаг устанавливается при выделении шума во входном сигнале. Наличие шума определяется как слишком частое переключение входного сигнала.
  • Бит 1 FE. Ошибка приема фрейма (кадра). Возникает, когда не был выделен стоп-бит. Т.е. после приема стартового бита и 8 битов данных на месте стопового бита UART считал сигнал низкого уровня.
  • Бит 0 PE. Ошибка паритета. Сигнализирует об ошибке при включенном контроле четности.

Все биты сбрасываются программно последовательным чтением сначала регистра USART_SR, затем USART_DR.

USART_DR — регистр данных.

Используется для записи данных в буферный регистр передатчика и чтения данных из буферного регистра приемника. На самом деле это 2 регистра, для обращения к которым используется один адрес.

USART_BRR — регистр, задающий скорость обмена.

Регистр содержит значение делителя частоты (USARTDIV), который определяет скорость передачи и приема данных.

Скорость вычисляется по формуле:

BAUD = Fck / (16 * USARTDIV), где

  • BAUD – скорость, бод.
  • Fck – входная частота тактирования UART:
    • сигнал PCLK2 для UART1 (шина APB2);
    • сигнал PCLK1 для UART2 и 3 (шина APB1).
  • USARTDIV – значение регистра USART_BRR.

USARTDIV задано в формате с фиксированной запятой с дробной частью.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Целая часть (12 разрядов) Дробная часть (4 разр)
11 10 9 8 7 6 5 4 3 2 1 0 -1 -2 -3 -4

В верхней строке – разряды регистра USART_BRR.

В нижней строке – разряды дробного числа USARTDIV. Отрицательные – это дробные разряды. Разряд – 1 это ½ или в десятичном виде 0,5. -2 это ¼ или 0,25. И т.д. Это стандартная форма представления дробного числа с фиксированной запятой. Для перевода в привычную десятичную форму можно воспользоваться формулой:

Десятичное значение USARTDIV = целая часть + (дробная часть / 16).

Например, если целая часть равна 78, а дробная 5, то

USARTDIV = 78 + (5 / 16) = 78,3125.

Можно перевести в десятичный код содержимое всего регистра (разряды 0…15) и разделить его на 16.

Скорость при частоте тактирования 72 Мгц

BAUD = 72000000 / (16 * 78,3125) = 57462 бод.

Для обратного вычисления USARTDIV по скорости BAUD можно использовать формулу:

USARTDIV = Fck / (16 * BAUD)

USART_CR1 – управляющий регистр 1.

  • Бит 13 UE. Разрешение работы UART. Отключение UART (UE=0) уменьшает ток потребления микроконтроллера.
  • Бит 12 M. Задает длину слова 8 бит (M=0) или 9 бит (M=1).
  • Бит 10 PCE. Разрешение контроля четности (PCE=1).
  • Бит 7 TXEIE. Разрешение прерывания по флагу TXE, т.е. когда буферный регистр передатчика пуст.
  • Бит 6 TCIE. Разрешение прерывания по флагу TC, т.е. когда пуст сдвиговый регистр передатчика.
  • Бит 5 RXNEIE. Разрешение прерывания по флагу RXNE, т.е. когда в буферном регистре приемника есть непрочитанное данное.
  • Бит 3 TE. Разрешение работы передатчика.
  • Бит2 RE. Разрешение работы приемника.

У всех разрядов активный уровень единица.

USART_CR2 – управляющий регистр 2.

Нам интересно только одно поле.

  • Биты 13:12 STOP. Биты задают формат стопового признака слова:
    • 00 – 1 стоп-бит;
    • 01 – 0,5 стоп-бита;
    • 10 – 2 стоп-бита;
    • 11 – 1,5 стоп бита.

USART_CR3 – управляющий регистр 3.

Пока при инициализации UART запишем в этот регистр 0.

Работа с UART через регистры CMSIS.

Большей частью мы будем управлять UART с помощью HAL- функций. Но бывают задачи, когда без прямого обращения к регистрам UART не обойтись.

Например, сейчас я разрабатываю центральный контроллер для системы управления шаговыми двигателями. Передача данных происходит со скоростью 1 Мбит/сек, и операции обмена крайне критичны ко времени выполнения. Тратить время на вызовы функций библиотеки HAL при такой задаче очень расточительно. Все удачно реализовывается при прямом обращении к регистрам UART.

Поэтому, я решил, коротко рассказать о таком способе управления передачей данных.

Поставим задачу – реализовать эхо-терминал. Т.е. устройство, которому мы посылаем данные и получаем их в ответ. Будем использовать UART1. В нашей системе он уже подключен к компьютеру.

Создадим проект Lesson20_1. В нем настроим только систему тактирования на частоту 72 мГц.

В файле main.c создаем блок инициализации UART.

/* USER CODE BEGIN SysInit */

Включаем тактирование UART1. Он подключен к шине APB2.

RCC->APB2ENR |= RCC_APB2ENR_USART1EN; // включаем тактирование UART1

UART1 использует выводы: PA9 (для сигнала TX) и PA10 (сигнал RX). Надо задать конфигурацию для них.

RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // разрешаем тактирование порта GPIOA

// настройка вывода PA9 (TX1) на режим альтернативной функции с активным выходом
// Биты CNF = 10, ,биты MODE = X1
GPIOA->CRH &= (

GPIO_CRH_CNF9_0);
GPIOA->CRH |= (GPIO_CRH_CNF9_1 | GPIO_CRH_MODE9);

// настройка вывода PA10 (RX1) на режим входа с подтягивающим резистором
// Биты CNF = 10, ,биты MODE = 00, ODR = 1
GPIOA->CRH &= (

GPIO_CRH_CNF10_0);
GPIOA->CRH |= GPIO_CRH_CNF10_1;
GPIOA->CRH &= (

(GPIO_CRH_MODE10));
GPIOA->BSRR |= GPIO_ODR_ODR10;

Теперь конфигурация самого UART.

// конфигурация UART1
USART1->CR1 = USART_CR1_UE; // разрешаем USART1, сбрасываем остальные биты

Устанавливаем скорость обмена.

Частота тактирования UART1 72 мГц, нам нужна скорость 9600 бод. Вычисляем значение USARTDIV.

USARTDIV = Fck / (16 * BAUD) = 72000000 / (16 * 9600) = 468,75

Значение регистра USART_BRR = 468,75 * 16 = 7500.

USART1->BRR = 7500; // скорость 9600 бод

Разрешаем работу приемника и передатчика. Прерывания по событиям UART не разрешаем.

USART1->CR1 |= USART_CR1_TE | USART_CR1_RE ; // разрешаем приемник и передатчик
USART1->CR2 = 0;
USART1->CR3 = 0;

Теперь для передачи необходимо дождаться, когда бит TXE станет равным 1 и загрузить в регистр данных передаваемое число.

Для приема надо дождаться, когда бит RXNE станет равным 1 и считать из регистра данных принятое число.

Для реализации эхо-терминала поместим такой блок в цикл while:

/* Infinite loop */
/* USER CODE BEGIN WHILE */

/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */

Загрузить проект можно по ссылке:

Зарегистрируйтесь и оплатите. Всего 60 руб. в месяц за доступ ко всем ресурсам сайта!

Загружаем программу в микроконтроллер.

Запускаем программу CoolTerm.

Нажимаем Options, выбираем COM-порт, скорость обмена.

Нажимаем кнопку Connect.

В верхнем меню, в закладке Connection выбираем Send String (Послать строку).

Набираем текстовую информацию, нажимаем Send и посланная строка появляется в окне принятых данных.

Программу CoolTerm можно не закрывать. Если необходимо загрузить программу в STM32, то можно нажать кнопку Disconnect. CoolTerm освободит COM-порт и даст возможность запрограммировать микроконтроллер. Для возобновления работы CoolTerm достаточно нажать Connect.

Использование прерываний UART.

В предыдущей программе в основном цикле while постоянно происходила проверка состояния флага RXNE. На остальные задачи времени не оставалось. И это притом, что флаг становился активным не чаще чем с периодом 1 мс. Заставить микроконтроллер тратить минимум вычислительных ресурсов на работу с UART можно за счет применения прерываний.

Реализуем ту же задачу с использованием прерываний.

Я создал новый проект Lesson20_2, в котором настроена только система тактирования на 72 мГц.

Открываем урок 18 и кто забыл, повторяем необходимые действия для работы с прерываниями.

Копируем блок инициализации UART из предыдущей программы. В нем делаем изменения только в одной строке. В регистре CR1 разрешаем прерывание по флагу RXNE.

USART1->CR1 |= USART_CR1_TE | USART_CR1_RE | USART_CR1_RXNEIE; // разрешаем приемник, передатчик и прерывание по приему

Разрешаем прерывание в контроллере прерываний.

// разрешения прерывания UART1 в контроллере прерываний
NVIC_EnableIRQ (USART1_IRQn);

В конце файла stm32f1xx_it.c размещаем функцию обработки прерывания UART1.

/* USER CODE BEGIN 1 */

void USART1_IRQHandler(void) <

Не забываем добавить в файл stm32f1xx_it.h прототип функции обработки прерывания.

/* Exported functions prototypes ———————————————*/
void USART1_IRQHandler(void);

Остается заполнить функцию обработки прерывания.

/* USER CODE BEGIN 1 */

void USART1_IRQHandler(void) <

uint8_t d = USART1->DR; // получить данное
USART1->DR = d; // отослать данное назад
>

Загрузить проект можно по ссылке:

Зарегистрируйтесь и оплатите. Всего 60 руб. в месяц за доступ ко всем ресурсам сайта!

Теперь цикл while пустой. В нем можно выполнять любые задачи. Микроконтроллер будет прерывать его только на короткое время при приеме данного.

В следующем уроке будем работать с UART через HAL-функции. Поговорим об отладке программ с помощью UART.

Источник

Оцените статью