Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
1 / 1 / 1
Регистрация: 21.01.2015
Сообщений: 32
1

UART и STM32F103

02.02.2020, 22:50. Просмотров 490. Ответов 5
Метки нет (Все метки)

Здравствуйте, уважаемые! Начал тут заниматься STM32, перейдя на него с AtMega. Возник вопрос - как принять данные с UART в любой момент времени? То есть нужно так - контроллер тихо-мирно опрашивает, например, 2 клавиатуры, рисует мне картинку на дисплей, а когда пришло сообщение в UART, код должен прерываться там, где он есть, сообщение приниматься, делаться соответствующим изменениям и запускаться с того же места, где он и остановился. Вроде как, немного почитав, узрел прерывания от UART, но так и не понял, как ими нормально пользоваться и как всё-таки организовать вызов прерывания именно в том месте, где пришла информация. То есть треба примерно так (код условный):
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
while (1)
{
   if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 0)
   {
     (делать что-то)
   }
if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == 0)
   {
     (делать что-то)
   }
if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_3) == 0)
   {
     (делать что-то)
   }
if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4) == 0)
   {
     (делать что-то)
   }
if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5) == 0)
   {
     (делать что-то)
   }
if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_6) == 0)
   {
     (делать что-то)
   }
//И вот где-то тут приходит мне сообщение с UART, так как я не могу после каждой операции вызывать обработчик UART, то как же его так повесить, что бы при приходе сообщения он автоматически переходил в обработчик?
if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7) == 0)
   {
     (делать что-то)
   }
}
Может кто посоветовать, чего почитать? Сразу говорю, в английский туго. То есть если других материалов нет, то въеду, конечно, просто на понимание уйдет в 2 раза больше времени, поэтому если можно - на русском. Пока что моя конструкция
для подобных случаев выглядит так, но це костыль:
C
1
2
3
4
5
6
7
8
9
10
"где-то в глобальных переменных"
uint8_t RX = 0x00;
while(1)
{
while (RX == 0x00)
   {
     HAL_UART_Receive_DMA(&huart1, &RX, 1);
   }
что-то делаю...
}
Неудобно тем, что пока не пришел вызов с UART, контроллер висит. Ладно, когда у тебя прикручен некстионовский дисплей или машинка должна что-то делать только после прихода команды, ну а если нет?... В общем, никак не въеду в эту тему. Если может като помочь - объясните, как сделать красиво, пожалуйста.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.02.2020, 22:50
Ответы с готовыми решениями:

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

STM32F103, проблема с UART на скорости 9600
Столкнулся с такой проблемой, плата с установленным STM32F103VBT по RS485 передает данные на...

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

SDIO + SD + STM32F103
Доброго всем утра. Столкнулся с проблемой при работе с micro SD через SDIO. Вываливается ошибка...

5
2512 / 1557 / 335
Регистрация: 09.09.2017
Сообщений: 6,265
03.02.2020, 09:40 2
Вы же в Атмегах сталкивались с прерываниями. В stm32 они тоже есть. Реализаций приема по прерываниям я вижу две:
1. Прием по одному байту и программная очередь (FIFO). А в основном цикле проверяете пришло ли сообщение, какой длины и какое. Преимущество - простота. Недостаток - относительно большие накладные расходы
2. Прием через DMA. Тут алгоритм посложнее: придется отслеживать сколько байтов реально принято, хитрым образом заворачивать массивы и т.п. Зато вся эта логика потребуется не на каждом байте, а по заполнению буфера, то есть гораздо реже.
Я бы посоветовал начать с первого варианта. Если обмен по UART происходит с не слишком большой скоростью, его вполне хватит.
0
1 / 1 / 1
Регистрация: 21.01.2015
Сообщений: 32
11.02.2020, 05:56  [ТС] 3
Не, покурил оба варианта, не то. Оба требуют ожидания в цикле, а он него я и хочу избавиться, не потеряв в скорости реакции на сообщение. Пока курил, обратил свой взор на freeRTOS, с его многозадачностью он вполне может с задачей справится. В общем-то, опрос UART в таймере тоже дело, но FTOS всё-таки допиленная и отлаженная система, меньше проблем с пересечением таймеров по времени. Да и таймер освобождается, а то и прибавляется - многозадачность жеж, а значит, и свои таймеры есть.
0
2512 / 1557 / 335
Регистрация: 09.09.2017
Сообщений: 6,265
11.02.2020, 10:27 4
Цитата Сообщение от CanchezAKG Посмотреть сообщение
Не, покурил оба варианта, не то. Оба требуют ожидания в цикле
В этой теме только 3 поста, из которых 2 ваши. Не будете же вы себя курить! Но и в моем ни слова про ожидание в цикле. Значит нашли "варианты" где-то еще. Может выложите ссылку?
0
2573 / 1165 / 152
Регистрация: 28.10.2011
Сообщений: 4,113
Записей в блоге: 6
11.02.2020, 13:08 5
Цитата Сообщение от CanchezAKG Посмотреть сообщение
немного почитав, узрел прерывания от UART, но так и не понял, как ими нормально пользоваться
https://blog.avislab.com/stm32-usart_ru/
0
1 / 1 / 1
Регистрация: 21.01.2015
Сообщений: 32
17.06.2020, 18:24  [ТС] 6
Ссылок не скину, сорри, забыл про эту тему, давно уже было, так что ссылки уже не помню просто, а проблему в итоге решил вызовом коллбека.
C
1
2
3
4
extern void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  //обработчик, сюда запихивать действия по приходу информации, в т.ч. приём информации и запихивание в буфер.
}
Нашел этот способ в каком-то дремучем видео на ютубе, найти не смог, но там было про работу с USB в режиме виртуального COM порта.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.06.2020, 18:24

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

STM32F103 + XPT2046
Буду признателен если поделитесь рабочей библиотекой для touch на контроллере XPT2046 Отладочная...

STM32F103 + Cube + SD
Всем день добрый! Делаю логгер. Объем записываемых данных - около 120кб/мин. Записываю по 512 байт...

мистика stm32f103
купил мк stm32f103 распаял его на плате, подвел питания,землю, risit подвесил на VDD через резюк,...

USART1 и stm32f103
Нужно по USORT1 получить отклик от нажатия PE6, но я не могу понять почему не получается, помогите...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.