ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
16 августа
1536085 Топик полностью
Nikolay_Po (Вчера, 13:34, просмотров: 27) ответил petrd на Нет, конечно, ничего не выключаю. Похоже на воду дую .... размышляю, пришло уведомление о завершении транзакции ДМА, а UART еще передает, задача успела вытащить следующее сообщение, засунула адрес и длину в ДМА, стартует, а от UART запроса к ДМА еще не поступало, ну и, значит, стоп, ДМА ждет когда придет запрос от него.
Поясню: DMA можно запускать при неготовности периферии. Всего делов-то - DMA будет стоять на первой транзакции, не выполняя её, сохраняя исходное значение счётчика транзакций. Как только ранее положенный в буфер самого UARTа символ протолкнётся в освободившийся сдвиговый регистр, сразу же, по флагу transmit empty, DMA положит первый символ следующей транзакции. 

Так что, если в буфере уже несколько сообщений - не проблема. DMA начинает передачу в UART следующего трансфера с началом передачи последнего символа предыдущего трансфера. То есть, последний символ трансфера ещё не успел начать передаваться, только попал в сдвиговый буфер и только начался стартовый бит, а DMA уже положил в буфер UART первый символ следующего трансфера.