Я знайшов цю відповідь у STM32 Розуміння налаштувань GPIO
- GPIO_PuPd (підтяжка / пониження)
У цифрових схемах важливо, щоб сигнальні лінії ніколи не дозволяли «плавати». Тобто вони завжди повинні бути у високому або низькому стані. Під час плавання стан не визначений і викликає кілька різних типів проблем.
Спосіб виправити це - додати резистор із сигнальної лінії до Vcc чи Gnd. Таким чином, якщо лінія не ведеться активно або високо, чи низько, резистор призведе до відтоку потенціалу до відомого рівня.
АРМ (та інші мікроконтролери) мають вбудовану схему для цього. Таким чином, вам не потрібно додавати іншу частину до схеми. Якщо ви вибрали, наприклад, "GPIO_PuPd_UP", це рівнозначно додати резистор між сигнальною лінією та Vcc.
Push-Pull: це вихідний тип, який більшість людей вважають "стандартним". Коли вихід знижується, він активно «тягнеться» на землю. І навпаки, коли вихід встановлений на високий, він активно «висувається» у бік Vcc. Спрощено, це виглядає приблизно так:
З іншого боку, вихід з відкритим стоком активний лише в одному напрямку. Він може тягнути штифт до землі, але він не може загнати його високо. Уявіть попереднє зображення, але без верхнього MOSFET. Коли він не тягнеться до землі, (нижня сторона) MOSFET просто не проводить, що призводить до виходу плаваючого.
Для цього виду виходу в ланцюг повинен бути доданий резистор, що підтягується, що призведе до того, що лінія буде виходити високо, коли вона не буде низькою. Це можна зробити за допомогою зовнішньої частини або встановивши значення GPIO_PuPd на GPIO_PuPd_UP.
Назва походить від того, що стік MOSFET внутрішньо ні до чого не пов'язаний. Цей тип виводу також називається "відкритим колектором" при використанні BJT замість MOSFET.
В основному, це регулює швидкість повороту (час підйому і час падіння) вихідного сигналу. Чим швидше швидкість холостого ходу, тим більше шуму випромінюється від ланцюга. Це хороша практика тримати повільний показник повільно, а збільшувати його лише у випадку, якщо у вас є конкретні причини.