KnightIgor 2 22 февраля, 2011 Опубликовано 22 февраля, 2011 (изменено) · Жалоба Добрый день мужики, а также немногочисленные дамы! Имеем STM32F103RB. Передаю периодически блок данных из памяти через USART (250kbps, 8 бит, 2 стоповых) посредством DMA в нормальном (не циклическом) режиме. Чтобы определить завершение передачи предыдущего пакета и начать следующий организовал прерывание по флагу DMA "Transfer Complete". Что я далее в прерывании делаю, пока не суть важно. Интересно то, что прерывание возникает не в момент, когда DMA засунул в USART последний байт, а раньше - когда предпоследний! Это я определил осциллографом, дергая в указаном прерывании отладочными ногами и наблюдая за передачей от USART: фронт возникает незадолго до того, как из USART начинает уходить предпоследний байт. Конечно, раздел "Single byte communication", стр. 766 мануала RM0008, я читал. Там очевидно объяснено, что если USART было пустой, первые две следующие друг за другом быстрые записи в регистр данных USART возможны, т.к. флаг TXE возникает тут же и после первой записи. Однако в моем случае DMA передает довольно шибко пол-кило байтов, и к моменту прерывания USART еще возится в поте лица с предыдущими. Это баг? Или я что проглядел? Спасибо. Изменено 22 февраля, 2011 пользователем KnightIgor Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 22 февраля, 2011 Опубликовано 22 февраля, 2011 · Жалоба Я думаю, как только DMA записал последний байт в TDR USART, он и докладывает, что все сделал. При этом данные еще будут выдвигаться из TSR, сначала предыдущий байт, бит за битом, затем последний перепишется в TSR и тоже будет выдвигаться. см. Figure 278 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KnightIgor 2 22 февраля, 2011 Опубликовано 22 февраля, 2011 · Жалоба Я думаю, как только DMA записал последний байт в TDR USART, он и докладывает, что все сделал. При этом данные еще будут выдвигаться из TSR, сначала предыдущий байт, бит за битом, затем последний перепишется в TSR и тоже будет выдвигаться. см. Figure 278 Спасибо! На схеме №295, стр. 787, RM0008 Doc ID 13902 Rev 12 так и нарисовано! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 22 февраля, 2011 Опубликовано 22 февраля, 2011 · Жалоба Спасибо! На схеме №295, стр. 787, RM0008 Doc ID 13902 Rev 12 так и нарисовано! у меня Rev 11, не совпадают страницы и картинки, чем искать по компу, пойду с сайта скачаю :) Посмотрел. Да, правильно. Там еще сказано, что нужно флаг TC USART мониторить программно, чтобы удостовериться, что передача завершена. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KnightIgor 2 22 февраля, 2011 Опубликовано 22 февраля, 2011 (изменено) · Жалоба Там еще сказано, что нужно флаг TC USART мониторить программно, чтобы удостовериться, что передача завершена. Верно, что и делаю перед тем как снова толкнуть передачу. Чтобы не крутиться в прерывании от DMA TC в ожидании USART TC в нем лишь разрешается прерывание по этому флагу, где, как щелкнет, уже и выполняются дальшейшие действия. Изменено 22 февраля, 2011 пользователем KnightIgor Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться