Значение контакта вывода GPIO установлено как высокое сопротивление

Я использую плату обнаружения STM32F4, и я намерен установить один из ее контактов GPIO на высокий импеданс, что я сделал, как показано ниже:

GPIO_InitStruct.Pin = GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;

Насколько я понимаю, для настройки контакта с высоким импедансом необходимо ввести его режим. Я прав?

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

Штырек к чему-то подключен?
У меня есть трансивер, подключенный к моей плате обнаружения. Но даже если я удалю это и прочитаю статус вывода, он все равно вернет 1. Однако другой вывод, сконфигурированный с той же конфигурацией, вернет 0, что меня удивляет.
Когда я пытаюсь прошить ту же программу на другой плате, она возвращает 0. Означает ли это, что у моей платы проблема? @РоджерРоуленд
Я не очень хорошо знаком с семейством STM32F4, но цифровой входной контакт, который остается плавающим (неподключенным), обычно действует как крошечная антенна. Он может качаться вверх или вниз из-за локализованного неподалёку статического поля. Даже если вы поднесете руку рядом, значение может измениться. Важно то, что если вы заземлите контакт, он будет читать 0, а если вы подтянете его к VCC, он будет читать 1.
Если бы я настроил вывод на высокий импеданс, правильно ли я использовал конфигурацию @DanLaks?
Настраивать неподключенный контакт как высокоимпедансный — плохая идея .

Ответы (1)

Вы правильно настроили свой пин. Вывод находится в режиме высокого импеданса и будет иметь только ток утечки в качестве входного тока (порядка микроампер).

Чтение значения вывода даст вам логическое значение напряжения, приложенного к выводу. Уровни напряжения, соответствующие 0 или 1, доступны в техническом описании устройства.


Например , для STM32F401 напряжение до (максимум) 0,35*VDD-0,04 В будет считаться низким или равным 0.

Напряжение не менее 0,4*VDD считается высоким или 1.

Таким образом, если вы подаете на свое устройство 3,3 В, все на контакте до 1,115 В будет считаться 0, а все, что выше 1,32 В, будет считаться 1.

Однако для предотвращения быстрого переключения вывода между двумя состояниями существует гистерезис 0,45 * VDD + 0,3 В. Таким образом, для переключения между двумя состояниями требуется большее изменение напряжения, чем просто разница между 1,115 В и 1,32 В. .


Теперь, если у вас есть неподключенный контакт и вы читаете значение входного регистра, значение в основном не определено. Это может быть либо 0, либо 1, в зависимости от множества факторов, напряжения на соседних выводах, электромагнитных помех и других факторов.

Штырь и подключенная дорожка в основном действуют как антенна. Таким образом, он улавливает все виды сигналов, и поскольку требуется лишь небольшой заряд, чтобы перевести напряжение с уровня 0 на уровень 1, он легко переключается между ними. Это зависит от емкости дорожки и вывода, без дополнительных конденсаторов она находится в диапазоне нескольких пикофарад, которые можно легко заряжать и на которые можно влиять.

Это делает ваш контроллер восприимчивым к внешним помехам. Это может привести к неустойчивому поведению в случае сильных электромагнитных помех (держите мобильный телефон рядом с микроконтроллером), некоторые устройства реагируют гораздо более чувствительно, поэтому даже движение руки над ним может помешать ему.

Из-за этого считается лучшей практикой иметь какую-либо форму активного привода на каждом входном контакте. Либо внешняя цепь обеспечивает постоянное наличие определенного уровня, либо используется подтягивающий или подтягивающий резистор. Большинство микроконтроллеров имеют встроенные резисторы, поэтому внешние компоненты не нужны.

Чтобы включить подтягивающий или подтягивающий резистор на выводе, вы можете использовать файл GPIO_InitStruct.Pull. Установите его на GPIO_PULLUPили GPIO_PULLDOWNсоответственно. Какой из них является правильным, зависит от вашего приложения, обычно, если вы ожидаете высокого сигнала, вы должны включить раскрывающееся меню, чтобы убедиться, что вы не получите случайный высокий сигнал. Это также обеспечит надежное чтение, если контакт не подключен.

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

Примечание. Если вы хотите сделать съемную конструкцию, вам следует подумать о дополнительной защите контакта от электростатического разряда.

Может быть, добавить немного больше после «Большинство микроконтроллеров имеют встроенные резисторы, поэтому внешние компоненты не нужны». быть явным? Например, «Следовательно, вы можете настроить этот входной контакт так, чтобы он вытягивался вверх или вниз, как вам удобно, запрограммировав эту часть структуры. GPIO_InitStructЭто устранило бы потенциальную проблему и обеспечило бы считывание согласованного значения».
@gbulmer готово, не с вашей формулировкой, но, надеюсь, тоже хорошо.
Это хорошо! +1 Надеюсь, проблема ОП решена, или они могут объяснить любые другие ограничения/проблемы.