ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
5 июля
1594422 Топик полностью
Связанные сообщения
Ch32VUart
удалось портануть lua 5.5.x из транка в ch32v307. Родя Иерусалимский был бы гением если стал бы писать свою нетленку НЕ-на-С.......2026-06-11
KGP свежак riscv32 . небеса упали на землю, собрал для масдая... не идет гора к Магомету. акцент на оптимизацию под популярные м...2026-04-22
подпилил openocd для большей поддержки ядра процессора QingKeV4F что стоит в сh32v3xx, показывает только те регистры CSR которые...2025-12-25
Китайцы пояснили насчёт остановки таймера в отладке. Есть отладочный регистр dcsr и в нём бит 9 отвечает за остановку СисТика.2025-08-20
а есть ли в природе какие расширители UART-портов на SPI, или хотя бы параллельную шину? (8251 не предлагать :))) в принципе инт...2025-01-17
тут говорят некоторые что не влетит?2023-04-12
SC16IS752, преобразователь SPI в два UART. Кто использовал? Как опыт?2022-09-29
CH9121 от WCH. Мостик Ethernet-UART на 2 UART. Может работать в режимах TCP-сервер, TCP-клиент, UDP-сервер, UDP-клиент. Поддержи...2020-12-04
Nikolay_Po (Сегодня, 01:47, просмотров: 229)
Положу ещё и сюда, на память. WCH CH32V317. Ещё один нюанс с UARTом. Не исключаю, что такое будет и у STM32F1xx: Если вручную положить в DATAR символ на передачу, и быстро (по крайней мере у меня получается до завершения передачи первого бита) включить DMA для продолжения передачи в автоматическом режиме, то не всегда, чуть более, чем в половине случаев (но не всегда!) DMA перебивает ранее записанный в DATAR символ. 

Мои выводы и предположения по наблюдениям с осциллографом:


1. Передача, начало стартового бита, начинается не в момент записи DATAR (без разницы чем, "вручную" или DMA), а в дискретные моменты времени, связанные с внутрениим тактовым генератором модуля. Если сравнивать передачу разных модулей, видно, что у них такты бит передачи совпадают по времени, но вот сама передача, при близкой по времени записи в DATAR, может начаться или одновременно, или со сдвигом на один битовый интервал. Другими словами, моменты начала передачи - дискретны и привязаны к вунтеннему битовому интервалу модуля UART.

2. Похоже что до наступления очередного битового интервала UART, символ, записанный в DATAR, лежит в этом регистре и не переносится в сдвиговый регистр, чтобы освободить DATAR для следующего символа.

3. При передаче "только вручную" или только с DMA, проблем нет. Запрос на следующий символ не поступает до того, как предыдущий не будет перенесён в свдвиговый регистр передачи. Таким образом, коллизии не происходит.

4. Если же, при установленном в настройках UART бите "DMA transmission enable", записать в DATAR символ "вручную", то, ранее взведённый запрос для DMA не снимается - он не был "потрачен" для записи в DATAR и на момент записи, сдвиговый ргистр пуст, место для двух символов есть и нет резона снимать запрос DMA для следующего символа. ОК.

5. Из-за п.2, записанный вручную в DATAR символ не переносится в сдвиговый регистр. А из-за п.4, сохраняется активный запрос на DMA. И в такой ситации, включение канала DMA Tx, сразу зашлёт в DATAR следующий символ уже через DMA. А так как первый символ, если не попал на нужный такт битового интервала, может ещё лежать в DATAR, он оказывается затёрт и потерян!

На практике, получил потери первых символов (которые с адресом и адресным битом, отправленные "вручную"). Кадр передавался, в от 1/3 до 3/4 случаев, без первого символа и на один символ короче, чем загружено данных.