Jump to content
LiVit

STM32F030 USART1 прием пакетов неизвестной длины

Recommended Posts

Привет коллеги! Данная публикация - для тех, кто еще не все плюшки UARTA попробовал ))

USART1 (и только он) микроконтроллеров серии STM32F030 предоставляет возможность принимать пакеты данных с неизвестной заранее длиной пакета.
Для этого можно использовать овертаймер.
Работает это так:
Если в течение заданного времени не будет принят старт-бит очередного байта, генерируется прерывание.
Время ожидания задается не физически (в секундах), а в количестве бит, которые могли бы быть приняты на данной скорости.
т.е., если мы зададим число 16, то прерывание возникнет, если в течение времени эквивалентному приему 16 бит, на вход USART не поступит старт-бит.

Как включить.
1 разрешим прерывание - бит RTOIE регистра CR1
2 зададим время (количество бит) в регистре RTOR
3 разрешим работу овертаймера - бит RTOEN регистра CR2
4 при возникновении прерывания от USART1, смотрим флаг RTOF в регистре ISR, - если есть флаг, значит это оно
5 сбросим флаг прерывания - бит RTOCF в регистре ICR.

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

Share this post


Link to post
Share on other sites

Есть еще IDLE в прерывании которго можно включить таймер это для старых версий. Я не жду первого байта просто прием по ДМА, окончание пакето по RTOR, таймаут по приему ответа (если мастер) на отдельном таймере (даже программный на тиках ОС).

Edited by MasterElectric

Share this post


Link to post
Share on other sites
16 часов назад, MasterElectric сказал:

Есть еще IDLE в прерывании которго можно включить таймер это для старых версий. Я не жду первого байта просто прием по ДМА, окончание пакето по RTOR, таймаут по приему ответа (если мастер) на отдельном таймере (даже программный на тиках ОС).

Тоже хорошо!
RTOR далеко не все микроконтроллеры имеют. И у STM32F030 - только для USART1.

Но мне лень было с таймерами возиться.

Share this post


Link to post
Share on other sites

Вебинар «Экосистема MEAN WELL. Решения для любых задач электропитания» (20.05.2021)

Приглашаем 20 мая на вебинар, посвященный линейке поставок компании MEAN WELL и ее подходу к производству источников питания — как экосистемы продукции и услуг, которая позволяет подобрать оптимальный источник питания для любых задач электропитания. Рассмотрим весь спектр выпускаемой продукции MEAN WELL в области AC/DC-, DC/DC- и DC/AC-преобразователей с подробным разбором интересных и уникальных новинок, их применении и многое другое.

Подробнее

Барьерные силовые клеммы от Degson – расширение складского ассортимента Компэл

Обновленная линейка барьерных клеммных блоков Degson, поступивших на склад Компэл, содержит широкий ряд клемм, подходящих для соединения проводников различного сечения (от 22AWG до 10AWG). Барьерные клеммные колодки сочетают в себе удобство, простоту и надежность соединения. Это достигается за счет ответственного производства и использования высококачественных материалов. Винтовые клеммные блоки барьерного типа Degson предназначены в первую очередь для коммутации в сильноточных цепях, например, в распределительных и измерительных системах.

Подробнее

6 часов назад, dosikus сказал:

LiVit, это делается с DMA ...

Сообщение неинформативно, следовательно неинтересно. Тем более, MasterElectric это уже написал.
Я делал на прерываниях, потому что byte stuffing сразу отслеживал и выбрасывал "лишние" байты.

Share this post


Link to post
Share on other sites

Материалы вебинара «Решения Analog Devices для гальванической изоляции. Обзор технологий и новинок»

Опубликованы материалы вебинара, посвященного решениям Analog Devices для гальванической изоляции. На вебинаре рассказали о: технологии гальванической изоляции iCoupler, цифровых изоляторах, технологии isoPower, гальванически изолированных интерфейсах (RS-485, CAN, USB, I2C, LVDS) и многом другом. Материалы вебинара будут интересны разработчикам промышленной автоматики и медицинской техники.

Подробнее

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

  • Similar Content

    • By For the North !
      Подскажите, как подключить электретный микрофон к отладочной плате stm32f0discovery. Выбрал микрофон VS4011S36, 4,5 В, 4 мм. Нужно знать конкретно какие провода к каким входам подключать. Заранее спасибо!


      https://static.chipdip.ru/lib/735/DOC000735976.pdf   --- Datasheet на плату
    • By One _ moment
      Здравствуйте. Нужно разобраться с принципом работы интерфейса I2C на Stm32. понимаю, что материала в интернете много, но почему-то даже просто структура, где определяются параметры, у меня другая.
      Моя вот такая:
      typedef struct
      {
        uint32_t I2C_Timing;  
        uint32_t I2C_AnalogFilter;      
        uint32_t I2C_DigitalFilter; 
        uint32_t I2C_Mode;  
        uint32_t I2C_OwnAddress1;
        uint32_t I2C_Ack;
        uint32_t I2C_AcknowledgedAddress;
      }I2C_InitTypeDef;
      Те, что даются в примерах, в статьях, такая:
      typedef struct
      {
        uint32_t I2C_ClockSpeed;          
       
        uint16_t I2C_Mode;                
       
        uint16_t I2C_DutyCycle;           
       
        uint16_t I2C_OwnAddress1;         
       
        uint16_t I2C_Ack;                 
       
        uint16_t I2C_AcknowledgedAddress; 
      }I2C_InitTypeDef;
       
      Найдя пример на этом форуме (https://forum.cxem.net/index.php?/topic/202586-i2c-%D0%B2-stm32f030/) увидел, что используются параметры такие же, что и у меня, но теперь не понятно, откуда такие значения берут и по какой логике. 
      Прошу не пинать ногами и кидать в меня гнилые помидоры, а помочь разобраться в этом всём или подсказать, где можно найти исчерпывающую информацию, где хорошо и по полочкам всё разложено.
      Программирую в keil uVision v5
      Отладочная плата stm32f0 disco
      МК stm32f0030r8
      Благодарю заранее.
    • By LiVit
      Приветствую, коллеги!
      Ситуация такая: есть серия устройств на STM32F030R8, на некоторых время от времени начинает греться микроконтроллер. 
      Вся логика работает, всё вроде в порядке, кроме потребления в 250мА. И перегретого корпуса микроконтроллера.
      В прошивке изначально отсутствовала инициализация неиспользуемых ног, кроме того, проц сначала старается завести внешний кварц, и только потом переходит на внутренний генератор.
      Нога BOOT0 притянута к земле напрямую, без резистора.
      На проце который уже начал перегреваться, я сделал инициализацию всех ног на вход, с подтяжкой ног к земле. Сразу завожу внутренний тактовый генератор.
      К сожалению, ему уже ничего не помогает, - даже будучи стертым, он жрет 200 мА. Как я понимаю, тут мои полномочия всё.
      Хотелось бы услышать от коллег, что именно могло вызвать такую странную неисправность проца? Может кто сталкивался? В Errata ничего подобного не нашел.
    • By User_1
      Всем привет!
      Почему-то этот код работает: 
      void Send_to_UART(char* string) { char data = 0; while(*string) { while(!(USART_GetFlagStatus(USART1, USART_FLAG_TXE))); data = *string; USART1->TDR = data; string++; } while(!(USART_GetFlagStatus(USART1, USART_FLAG_TXE))); USART_SendData(USART1, 0x0D); while(!(USART_GetFlagStatus(USART1, USART_FLAG_TXE))); USART_SendData(USART1, 0x0A); while(!(USART_GetFlagStatus(USART1, USART_FLAG_TC))); } char hello[13] = {'H','e','l','l','o',' ','W','o','r','l','d','!'}; int main (void) { Init_Clock(); Init_USART1(); Send_to_UART(hello); while(1); } А если написать вот так:
      int main (void) { Init_Clock(); Init_USART1(); Send_to_UART("Hello World!"); while(1); } то не просто не работает - микроконтролер зависает даже до входа в main().
      В Си ведь, насколько я понимаю, строка - это тот же массив символов
      Объясните, пожалуйста, что я делаю не так?
      Камень stm32f030, среда CooCox CoIDE
×
×
  • Create New...