STM32 Понимание настроек GPIO

41

В стандартной периферийной библиотеке STM32 нам необходимо настроить GPIO.

Но есть 3 функции, которые я не знаю, как их настроить;

  • GPIO_InitStructure.GPIO_Speed
  • GPIO_InitStructure.GPIO_OType
  • GPIO_InitStructure.GPIO_PuPd

В GPIO_Speed есть 4 настройки для выбора

GPIO_Speed_2MHz  /*!< Low speed */
GPIO_Speed_25MHz /*!< Medium speed */
GPIO_Speed_50MHz /*!< Fast speed */
GPIO_Speed_100MHz

Как узнать, какую скорость выбрать? Есть ли какие-либо преимущества или недостатки при использовании высокой скорости или низкой скорости? (например: энергопотребление?)

В GPIO_OType есть 2 настройки для выбора

GPIO_OType_PP // Push pull
GPIO_OType_OD // Open drain

Как узнать, из чего выбрать? а что такое открытый сток и двухтактный?

В GPIO_PuPd есть 3 настройки для выбора

GPIO_PuPd_NOPULL // No pull
GPIO_PuPd_UP     // Pull up
GPIO_PuPd_DOWN   // Pull down

Я думаю, что эти настройки связаны с начальной настройкой двухтактного.

Тим
источник
Связано: как явно принудительно включить режим «открытого стока» на микроконтроллерах, которые изначально не поддерживают его, таких как AVR / Arduino, PIC и т. Д .: electronics.stackexchange.com/a/354993/26234
Габриэль Стейплс

Ответы:

45
  • GPIO_PuPd (Pull-up / Pull-down)

    В цифровых цепях важно, чтобы сигнальным линиям никогда не разрешалось «плавать». То есть они должны всегда находиться в высоком или низком состоянии. При плавающем состоянии состояние не определено и вызывает несколько различных типов проблем.

    Способ исправить это - добавить резистор из сигнальной линии к Vcc или Gnd. Таким образом, если линия активно не приводится в действие на высоком или низком уровне, резистор вызовет дрейф потенциала до известного уровня.

    ARM (и другие микроконтроллеры) имеют встроенную схему для этого. Таким образом, вам не нужно добавлять другую часть в вашу схему. Например, если вы выберете «GPIO_PuPd_UP», это равносильно добавлению резистора между сигнальной линией и Vcc.

  • GPIO_OType (Тип вывода):

    Push-Pull: это тип вывода, который большинство людей считает «стандартным». Когда выходной сигнал становится низким, он активно «тянется» на землю. И наоборот, когда выходной сигнал установлен на высокий уровень, он активно «подталкивается» к Vcc. Упрощенно это выглядит так:

    тяни-Толкай

    Выход Open-Drain, с другой стороны, активен только в одном направлении. Он может тянуть штифт к земле, но он не может вести его высоко. Представьте себе предыдущее изображение, но без верхнего MOSFET. Когда он не тянет на землю, полевой МОП-транзистор просто непроводящий, что приводит к плавающему выводу:

    открытый сток

    Для этого типа выхода в цепь должен быть добавлен подтягивающий резистор, который приведет к тому, что линия станет высокой, когда она не будет переведена в низкий уровень. Вы можете сделать это с внешней деталью или установив значение GPIO_PuPd равным GPIO_PuPd_UP.

    Название происходит от того факта, что утечка MOSFET внутренне не связана ни с чем. Этот тип вывода также называется «открытый коллектор» при использовании BJT вместо MOSFET.

  • GPIO_Speed

    По сути, это контролирует скорость нарастания (время нарастания и спада) выходного сигнала. Чем выше скорость нарастания, тем больше шума излучается от цепи. Хорошей практикой является замедление скорости нарастания и увеличение ее только при наличии конкретной причины.

bitsmack
источник
Благодарность! за отличный ответ;), не могли бы вы объяснить немного больше о различных проблемах, когда он находится в плавающем состоянии?
Тим
3
Идея состоит в том, что проживание в течение любого промежутка времени при промежуточном входном напряжении может частично включать как верхний, так и нижний полевые транзисторы во входном блоке и частично замыкать источник питания через них, что приводит к чрезмерному потреблению энергии или (в особенно серьезных случаях). ) потенциальный ущерб.
Крис Страттон
@Tim Да, что только что сказал Крис Страттон :)
bitmack
3
@Tim Также, когда линии плавают, очень легко нарушить уровни напряжения. Простое помахивание рукой вокруг схемы может изменить состояние входа из-за емкостных взаимодействий ...
bitmack
1
@Tim Это действительно зависит от приложения. Если вы читаете переключатель (или кнопку), то это не имеет значения. Если вы взаимодействуете с другими компонентами, это зависит от интерфейса. Например, для связи SPI линия CS является активной-низкой. В этом случае вам понадобится подтягивающий резистор, чтобы CS никогда не падал на низкий уровень случайно. Вы можете подумать, что в этом нет необходимости, если вы всегда будете активно управлять линией с помощью микроконтроллера. Но как быть до того, как микроконтроллер инициализируется? Или если он сбрасывается? Подтягивающий резистор устраняет любую двусмысленность ...
bitmack
5

Скорость GPIO - это максимальная частота, которую может воспроизводить GPIO. Более низкие настройки могут экономить энергию.

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

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

Скотт Сейдман
источник