Easyelectronics.ru

Электроника для всех
Текущее время: 15 окт 2019, 09:41

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 24 ] 
Автор Сообщение
 Заголовок сообщения: Запускаю USART - STM32
СообщениеДобавлено: 15 апр 2019, 10:51 
Заглядывает иногда

Зарегистрирован: 19 ноя 2018, 20:15
Сообщения: 84
Добрый день!

Осваиваю данное семейство, вот хотел уточнить (на ПИКах есть оличия).

Вот я передаю многобайтовый буфер через УАРТ, с использованием к тому же RS 485, т.е при активации передачи я должен поднять ногу "direct" а по окончании передачи последнего байта опустить. (драйверу MAX485 это надо)

Я так полагаю надо использовать прерывание по "TXE — Tx Empty" для положения в USART_DR следующего байта и инкремента указателя буфера?

"TC — Transmit Complete" это состояние "И" пустого USART_DR "И" пустого сдвигового регистра (на ПИКах TSR)? Т.е на STM32 нужно использовать именно его для отключения ноги "direct" (по отдельному прерыванию раз эта вкусность есть)?

И по приему, в протоколе Modbus используется "интервал тишины" - я на ПИКе при помощи таймера отсчитываю милисекунды для интервала кажись, 2,5 байта UART (что-то около того), после чего выставляю свой программный флаг "RX_DONE".
Тут я так полагаю так же? В USART-е ARM-а нет встроенного таймера для этого, придется внешний использовать из набора кристалла?


(HAL не использую, борюсь с навязываемой ардуинизацией мышления, пока кодил на пиках никто этого и не навязывал, а тут..)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запускаю USART - STM32
СообщениеДобавлено: 15 апр 2019, 11:31 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 997
esatman, про TXE и TC всё верно пишешь. Но для передачи лучше использовать DMA. Если надо дёргать R/W то алгоритм примерно такой.

1. Ставим RW в передачу
2. Натравливаем DMA на передачу N байт.
3. По прерыванию конца передачи DMA разрешаем прерывание TC.
4. По прерыванию TC скидываем RW в приём и запрещаем прерывание TC.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запускаю USART - STM32
СообщениеДобавлено: 15 апр 2019, 11:39 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1015
esatman писал(а):
Вот я передаю многобайтовый буфер через УАРТ, с использованием к тому же RS 485, т.е при активации передачи я должен поднять ногу "direct" а по окончании передачи последнего байта опустить. (драйверу MAX485 это надо)

Ты наверно смотришь USART на каком-нибудь F1, он там похуже, а на F0 и т.д. есть поддержка RS485, на время передачи мк дергает ногой DE, видимо это "direct" и есть...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запускаю USART - STM32
СообщениеДобавлено: 15 апр 2019, 11:43 
Заглядывает иногда

Зарегистрирован: 19 ноя 2018, 20:15
Сообщения: 84
Да, у меня тут так скажем, заложено, 103Т6
Про DMA понял, я только с ПИКов перелез, нарабатываю минимальный инструментарий.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запускаю USART - STM32
СообщениеДобавлено: 15 апр 2019, 11:44 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 997
Я уже даже как-то привык, что если ТС не указывает тип МК, то это по дефолту F103 :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запускаю USART - STM32
СообщениеДобавлено: 15 апр 2019, 11:52 
Старожил

Зарегистрирован: 13 июл 2016, 11:05
Сообщения: 417
VladislavS писал(а):
Я уже даже как-то привык, что если ТС не указывает тип МК, то это по дефолту F103 :)


Как мне повезло в свое время, что я начал в STM32 не с F103. :-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запускаю USART - STM32
СообщениеДобавлено: 15 апр 2019, 11:53 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2862
Для F103. Тут правда FreeRTOS, но можно выпилить.
Show UsartModBus.c

Show UsartModBus.h


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запускаю USART - STM32
СообщениеДобавлено: 15 апр 2019, 17:14 
Заглядывает иногда

Зарегистрирован: 03 фев 2019, 16:50
Сообщения: 63
Второй раз HAL_UART_Transmit_DMA срабатывает только с задержкой, не подскажете как скинуть флаги?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запускаю USART - STM32
СообщениеДобавлено: 16 апр 2019, 10:16 
Заглядывает иногда

Зарегистрирован: 19 ноя 2018, 20:15
Сообщения: 84
Ну, запустил, пока портировал свой PIC_код, пашет, буду TX переводить на DMA. Поплясал конечно с таймером под интервал тишины, пока не добрался до теневых регистров и команды
TIM3->EGR |= TIM_EGR_UG; /*!< Update Generation */
Мне же надо сбрасывать точку отсчета с интервалом тишины, а она не сбрасывалась...

Поглядывал в статью
http://easyelectronics.ru/arm-uchebnyj-kurs-usart.html
Подскажите, вот кусок по обрабоке ошибок на примере parity error, делал по статье:

if (USART1->SR & USART_SR_PE)//parity error
{
while(!(USART1->SR & USART_SR_RXNE));
USART1->SR;//читаем SR
USART1->DR;//читаем DR
UART1.PERR_CNT++;//инкремент системного ЛОГа
}
Вроде как надо? Все остальное так же, но без вайла.
Я так понял все эти ошибки затыкают приемник, и их полюбому нельзя да и неправильно игнорировать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запускаю USART - STM32
СообщениеДобавлено: 16 апр 2019, 10:49 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 997
Только пару дней назад пример кидал. Тык.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запускаю USART - STM32
СообщениеДобавлено: 16 апр 2019, 10:55 
Заглядывает иногда

Зарегистрирован: 19 ноя 2018, 20:15
Сообщения: 84
Ну да, логичней!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запускаю USART - STM32
СообщениеДобавлено: 16 апр 2019, 15:52 
Заглядывает иногда

Зарегистрирован: 19 ноя 2018, 20:15
Сообщения: 84
И DMA прикрутил), спасибо, в точном соответствии с предложенной вначале схемой. Отовсюду из всех обработчиков помигал диодами, убедился что все работает. Странно, на удивление с DMA просто оказалось, и без монстроидальных нагромождений HAL!

Еще вопрос!
Мне потребуется как минимум 3 УАРТа, в перспективе, а то и 4. И везде интервалы тишины.
Не тратить же 3-4 таймера на это??? М.б из одного таймера запустить 3-4 counter-a, и по их переполнению программно завершать прием?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запускаю USART - STM32
СообщениеДобавлено: 16 апр 2019, 16:08 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2862
Так ли нужны настолько точные интервалы тишины? Почти во всех Modbus мастерах настраивается время таймаута, хоть секунду выстави. Вполне можно сделать таймерную службу, которая сбрасывает таймер при приеме каждого байта и спустя 5-10 мс говорит что приём окончен. С операционкой всё еще проще, там таймера из коробки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запускаю USART - STM32
СообщениеДобавлено: 16 апр 2019, 17:31 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 3994
Откуда: КЧР, поселок Нижний Архыз
Таймаут значительно проще делается: на системном таймере. Зачем отдельный таймер на эту мелочь тратить?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запускаю USART - STM32
СообщениеДобавлено: 16 апр 2019, 17:56 
Старожил

Зарегистрирован: 02 ноя 2015, 19:21
Сообщения: 607
Откуда: Санкт-Петербург
VladislavS писал(а):
esatman, про TXE и TC всё верно пишешь. Но для передачи лучше использовать DMA. Если надо дёргать R/W то алгоритм примерно такой.

1. Ставим RW в передачу
2. Натравливаем DMA на передачу N байт.
3. По прерыванию конца передачи DMA разрешаем прерывание TC.
4. По прерыванию TC скидываем RW в приём и запрещаем прерывание TC.


А есть ли в этом особый смысл в DMA ? обычно пакет данных по Modbus'у короткий и не особо частый.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запускаю USART - STM32
СообщениеДобавлено: 16 апр 2019, 18:04 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 997
Так логика проще. Положил данные в буфер, сказал DMA сколько байт отправить и забыл.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запускаю USART - STM32
СообщениеДобавлено: 16 апр 2019, 18:25 
Заглядывает иногда

Зарегистрирован: 19 ноя 2018, 20:15
Сообщения: 84
Ну, то что я раньше использовал имеет ту же логику, положил-активировал-забыл, оно само через прерывание отстреляет, но тут еще и типа услуги персонального секретаря - DMA со стола сам заберет и по почте отправит, без участия АЛУ вообще. (а данные по 485 я нехило гоняю, отнюдь не редкими короткими запросами.)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запускаю USART - STM32
СообщениеДобавлено: 16 апр 2019, 18:30 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5690
esatman писал(а):
Странно, на удивление с DMA просто оказалось, и без монстроидальных нагромождений HAL!

Еще вопрос!
Мне потребуется как минимум 3 УАРТа, в перспективе, а то и 4. И везде интервалы тишины.
Не тратить же 3-4 таймера на это??? М.б из одного таймера запустить 3-4 counter-a, и по их переполнению программно завершать прием?


Делай на F0 , там не надо таймеров ни на RTU ни на ASCII ...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запускаю USART - STM32
СообщениеДобавлено: 16 апр 2019, 18:32 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 3994
Откуда: КЧР, поселок Нижний Архыз
dosikus_2 писал(а):
там не надо таймеров ни на RTU ни на ASCII ...

Я как раз для F0 кусок кода приводил. Но пользуюсь системным временем для таймаута. А где там у F0 "из коробки" реализация задержек на UART?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запускаю USART - STM32
СообщениеДобавлено: 16 апр 2019, 18:40 
Старожил

Зарегистрирован: 02 ноя 2015, 19:21
Сообщения: 607
Откуда: Санкт-Петербург
VladislavS писал(а):
Так логика проще. Положил данные в буфер, сказал DMA сколько байт отправить и забыл.

ну это понятно. я таким образом длинные посылки по юарту кидаю или дисплей заливаю. но просто именно в модбасе посылки короткие обычно. (хотя наверно у всех по разному)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запускаю USART - STM32
СообщениеДобавлено: 16 апр 2019, 18:47 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5690
Eddy_Em писал(а):
Я как раз для F0 кусок кода приводил. Но пользуюсь системным временем для таймаута. А где там у F0 "из коробки" реализация задержек на UART?


Не задержек, к примеру F072 - таймаут в битах UARTA'а и прерывание от него. А так же аппаратный CRC и переключалка RS485/
Подробней завтра


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запускаю USART - STM32
СообщениеДобавлено: 16 апр 2019, 19:09 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 3994
Откуда: КЧР, поселок Нижний Архыз
dosikus_2 писал(а):
Не задержек, к примеру F072 - таймаут в битах UARTA'а и прерывание от него.

Ты про RTOEN/RTOIE?
Ну, это не то: там небольшая совсем задержка. Это только для дебильного модбаса нужно...
Я обычно таймаут более жирный делаю (иногда и по паре секунд, чтобы руками можно было набрать строку в терминале, а не посылать ее через echo "труляля" > /dev/ttyUSBx).

А, блин, это я - дурак. Не обратил внимания, что речь и была о дебильном модбасе!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запускаю USART - STM32
СообщениеДобавлено: 16 апр 2019, 21:03 
Старожил

Зарегистрирован: 06 июн 2018, 22:30
Сообщения: 416
Откуда: Киев
Если мы слейв большего и не надо. Если мастер, то используем еще и таймер для определения что слейв не отвечает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запускаю USART - STM32
СообщениеДобавлено: 17 апр 2019, 06:11 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2862
Писал и мастер и слейв. Ничего сверх сложного там нет. Когда прокидывал модбас поверх радиоканала на CC1101 там таймаут ставил больше, и кол-во попыток ретрансмита.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 24 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB