Сделал такой велосипед: Завел DMA RX в циклическом режиме, по IDLE, выделил основной буфер например, например 1 кб, Он будет перезаписываться по кольцу (такая работа DMA). Выделил массив указателей, например 10 штук, которые будут указывать на адреса посылок в основном буфере. Когда срабатывает прерывание IDLE, я записываю адрес начала текущей посылки, которая находится в основном буфере. Таким образом возможно хранить несколько посылок различной длины в одном буфере, а в массиве хранить указатели на их адреса.
Недостаток такого метода является, что при чтении каждого байта посылки нужно проверять не вышел ли за границы основного буфера, т.к. он кольцевой. Достоинство, что можно сохранить несколько посылок, если вдруг их не успеваешь обработать и не нужно включать, выключать DMA RX, DMA получается всегда включён.
Такое работает на F1 и F4, на др. сериях не пробовал.
Почему решился на такой велосипед, т.к. ловился на не приятном моменте, что дёргая выкл. DMA после принятия посылки обработал, потом вкл. DMA, DMA не всегда включалось, бывало такое после суток работы например. Но на тот момент, я может не всё изучил и делал, что то не так. Но в таком способе можно работать и на запрос ответ и в асинхронном приёме/передаче данных. Модбас протокол не использовал.
|