evgeniy1294 (28.10.2018 01:14 - 01:20, просмотров: 163) ответил AlexBi_ на Что бы понять в каком байте ошибка придется проводить манипуляции с ДМА, нарушающие всю его работу. А если нужна возможность работы когда в каждом байте ошибка, то польза от ДМА может совсем потеряться.
У меня все на DMA, мастеров, которые строго требуют выдерживания паузы для ответа избегаю. Это архаизм уже, в новой аппаратуре типа delta, mitsubishi и др. такого не встречал. Удобно же:
port->write(pdata, size); // отправили, zero copy
//...........
uint32_t size = port->read(pdata); // Приняли, копирование из буфера.
// А можно так, zero copy
port->setbuf(pbuf);
//...........
bool check = port->rxCheck(); //
Все делается на прерываниях типа IDLE и TC. Сам по себе порт построен как конечный автомат, поэтому можно легко и задержку впихнуть:
hal::timer delay; //структура timer просто удобная оболочка взаимодействия с systick
// В конечном автомате
delay.set(3);
state = state::delay;
//........
case state::delay:
if (delay.check())
{
state = state::next;
delay.stop(); // не обязательно
}
break;
Контролировать целостность каждого байта не вижу смысла, есть CRC.