8-900-374-94-44
[email protected]
Slide Image
Меню

Прерывания uart stm32: STM32 UART. Прием и передача данных по UART в STM32CubeMx.

Программный UART для любого микроконтроллера. Ч1

 

   Иногда возникает ситуация, когда аппаратных ресурсов микроконтроллера не хватает или требуемый ресурс в его составе отсутствует. Решить эту проблему можно двумя способами – заменить используемый микроконтроллер на другой или реализовать требуемый ресурс программно. Оба способа имеют свои достоинства и недостатки, однако второй вариант часто более предпочтительный, а иногда и единственно возможный. Например, как в случае с 1-Wire интерфейсом, который не поддерживается аппаратно ни в одном 8-ми разрядном микроконтроллере AVR. 

   В этой статье рассмотрена реализация программного UART`а, которую можно модифицировать под любой микроконтроллер, программируемый на Си. Во второй части статьи будет рассмотрена реализация программного UART`а модифицированного под микроконтроллер AVR. Материал написан на основе IAR`овского апноута, найденного на  просторах интернета. 

   Для использования кода программного UART`а, необходимо выполнение следующих требований:

1. Наличие Си компилятора под используемый микроконтроллер

2. Наличие у микроконтроллера таймерного прерывания. 

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

В данном коде реализованы следующие функции.

 

1. void flush_input_buffer( void )

Очистка входного (приемного) буфера.  

 

 2. char kbhit( void )

Тестирование входного буфера на наличие данных.

 

3. char getchar( void )

Чтение символа из входного буфера. 

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

Если на момент вызова данной функции входной буфер пуст, функция ожидает поступление данных. При этом в цикле выполняется пользовательская функция idle(). Про нее написано ниже.

 

4. void turn_rx_on( void )

Разрешает прием данных по UART`у. По умолчанию прием данных разрешен.

 

 5. void turn_rx_off( void )

Запрещает прием данных по UART`у.  

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

 

6. void putchar( char )

Запись символа в последовательный порт

 

7. void init_uart( void )

Инициализация программного  UART`a. Устанавливает внутренние флаги, настраивает выводы микроконтроллера и таймер.

   Данная программная реализация UART`а основана на использовании прерывания таймера. Разрядность таймера и режим работы значения не имеют, главное чтобы частота его прерываний могла быть установлена в три раза выше требуемой скорости обмена. 

   Например, требуется скорость 9600 бит в секунду. Тогда прерывания таймера должны происходить с частотой 9600*3 = 28800 Гц. Или в пересчете на временной интервал – каждые 34,72 микросекунды. 

   Это накладывает скоростные ограничения на возможности применения программного UART`a, особенно в микроконтроллерах с низкой тактовой частотой.  

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

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

   Код программного UART`a из IAR`овского апноута записан в сишном файле. Подключить его к проекту можно  двумя путями:

– скопировать этот код в один из сишных файлов своего проекта

– написать к сишному файлу заголовочный и подключить к проекту полноценный модуль

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

 

   Однако это еще не все. 

   Для переносимости кода в нем не реализовано несколько платформенно-зависимых функций, которые вам потребуется написать. Функции перечислены в списке ниже. 

В принципе ничего сложного в этом нет. 

 

1. void get_rx_pin_status( void )

Возвращает состояние приемного вывода (receive pin). 

 

2. void set_tx_pin_high( void )

Устанавливает на передающем выводе (transmit pin) логическую единицу. 

 

3. void set_tx_pin_low( void )

Устанавливает на передающем выводе логический ноль. 

 

4. void idle( void )

Фоновая пользовательская функция. Выполняется, когда ожидается прием данный. 

 

5. void timer_set( int BAUD_RATE )

Устанавливает частоту прерываний таймера. Частота прерываний должна быть в 3 раза выше требуемой скорости обмена! 

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

 

6. void set_timer_interrupt( timer_isr )

Разрешает прерывания таймера.

 

 

   Для экономии памяти и увеличения производительности кода некоторые из этих функций можно заменить макросами. Например, функции 1, 2, 3 и 6. 

   Функцию 4 можно оставить пустой. 

   

И последнее что нужно сделать, это поместить код функции void timer_isr(void) в прерывание таймера. Сделать это можно опять-таки двумя способами:

— поместить вызов функции timer_isr() в код обработчика прерывания

— сделать из самой функции timer_isr() обработчик прерывания

 

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

software-uart.rar

STM32 USART Лекция 13 — Обсуждение прерываний USART 013  

В этой статье давайте обсудим прерывания USART.

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

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

Рисунок 1. Запросы прерывания USART.

 

Некоторые важные события прерывания, инициированные периферийным устройством USART, перечислены ниже:

  1. Регистр передачи данных пуст: на самом деле это прерывание TXE.
  2. Флаг CTS: относится к аппаратному управлению потоком. Это означает, что когда флаг CTS установлен, он может генерировать прерывание, если разрешен управляющий бит CTSIE.
  3. Управление передачей (TC)
  4. Полученные данные готовы к чтению: на самом деле это прерывание RXNE.
  5. Обнаружена ошибка переполнения: Всякий раз, когда во время приема происходит переполнение, может генерироваться прерывание, если разрешен управляющий бит RXNEIE.
  6. Обнаружена свободная линия: после передачи всех кадров линия становится свободной, что на самом деле является свободной линией. Всякий раз, когда обнаруживается свободная линия, она также может генерировать прерывание, если в управляющем регистре разрешен бит IDLEIE.

 

На рис. 2 показана диаграмма сопоставления прерываний USART. В котором вы можете видеть, что от каждого периферийного устройства USART идет только одна линия, и она попадает в NVIC-движок процессора.

В I2C вы видели две линии, выходящие из каждого периферийного устройства USART. Один для ошибки, а другой для события. Но здесь все не так. Вы можете проанализировать схему отображения прерываний USART из справочного руководства.

Рисунок 2. Диаграмма отображения прерываний USART.

 

Упражнение:

  1. Завершите API прерывания. Реализация API-интерфейсов прерываний должна быть выполнена аналогично тому, что вы делали для I2C и SPI.
  2. После этого укажите макросы определения IRQ USART в специальном заголовочном файле MCU.

 

Курсы FastBit Embedded Brain Academy

Нажмите здесь: https://fastbitlab.com/course1

 

Теги: Лекции STM32 USART 900 14

FastBitLab

Академия FastBit Embedded Brain Academy использует возможности Интернета, чтобы предлагать онлайн-курсы, связанные с программированием встроенных систем, операционной системой реального времени, встроенными системами Linux и т.

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

STM32F103C8 — UART с буфером DMA и обнаружением простоя — bepat GmbH & Co. KG

Abstract

В этом уроке я опишу, как:
[+] использовать U(S)ART микропроцессора STM32F103C8
[+] с кольцевым буфером DMA для Rx,
[+] обычный буфер DMA для Tx,
[+ ] и как использовать Idle Line Interrupt для получения сообщений неизвестной длины

STM32F103C8 — Учебное пособие по циклическому DMA прерывания UART по простою — Обзор оборудования

Аппаратные требования

Я использую макетную плату Bluepill с микропроцессором STM32F103C8T6, CubeMX для настройки оборудования, CubeIDE для редактирования и уровень аппаратной абстракции STM32 HAL вместе со следующим оборудованием:
[+] макетная плата и несколько перемычек
[ +] ST-Link V2 Clone
[+] простой преобразователь UART в USB, вы можете получить, например.

с ебэя

Полезные ссылки

  • RM0008 — Руководство пользователя STM32F10x — Глава 13 (Контроллер прямого доступа к памяти)
  • AN3109 — Эмуляция FIFO коммуникационного периферийного устройства с тайм-аутом DMA и DMA в микроконтроллерах STM32F10x

Cube MX: базовая настройка

Используйте CubeMX и следуйте инструкциям в этом руководстве для настройки RCC, настроек часов, SWD и настройки проекта. В этом примере основная частота MCU составляет 72 МГц.

Cube MX: прериферальные

В этом уроке нам нужен PC13 в качестве выхода GPIO и USART1 с DMA-каналами для RX и TX и включенными глобальными прерываниями: