Я читал о подтверждении связи и аппаратном управлении потоком данных для последовательной связи, и у меня есть вопрос, на который я не могу найти ответа.
Если вы настроили аппаратное управление потоком для последовательного порта на cubeMX, он установит необходимые контакты. Я знаю, что вы также можете использовать альтернативные пины, и это можно сделать через cubeMX.
У меня вопрос: не могли бы вы настроить аппаратное управление потоком данных вручную, используя разные выводы, или вам нужно строго использовать реализованные выводы?
Я использую STM32F207ZETx, и я использую USB, а также последовательный порт, однако при использовании периферийного USB-устройства он блокирует аппаратные выводы управления потоком для USART1, которые мне нужны, и мне нужно аппаратное управление потоком для моего проекта! Альтернативные контакты для аппаратного управления потоком также уже используются, так что я немного в замешательстве.
My question is, could you set up hardware flow control manually by using different pins or do you strictly have to use the implemented pins?
Вы можете самостоятельно управлять аппаратным потоком с помощью программного обеспечения, и на самом деле это довольно просто.
USART1_RTS - выходной контакт. Он установлен / высокий, когда USART1 готов к приему данных. USART1_CTS - это входной контакт. Другой конец устанавливает высокий уровень, когда он готов к приему данных, и низкий, когда это не так.
Допустим, вы отправляете и получаете по одному символу за раз и используете два контакта GPIO для USART1_RTS и USART1_CTS вместо поддержки оборудования.
Обычно вы держите USART1_RTS на высоком уровне. При получении данных, если у вас заканчивается буфер приема, вы устанавливаете низкий уровень USART1_RTS. Когда вы освобождаете место в приемном буфере, вы устанавливаете высокий уровень USART1_RTS. (Если у вас есть схема буферизации, которая не может исчерпать приемный буфер, вы можете привязать линию RTS к высокому уровню.)
Перед отправкой каждого символа вы проверяете, высокий ли уровень USART1_CTS. Если он низкий, вы не отправляете данные, а ждете, пока USART1_CTS станет высоким, прежде чем отправлять.
Вот и все.
Обратите внимание, что вам нужно будет либо реализовать прерывание смены вывода на выводе GPIO, используемом как CTS, либо постоянно опрашивать линию подтверждения.
@tofro Если не использовать DMA, достаточно просто и достаточно эффективно опросить CTS перед загрузкой регистра данных TX.
@Clifford, как только tx приостанавливается CTS, насколько эффективно нужно опрашивать строку CTS, например, частота символов для перезапуска передачи? Наличие прерывания при повышении уровня CTS звучит полезно, а также позволяет немедленно перезапустить передачу без задержки любого выбранного времени опроса.
Я не очень знаком с STM32, но, судя по таблице данных, похоже, что лучший подход для USART1 - это побайтовые функции отправки и получения на основе прерываний. Еще одно прерывание для CTS, переходящего в высокий уровень, является простым добавлением, поскольку оно может отправить следующий байт и разрешить прерывание для следующего исходящего байта. Поскольку CTS должен быть выбран перед отправкой следующего байта, я не уверен, что вы можете легко использовать DMA для отправки. Для приема подойдет DMA, особенно если вы также используете прерывание для приема «последнего» байта (отправленного непосредственно перед тем, как RTS / RTR опустился на низкий уровень).
Это очень хорошо проясняет ситуацию - спасибо, мистер Пингвин (нормальное животное)!