Изменение контактов аппаратного управления потоком на STM32

Я читал о подтверждении связи и аппаратном управлении потоком для последовательной связи, и у меня есть вопрос, на который я не могу найти ответа.

Если вы настроили аппаратное управление потоком для последовательного порта на cubeMX, он установит необходимые контакты. Я знаю, что вы также можете использовать альтернативные пины, и это можно сделать через cubeMX.

У меня вопрос: не могли бы вы настроить аппаратное управление потоком данных вручную, используя разные выводы, или вам нужно строго использовать реализованные выводы?

Я использую STM32F207ZETx, и я использую USB, а также последовательный порт, однако при использовании периферийного USB-устройства он блокирует аппаратные выводы управления потоком для USART1, которые мне нужны, и мне нужно аппаратное управление потоком для моего проекта! Альтернативные контакты для аппаратного управления потоком также уже используются, так что я немного в замешательстве.


person Alex_embedded    schedule 06.09.2018    source источник


Ответы (1)


У меня вопрос: не могли бы вы настроить аппаратное управление потоком данных вручную, используя разные выводы, или вам нужно строго использовать реализованные выводы?

Вы можете самостоятельно управлять аппаратным потоком с помощью программного обеспечения, и на самом деле это довольно просто.

USART1_RTS - выходной контакт. Он установлен / высокий, когда USART1 готов к приему данных. USART1_CTS - это входной контакт. Другой конец устанавливает высокий уровень, когда он готов к приему данных, и низкий, когда это не так.

Допустим, вы отправляете и получаете по одному символу за раз и используете два контакта GPIO для USART1_RTS и USART1_CTS вместо поддержки оборудования.

Обычно вы держите USART1_RTS на высоком уровне. При получении данных, если у вас заканчивается буфер приема, вы устанавливаете низкий уровень USART1_RTS. Когда вы освобождаете место в приемном буфере, вы устанавливаете высокий уровень USART1_RTS. (Если у вас есть схема буферизации, которая не может исчерпать приемный буфер, вы можете привязать линию RTS к высокому уровню.)

Перед отправкой каждого символа вы проверяете, высокий ли уровень USART1_CTS. Если он низкий, вы не отправляете данные, а ждете, пока USART1_CTS станет высоким, прежде чем отправлять.

Вот и все.

person Nominal Animal    schedule 06.09.2018
comment
Это очень хорошо проясняет ситуацию - спасибо, мистер Пингвин (нормальное животное)! - person Alex_embedded; 06.09.2018
comment
Обратите внимание, что вам нужно будет либо реализовать прерывание смены вывода на выводе GPIO, используемом как CTS, либо постоянно опрашивать линию подтверждения. - person tofro; 06.09.2018
comment
@tofro Если не используется DMA, достаточно просто и достаточно эффективно опросить CTS перед загрузкой регистра данных TX. - person Clifford; 06.09.2018
comment
@Clifford, как только tx приостановлен CTS, насколько эффективно нужно опрашивать строку CTS, например, частота символов для перезапуска передачи? Наличие прерывания при повышении уровня CTS звучит полезно, а также позволяет немедленно перезапустить передачу без задержки любого выбранного времени опроса. - person barny; 06.09.2018
comment
Я не очень знаком с STM32, но, судя по таблице данных, похоже, что лучший подход для USART1 - это побайтовые функции отправки и получения на основе прерываний. Еще одно прерывание для CTS, переходящего в высокий уровень, является простым добавлением, поскольку оно может отправить следующий байт и разрешить прерывание для следующего исходящего байта. Поскольку CTS должен быть выбран перед отправкой следующего байта, я не уверен, что вы можете легко использовать DMA для отправки. Для приема подойдет DMA, особенно если вы также используете прерывание для получения последнего байта (отправленного непосредственно перед тем, как RTS / RTR опустился на низкий уровень). - person Nominal Animal; 08.09.2018