Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

ModbusRTU и STM32F103

Чт янв 12, 2023 12:18:23

Добрейшего времени суток всем.
Понадобилось мне запустить ModbusRTU на ранее готовом устройстве, МК STM32F103, через UART2, порты А2 и А3.
Прошу индейку как лучше это сделать. Так как устройство физически уже есть и заточено под некоторые задачи, то внутренние аппаратные ресурсы очень ограничены.
Таймер 2 однозначно занят, запускается не всегда и от внешнего события. Другие таймеры не хотелось бы выделять под это дело, но рассмотреть можно.
Фиксировать и анализировать время приема каждого байта не вариант, так как уверен что не хватит ресурсов, чтобы укладываться вовремя. Сейчас скорость 9600 и понижать не хочется.

Сейчас я сделал через событие IDLE UART и DMA. В принципе работает. Но я нарушаю стандарт RTU. Вместо интервалов <1.5 и >3.5 между байтами и пакетами соответственно, у меня получается <1 и >1.
Если нечего не придумается, то я так и оставлю. Но все же хотелось бы соответствовать стандарту.

Спасибо.

З.Ы. Modbus ASCII не хочу.

Re: ModbusRTU и STM32F103

Чт янв 12, 2023 12:37:03

А не получится его на G0 заменить? По ногам более-менее должно совпадать по идее. А у G0 есть аппаратная поддержка этого идиотского модбаса.

Re: ModbusRTU и STM32F103

Чт янв 12, 2023 12:41:55

Z_h_e писал(а):Но я нарушаю стандарт RTU. Вместо интервалов <1.5 и >3.5 между байтами и пакетами соответственно, у меня получается <1 и >1.

Для соблюдения требований протокола нужно задействовать таймер или использовать МК с полноценным UART, имеющим RTO, а не кастрата как в F1. Для STM32F103 оставь приём по IDLE и забей. Работает вполне нормально на небольших скоростях или при обменен с узлами, отправляющими через DMA или FIFO.

Re: ModbusRTU и STM32F103

Чт янв 12, 2023 13:12:35

Eddy_Em писал(а):А не получится его на G0 заменить?
Не.Это невозможно.
tonyk писал(а):приём по IDLE и забей
Наверное, но вдруг существуют какие-то решения, а я не знаю. Например, как-ниубдь умудрится 3 раза подряд взвести флаг IDLE.

Re: ModbusRTU и STM32F103

Чт янв 12, 2023 13:45:18

Z_h_e писал(а):как-ниубдь умудрится 3 раза подряд взвести флаг IDLE.

Никак он три раза _сам_ не установится. На F1 других решений нет.

Re: ModbusRTU и STM32F103

Чт янв 12, 2023 15:00:16

Z_h_e, а почему вдруг невозможно? Нужно много операций деления что ли? Или по производительности не канает?
Если что, есть еще F303, у которого тоже на аппаратном уровне поддержка модбаса. Там уж точно по ногам практически 1-в-1 получается F103, сам делал не так давно универсальную "вундервафлю" для тестирования F0x2, F103 и F302/303 в корпусе LQFP64. Плюсом является бóльшая производительность, наличие флоатов, наличие ЦАПов и еще разнообразные фишки. По цене, конечно, не 50 рублей, как F103C6T6, но рублей в400 уложиться можно (если LQFP-48).

Re: ModbusRTU и STM32F103

Пт янв 13, 2023 09:25:08

Менять МК не вариант однозначно.
Отвлекать МК на принятие каждого байта, при наличии DMA, имхо зло. Да еще модбас планируется постоянно молотящий.
Я что вопрос то задал, вдруг упускаю какое-то интересное и оригинальное решение.

Re: ModbusRTU и STM32F103

Пт янв 13, 2023 09:50:36

Я все не пойму, почему МК заменить нельзя?
F103 худшее детище ST!

Re: ModbusRTU и STM32F103

Пт янв 13, 2023 09:56:37

С учетом но рассмотреть можно опишу пару жутких костылей, до чего дошел:
1) Базовый таймер, настроенный на 3.5, счетчик которого сбрасывается при приеме каждого байта (но придется вешать обработчик на прием или окончание каждого байта DMA)
2) Если найдется свободный таймер общего назначения, то можно его настроить на 3,5 и линию RX завести на вход ETR, у таймера настроить триггер на сброс (фронт тут уж без разницы, наверно), каждый бит посылки будет счетчик сбрасывать.
3*(чисто посмеяться): завести еще на один UART линию RX и настроить его таким образом, чтобы по DMA он сбрасывал счетчик таймера, настроенного на 3.5.

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

Re: ModbusRTU и STM32F103

Пт янв 13, 2023 11:58:04

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

Re: ModbusRTU и STM32F103

Пт янв 13, 2023 17:32:24

Z_h_e писал(а): Однако таймер занят

Если твой девайс будет опрашивать мастер, не допускающий больших пауз между байтами, то IDLE будет нормально работать.
Eddy_Em писал(а):F103 худшее детище ST!

Согласен. Хотя начинал изучение STM32 именно с F103. Потом сравнил с другими сериями, после чего отказался от линейки F1.

Если в проекте изначально предполагается много работы через UART, то нужно брать МК с полноценным UART, а не кастратом как во всей линейке F1. МК с полноценным UART есть во всех линейках, кроме F1.

Re: ModbusRTU и STM32F103

Сб янв 14, 2023 09:50:10

Вам нужна задержка без tim?

- "два" байта "левым" уартом;
- да, любой процесс на свободной периферии, устраивающий вас по времени и способу использования, флаги - хоть выполнения, хоть таймаута;
- время преобразования ацп - то же задержка; (это так, до кучи)
- две свободные ноги и цепочка rc; :))
за шутку извиняюсь, навеяло - схемы конца 70-х часто перед глазами.

сфотографировать можно и на спичечный коробок, но если "спортом" не заниматься - tonyk прав - по задаче и инструмент.

Re: ModbusRTU и STM32F103

Сб янв 14, 2023 11:28:06

Имхо, я бы взял библ freeModbus и портировал её. Порт там несложный и работает все четко

Re: ModbusRTU и STM32F103

Сб янв 14, 2023 11:48:17

Имхо, я бы взял библ freeModbus и портировал её. Порт там несложный и работает все четко
Тут дело не в этом, модуль UART в F103 в принципе не имеет возможности аппаратно отслеживать простой в 3,5 байта, как того требует стандарт.

Re: ModbusRTU и STM32F103

Сб янв 14, 2023 11:56:37

[offtop]А весь прикол ситуации в том, что автор вместо какого-либо вменяемого современного протокола (да пусть даже CANopen) выбрал убогое дерьмо мамонта, которое еще 30 лет назад закопать надо было![/offtop]

Re: ModbusRTU и STM32F103

Сб янв 14, 2023 12:25:06

Eddy_Em, ты не знаешь ни схемы девайса, ни назначения, почему нет возможности сменить МК и остальную схематехнику и пр. Но ты все решил и сделал выводы.
UART древнее модбас, закапывай и его тоже.
Интересно, на автофоруме, на вопрос что подкрутить чтобы приора бензин меньше жрала, ты бы посоветовал Лексус взять?
Я всего-лишь спросил
вдруг существуют какие-то решения, а я не знаю
. Ты предложил сменить МК, я тебя и других услышал. Это сделать нельзя, вот ещё раз отвечаю, что это обсуждать?

Re: ModbusRTU и STM32F103

Сб янв 14, 2023 12:28:40

Eddy_Em писал(а):выбрал убогое дерьмо мамонта, которое еще 30 лет назад закопать надо было!

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

ТС, не слушай Eddy_Em. Он старый, поэтому умные слова, которые он не понимает, его раздражают. :)))

Добавлено after 3 minutes 22 seconds:
Cheeseman писал(а):Имхо, я бы взял библ freeModbus и портировал её. Порт там несложный и работает все четко

Ага, только с одним UART. ТС ведь не уточнял, сколько у него портов требуют обслуживания Modbus. Касаемо чёткости: в этой библе косяк с койлами исправили?

Re: ModbusRTU и STM32F103

Сб янв 14, 2023 12:49:14

Я тоже не молод :(. Скоро пердеть буду чаще, чем проект собирать.:) Можно 100500 примеров привести нового современного промышленного оборудования с модбасом. И пообсуждать это. Очередной топик будет содержать все что угодно, кроме сути.

Re: ModbusRTU и STM32F103

Сб янв 14, 2023 13:28:46

Z_h_e писал(а):Скоро пердеть буду чаще, чем проект собирать.:)

:)))

Одной из причин моего ухода с F1 было отсутствие у него полноценного UART. Когда у тебя один порт с Модбас на 9600, то пофиг, чё и как там реализовано. А когда у МК и так загрузка большая, да ещё и 4-6 портов на высоких скоростях, то уже ищешь МК с полноценным UART, чтобы как можно меньше грузить процессор в МК. Полноценный UART умеет и сигналом DIR трансивера управлять, и задержки после его переключения на передачу сам отрабатывать, и 3.5 символа сам отмерять. В итоге получается 1 прерывание на приём посылки, и 2 на отправку.
Ответить