Push-pull VS open-drain.

На картинке видно, что open-drain может быть с внутренней подтяжкой и без неё.
Если использовать подтяжку становится вообще непонятно чем он отличается от push-pull.
А теперь давайте подумаем, что будет если мы соединим два PP выхода и установим на них разные логические уровни?

Из-за конфликта уровней один из выходов просто выгорит, так как ток, возникший из-за разности потенциалов, ни чем не ограничен.
А теперь так же соединим два вывода OD.

Видно, что потенциал линии притянется к земле и ничего не сгорит. Следовательно выводы OD можно соединять между собой не боясь чего-нибудь сжечь. Но если через один вывод можно пропустить 20 мА, то объединив 5 выводов, через них можно пропустить 100мА.

Это и есть тот случай когда PP не может заменить OD.
А теперь представим другую ситуацию, есть шина данных, например, I2C у которой логическая единица не соответствует напряжению нашего МК и равна либо 1.8, либо 5 вольт. В обоих случаях, используя PP выход, подключить МК к такой шине не получится потому, что PP не может выдать ни 1.8, ни 5 вольт. Но это очень просто сделать, используя OD и внешний подтягивающий резистор.
Перевод «open drain output» на русский
The alternative to a push-pull output is a single switch that connects the load either to ground (called an open collector or open drain output) or to the power supply (called an open-emitter or open-source output).
Альтернативой двухтактному выходу является одиночный электронный ключ, который присоединяет нагрузку или к земле (так называемый «выход с открытым коллектором (стоком)») или к источнику питания (так называемый «выход с открытым эмиттером (истоком)»).
Предложить пример
Другие результаты
The open-drain output driver is by no means the standard configuration among digital ICs, and with good reason: it comes with some significant disadvantages.
Выходной каскад с открытым стоком ни в коем случае не является стандартной схемой среди цифровых микросхем, и для этого есть причина: он обладает некоторыми существенными недостатками.
Whenever one of the six monitored voltages falls below its threshold, the open-drain reset output asserts and remains asserted for at least 140 ms after all six voltages exceed their respective thresholds.
Как только одно из шести отслеживаемых напряжений падает ниже порогового уровня, выход RESET\ с открытым истоком устанавливается на низком уровне и остается установленным как минимум 140 мс после того, как все 6 напряжений превысят свои пороговые уровни.
Как и зачем читать даташиты, если микроконтроллеры – ваше хобби

Микроэлектроника – модное увлечение последних лет благодаря волшебному Arduino. Но вот беда: при должном интересе перерасти DigitalWrite() получается быстро, а что делать дальше – не совсем ясно. Разработчики Arduino приложили немало усилий для снижения порога вхождения в свою экосистему, но за ее пределами по-прежнему колышется темный лес суровой схемотехники, малодоступный любителю.
Например, даташиты. Вроде бы в них есть все, бери и пользуйся. Но только их авторы явно не ставят перед собой задачу популяризации микроконтроллеров; иногда кажется, что они специально злоупотребляют непонятными терминами и аббревиатурами при описании простых вещей, чтобы максимально запутать непосвященного. Но не все так плохо, при желании ларчик открывается.
В этой статье я поделюсь опытом общения гуманитария с даташитами в хобби-целях. Текст предназначен для выросших из штанишек Arduino любителей, он предполагает некоторое представление о принципах работы микроконтроллеров.
Начну с традиционного
Мигаем светодиодом на Ардуино
void setup() < DDRB |= (1<<5); >void loop()
«Что это? – Спросит искушенный читатель. – Зачем ты что-то пишешь во входной регистр PINB? Он же только для чтения!» Действительно, документация Arduino, как и большинство учебных статей в интернете, утверждает, что этот регистр read-only. Я и сам так думал, пока не перечитал даташит к Atmega328p, готовя это статью. А там:
Это относительно новый функционал, его не было на Atmega8, о нем не все знают или не упоминают из соображений обратной совместимости. Но вполне годный для демонстрации мысли, что даташиты стоит читать, чтобы использовать все возможности чипа, включая малоизвестные. И это не единственная причина.
Зачем еще читать даташиты
Обычно ардуинщики, наигравшись со светодиодами и AnalogWrite’ами, начинают подключать к плате всякие модули и чипы, для которых есть уже написанные библиотеки. Рано или поздно появляется библиотека, работающая не так, как надо. Тогда любитель начинает ее ковырять, чтобы починить, а там.
А там происходит что-то категорически непонятное, поэтому приходится отправляться в гугл, читать многочисленные тьюториалы, дергать по частям чей-то подходящий код и наконец добиваться своего. Это дает мощное ощущение свершения, но на самом деле процесс напоминает изобретение велосипеда путем реверс-инжиниринга мотоцикла. Причем понимания, как работает этот велосипед, не прибавляется. Знаю, поскольку сам этим занимался довольно долго.
Если бы я вместо этого увлекательного занятия потратил пару дней на изучение документации к Atmega328, я бы сэкономил огромное количество времени. В конце концов, это довольно простой микроконтроллер.
Таким образом, читать даташиты надо хотя бы для того, чтобы представлять себе, как вообще устроен микроконтроллер и что он умеет делать. И еще:
- чтобы проверять и оптимизировать чужие библиотеки. Их часто пишут такие же любители, изобретающие велосипед; или же, напротив, авторы намеренно делают в них избыточную защиту от дурака. Пусть будет в три раза больше и медленнее, зато точно сработает;
- чтобы иметь возможность использовать в проекте чипы, к которым никто не написал библиотеку;
- чтобы облегчить себе задачу по миграции с одной линейки МК на другую;
- чтобы наконец оптимизировать свой старый код, который никак не влезал в Ардуину;
- чтобы научиться управлять любым чипом напрямую через его регистры, не заморачиваясь изучением устройства его библиотек, если таковые вообще есть.
Зачем писать в регистры напрямую, когда есть HAL и LL?
Словарик
HAL, Hardware Abstraction Layer – библиотека для управления микроконтроллером с высоким уровнем абстракции. Если надо использовать интерфейс SPI1, просто настраиваем и включаем SPI1, не задумываясь, какие регистры за что отвечают.
LL, Low Level API – библиотека, содержащая макросы или структуры с адресами регистров, позволяющая обращаться к ним по имени. DDRx, PORTx, PINx на Атмеге – это LL.
Споры на тему «HAL, LL или регистры» регулярно случаются в комментариях на Хабре. Не претендуя на доступ к астральному знанию, просто поделюсь своим любительским опытом и соображениями.
Более-менее разобравшись с Атмегой и начитавшись статей про прекрасности STM32, я накупил полдюжины разных плат – и Discovery, и «Синие Таблетки», и даже просто чипы под свои самоделки. Все они два года пылились в коробке. Иногда я говорил себе: «все, с этих выходных осваиваю STM», запускал CubeMX, генерил сетап для SPI, смотрел на получившуюся стену текста, обильно сдобренную копирайтами STM, и решал, что это как-то уж слишком.

Разобраться, что тут понаписал CubeMX, конечно, можно. Но одновременно понятно, что запомнить все формулировки, чтобы потом писать их руками, нереально. А уж дебажить это, если я случайно забуду в Кубе поставить какую-нибудь галочку, – совсем привет.
Прошло два года, я по-прежнему облизывался в ST MCU Finder на всякие вкусные, но недоступные моему пониманию чипы, и случайно наткнулся на замечательную статью, пусть и про STM8. И внезапно понял, что все это время стучался в открытую дверь: регистры у STM устроены так же, как у любого другого МК, и для работы с ними Куб необязателен. А что, так можно было.
HAL и конкретно STM32CubeMX – инструмент для профессиональных инженеров, плотно работающих с чипами STM32. Главная фишка – высокий уровень абстракции, возможность быстро мигрировать с одного МК на другой и даже с одного ядра на другое, оставаясь в рамках линейки STM32. Любители с такими задачами сталкиваются редко – наш выбор МК, как правило, ограничен ассортиментом AliExpress, и мы чаще мигрируем между кардинально разными чипами – переезжаем с Атмеги на STM, с STM на ESP, ну или что там нам новенького подкинут китайские друзья. HAL здесь не поможет, а времени его изучение съест немало.
Остается LL – но от него до регистров полшага. Лично я нахожу написание своих макросов с адресами регистров полезным: я внимательнее изучаю даташит, думаю, что мне потребуется в будущем, а что точно нет, лучше структурирую свои программы, ну и вообще преодоление способствует запоминанию.
Кроме того, есть нюанс с популярным STM32F103 – для него существуют две несовместимые версии LL, одна официальная от STM, вторая – от Leaf Labs, используемая в проекте STM32duino. Если писать open-source библиотеку (а у меня была именно такая задача), надо либо делать две версии, либо обращаться к регистрам напрямую.
Наконец, отказ от LL, на мой взгляд, упрощает миграцию, особенно если закладываться на нее с самого начала работы над проектом. Утрированный пример: напишем ардуиновский blink в Atmel Studio без LL:
#include #define _REG(addr) (*(volatile uint8_t*)(addr)) #define DDR_B 0x24 #define OUT_B 0x25 int main(void) < volatile uint32_t k; _REG(DDR_B) |= (1<<5); while(1) < _REG(OUT_B) |= (1<<5); for (k=0; k<50000; k++); _REG(OUT_B) &= ~(1<<5); for (k=0; k<50000; k++); >>
Чтобы этот код замигал светодиодом на китайской платке с STM8 (из ST Visual Desktop), в нем достаточно поменять два адреса:
#define DDR_B 0x5007 #define OUT_B 0x5005
Да, я использую особенность подключения светодиода на конкретной плате, мигать будет очень медленно, но будет же!
Какие бывают даташиты
В статьях и на форумах, и русско-, и англоязычных, под «даташитами» понимают любую техническую документацию к чипам, так же поступаю и я в этом тексте. Формально они – лишь один из видов такой документации:
Datasheet – ТТХ, тактико- технические характеристики. Обязательно имеется у любого электронного компонента. Справочная информация, полезно держать под рукой, но вдумчиво читать в нем особо нечего. Впрочем, чипы попроще часто ограничиваются даташитом, чтобы не плодить лишних документов; в этом случае Reference Manual включается сюда же.
Reference Manual – собственно инструкция, здоровая книжка на 1000+ страниц. Подробно расписывается работа всего, что понапихано в чип. Главный документ для освоения микроконтроллера. В отличие от datasheet, инструкции пишут для широкой линейки МК, в них содержится много информации о периферии, отсутствующей в вашей конкретной модели.
Programming Manual или Instruction Set Manual – инструкция по уникальным командам микроконтроллера. Предназначена для тех, кто программирует на Ассемблере. Авторы компиляторов активно ее используют для оптимизации кода, поэтому в общем случае нам она не потребуется. Но заглядывать сюда полезно для общего понимания, за некоторыми специфическими командами типа выхода из прерывания, а также при активном использовании дебаггера.
Application Note – полезные советы по решению конкретных задач, часто с примерами кода.
Errata Sheet – описание случаев нестандартного поведения чипа с вариантами обхода, если есть.
Что есть в даташитах
Непосредственно в Datasheet нам могут потребоваться такие разделы:
Device Summary – первая страница даташита вкратце рассказывает об устройстве. Очень полезна в ситуациях, когда вы где-то нашли чип (увидели в магазине, выпаяли, встретили упоминание) и хотите понять, что это.
General Description – более подробное описание возможностей чипов из линейки.
Pinouts – схемы распиновки для всех возможных корпусов чипа (на какой ноге какой пин).
Pin Description – описание назначения и возможностей каждого пина.
Memory Map – карта адресов в памяти нам вряд ли потребуется, но иногда в нее включается также таблица адресов блоков регистров.
Register Map – таблица адресов блоков регистров, как правило, находится именно в даташите, а в Ref Manual – только сдвиги (address offsets).
Electrical Characteristics – в этом разделе нас в первую очередь интересуют absolute maximum ratings, перечисляющие максимальные нагрузки на чип. В отличие от неубиваемой Atmega328p, большинство МК не позволяет подключать к пинам серьезные нагрузки, что становится неприятным сюрпризом для ардуинщиков.
Package Information – чертежи доступных корпусов, полезные при проектировании своих плат.
Reference Manual структурно состоит из разделов, посвященных конкретной периферии, указанной в их заголовке. Каждую главу можно условно поделить на три части:
Overview, Introduction, Features – обзор возможностей периферии;
Functional Description, Usage Guide или просто основной блок раздела – подробное текстовое описание принципов устройства периферии и способов ее использования;
Registers – описание управляющих регистров. В простых случаях типа GPIO или SPI этого может быть вполне достаточно, чтобы начать использовать периферию, но часто приходится все-таки читать и предыдущие части.
Как читать даташиты
Даташиты с непривычки отпугивают своим объемом и обилием непонятных слов. На самом деле все не так страшно, если знать несколько лайфхаков.
Установите хорошую PDF-читалку. Даташиты пишутся в славных традициях бумажных инструкций, их здорово распечатать, проложить пластиковыми закладками и сшить. Гипертекст в них наблюдается в следовых количествах. К счастью, хотя бы структуру документа оформляют закладками, поэтому годная читалка с удобной навигацией очень нужна.
Даташит – не учебник Страуструпа, в нем не надо читать все подряд. Если воспользовались предыдущим советом – просто найдите в панели закладок нужный раздел.
Даташиты, особенно Reference Manuals, могут описывать возможности не конкретного чипа, а всей линейки. Это значит, что половина, а то и две трети информации не имеет отношения к вашему чипу. Прежде чем изучать регистры TIM7, проверьте в General Description, есть ли он у вас.
Знать английский достаточно на базовом уровне. Даташиты наполовину состоят из терминов, незнакомых среднестатистическому носителю языка, и наполовину – из простых связующих конструкций. Еще бывают прекрасные китайские даташиты на китайском английском, где половина также термины, а вторая половина – рандомный набор слов.
Если встречаете незнакомое слово, не пытайтесь перевести его с помощью англо-русского словаря. Если вас ставит в тупик hysteresis, то от перевода «гистерезис» теплее вам не станет. Пользуйтесь Гуглом, Stack Overflow, Википедией, форумами, где нужное понятие будет объяснено простыми словами с примерами.
Лучший способ понять прочитанное – проверить в деле. Поэтому держите под рукой отладочную плату, с которой знакомитесь, а лучше две – на случай, если все-таки что-то недопоняли и увидели волшебный дымок.
Полезна привычка держать под рукой даташит, когда вы читаете чей-то тьюториал или изучаете чужую библиотеку. Вполне возможно, в нем вы найдете более оптимальное решение своей задачи. И наоборот – если из даташита никак не удается понять, как же все-таки работает регистр, загуглите его: скорее всего, кто-то уже все описал простыми словами или оставил понятный код на ГитХабе.
Словарик
Немного полезных слов и обозначений, помогающих быстрее освоиться с даташитами. То, что вспомнилось в последние пару дней, дополнения и исправления приветствуются.
Электричество
Vcc, Vdd – «плюс», питание
Vss, Vee – «минус», земля
current – ток
voltage – напряжение
to sink current – работать «землей» для внешней нагрузки
to source current – питать внешнюю нагрузку
high sink/source pin – пин с повышенной «терпимостью» к нагрузке
IO
H, High – на пине Vcc
L, Low – на пине Vss
High Impedance, Hi-Z, floating – на пине ничего нет, «высокое сопротивление», он фактически невидим внешнему миру.
weak pull up, weak pull down – встроенный подтягивающий/стягивающий резистор, примерный аналог 50 кОм (см. даташит). Используется, например, чтобы входной пин не болтался в воздухе, вызывая ложные срабатывания. Weak – потому что его легко «перебить».
push pull – выходной режим пина, в котором он переключается между High и Low – обычный OUTPUT с Arduino.
open drain – обозначение выходного режима, в котором пин может быть либо Low, либо High Impedance / Floating. При этом почти всегда это не «настоящий» открытый сток, есть защитные диоды, резисторы, еще что. Это просто обозначение режима земля/ничего.
true open drain – а вот это уже настоящий открытый сток: пин напрямую ведет в землю, если открыт, или пребывает в подвешенном состоянии, если закрыт. Это значит, что через него при необходимости можно пускать напряжение больше Vcc, но максимум все равно оговаривается в даташите в разделе Absolute Maximum Ratings / Voltage.
Интерфейсы
in series – подключенные последовательно
to chain – собирать чипы в цепочку последовательным подключением, увеличивая количество выходов.
shift – сдвиг, обычно обозначает сдвиг битов. Соответственно, to shift in и to shift out – принимать и передавать данные побитно.
latch – задвижка, прикрывающая буфер, пока через него сдвигаются биты. Когда передача закончена, задвижка открывается, биты начинают работать.
to clock in – выполнить побитную передачу, сдвинуть все биты на нужные места.
double buffer, shadow register, preload register – обозначения истории, когда регистр должен уметь принимать новые данные, но придерживать их до какого-то момента. Например, для корректной работы ШИМ его параметры (скважность, частота) не должны меняться, пока не закончится текущий цикл, но новые параметры уже могут быть переданы. Соответственно, текущие держатся в shadow register, а новые попадают в preload register, будучи записанными в соответствующий регистр чипа.
Всякое
prescaler – предделитель частоты
to set a bit – установить бит в 1
to clear/reset a bit – сбросить бит в 0 (reset – фишка даташитов STM)
to toggle a bit – поменять значение бита на противоположное (см. пример в начале статьи)
Что дальше
Вообще тут планировалась практическая часть с демонстрацией трех проектов на STM32 и STM8, выполненных специально для этой статьи при помощи даташитов, с лампочками, SPI, таймерами, ШИМом и прерываниями:

Но текста получается многовато, поэтому проекты отправляются во вторую часть.
Навык чтения даташитов поможет вам с вашим хобби, но едва ли заменит живое общение с коллегами по увлечению на форумах и в чатах. Для него надо все-таки в первую очередь подтягивать английский язык. А потому дочитавшим – специальный приз: два бесплатных урока в Skyeng при первой оплате по коду HABR2 .
Урок 6. Порты ввода-вывода STM32.

В уроке узнаем структуру, функциональные возможности, электрические характеристики портов ввода-вывода общего назначения. Изучим регистры микроконтроллера для управления портами.
Кому-то кажется, что порты ввода-вывода очень простой элемент микроконтроллера. Выбрал для вывода режим — вход или выход, считал или установил его состояние.
Не пропускайте этот урок, прочитайте внимательно. По опыту уроков Ардуино знаю, что много вопросов возникает из-за незнания всего того, что я описываю в этой статье.
И про аппаратное устройство портов и их электрические характеристики я пишу не для того, чтобы набрать объем урока. Это очень важный вопрос. Знание его необходимо для подключения к микроконтроллеру различных электронных компонентов. Микроконтроллер сам по себе никогда не работает. К нему всегда что-то подключается.
Через порты ввода-вывода микроконтроллер управляет и связывается со всем, что к нему подключено. Есть еще коммуникационные интерфейсы, но о них в последующих уроках. Хотя интерфейсы также используют порты, только в режиме альтернативных функций.
В системе STM32 применяется общепринятое название портов ввода-вывода общего назначения, а именно GPIO (General purpose input-output).
Под “общим назначением” имеется в виду, что состояние выводов устанавливается или считывается программно, т.е. вывод не является входным или выходным сигналом какого-либо аппаратного узла микроконтроллера.
В системе STM32:
- Порты обозначаются GPIOA, GPIOB, GPIOC и т.д. На схеме микроконтроллера соответствующие портам выводы обозначаются PA0-PA15, PB0-PB15, PC0-PC15…
- Порты 16ти разрядные, т.е. у каждого порта 16 выводов.
- Режим и состояние каждого вывода могут быть установлены отдельно, независимо от других выводов.
- Каждый вывод может использоваться в режиме:
- Input floating – вход без подтягивающего резистора, брошенный в воздухе вход.
- Input pull-up – вход с подтягивающим резистором, подключенным к питанию микроконтроллера.
- Input pull-down — вход с подтягивающим резистором, подключенным к общему проводу (земле).
- Analog – аналоговый вход ( вход АЦП, компараторов и т.п.).
- Output open-drain – выход с открытым стоком. Функционально аналогичен выходу с открытым коллектором. При низком логическом уровне замыкает вывод на землю, при высоком – бросает в воздухе.
- Output push-pull – обычный активный выход. При низком логическом уровне напряжение на выводе равно 0, при высоком – напряжение близко к напряжению питания микроконтроллера, обычно + 3 В.
- Alternate function push-pull – альтернативная функция вывода в обычном (активном) режиме.
- Alternate function open-drain – альтернативная функция вывода в режиме открытый сток.
- GPIOA – 16 выводов: PA0-PA15;
- GPIOB – 16 выводов: PB0-PB15;
- GPIOC – 3 вывода: PC13-PC15;
- GPIOD – 2 выводов: PD0, PD1.

Порты STM32 с аппаратной точки зрения.
К портам ввода-вывода мы будем подключать реальные аппаратные устройства, узлы, схемы. Поэтому важно знать, как они устроены, их электрические характеристики.
В документации приводится базовая схема вывода порта.

Нас интересует правая, выходная часть.
Режим входов.
При использовании вывода в качестве входа, к нему могут быть подключены подтягивающие резисторы сопротивлением порядка 40 кОм. Либо к питанию Vdd, либо к земле Vss.
Основные для нас входные параметры портов.
Параметр Значение Напряжение низкого уровня Не более 0,35 VDD
При питании 3,3 В не более 1,16 ВНапряжение высокого уровня Не менее 0,65 VDD
При питании 3,3 В не менее 2,15 ВТок утечки ± 1 мкА Сопротивление подтягивающих резисторов 30 – 50 кОм,
типовое значение 40 кОмЕмкость 5 пкФ Обратите внимание, какая небольшая разница между входными напряжениями низкого и высокого уровня. За это я и не люблю 3-вольтовые контроллеры.
Согласно схеме к выводу подключены 2 защитных диода. Один на землю Vss, другой на шину питания Vdd. Первый замыкает через себя входное напряжение отрицательной полярности, другой ограничивает его на уровне Vdd, у нас на плате это 3,3 В.
Сигналы с напряжением, превышающим эти пределы должны подключаться через ограничительные резисторы. Входной ток не должен превышать ± 5 мА. Это предельный ток защитных диодов.
Еще надо помнить, что втекающий ток через защитные диоды поступает на источник питания платы. Если он превышает ток потребления платы, то напряжение питания микроконтроллера будет повышаться и может достигнуть недопустимого значения. Это обычная проблема в подобных схемах.
Но большая часть входов микроконтроллера допускает подачу напряжения 5 В. Это, так называемые, толерантные к 5 В входы. В схеме для таких выводов верхний защитный диод подключен не к питанию Vdd, а к ограничителю напряжения Vdd_ft. Толерантные выводы обозначаются FT (five volt tolerant). Напряжение ограничевается до уровня на 4 В выше Vdd. Сделано это для подключения сигналов с 5 В уровнями. На схеме распределения выводов STM32F103C8T6 толерантные к 5 В выводы отмечены закрашенными точками.
Предельно-допустимые входные параметры портов.
Параметр Значение Напряжение на толерантных входах Не менее — 0,3 В, не более Vdd + 4 В
При питании 3,3 В — 0,3 … 7,3 ВНапряжение на остальных входах Не менее — 0,3 В, не более 4 В Максимальный втекающий ток через защитные диоды ± 5 мА Режим выходов.
В режиме выхода порта работают 2 комплементарных транзистора.
- В активном режиме они открываются по очереди, соединяя выход с шиной питания или землей.
- В режиме с открытым стоком работает только нижний транзистор, замыкая выход на землю при низком логическом уровне.
Выходные параметры портов.
Параметр Значение Напряжение низкого уровня при втекающем токе 8 мА Не более 0,4 В Напряжение низкого уровня при втекающем токе 20 мА Не более 1,3 В Напряжение высокого уровня при вытекающем токе 8 мА Не менее Vdd – 0,4 В Напряжение высокого уровня при вытекающем токе 20 мА Не менее Vdd – 1,3 В Предельно-допустимые выходные параметры портов.
Параметр Значение Максимальный вытекающий ток вывода 25 мА Максимальный втекающий ток вывода — 25 мА Общий вытекающий или втекающий ток портов Не более 150 мА. Получается, что к каждому выводу порта можно подключать нагрузку до 25 мА. Но при этом уровень логического сигнала выйдет за допустимые значения логических уровней. Чтобы этого не произошло нельзя нагружать вывод током свыше 8 мА.
Программное управление портами STM32.
Для каждого порта (16 выводов) есть два 32х разрядных регистра конфигурации. Они образуют 64 битный регистр конфигурации порта.
Младший регистр конфигурации портов GPIOx_CRL (Port configuration register low)

Старший регистр конфигурации портов GPIOx_CRH (Port configuration register high)

На каждый вывод отводится 4 бита, которые делятся на 2 битные поля режима и конфигурации.
Поле режима определяет направление работы вывода – вход или выход. В случае выхода оно задает максимальную частоту передачи выходного сигнала. Очевидно, это влияет на энергопотребление микроконтроллера.
Поле режима (биты Mode).
Биты режима MODE [1 : 0] Режим 0 0 Вход 0 1 Выход, синхронизация 10 мГц 1 0 Выход, синхронизация 2 мГц 1 1 Выход, синхронизация 50 мГц Поле режима дополняют биты конфигурации.
Конфигурация Биты конфигурации
CNF [1 : 0]Биты режима
MODE [1 : 0]Бит в регистре вывода данных
PxODRВыход общего назначения Активный выход 0 0 0 1 Состояние регистров конфигурации можно защитить от непредусмотренных изменений. Для этого существует регистр блокировки конфигурации.
Регистр блокировки конфигурации порта GPIOx_LCKR (Port configuration lock register)

Каждому выводу порта соответствует бит блокировки LCK0 – LCK15. При установке бита в 1 запрещается изменение соответствующих битов режима и конфигурации. После задания всех нужных битов регистра блокировки необходимо активизировать защиту. Для этого надо в 16й бит регистра блокировки (LCKK) последовательно записать 1, 0, 1. После этого блокировка будет действовать и изменение защищенных битов конфигурации и режима возможно только после сброса микроконтроллера.
Проверить установлена ли защита конфигурации можно чтением этого же 16-го бита (LCKK). При активированной защите два подряд чтения бита должны дать результат 0, 1.
Доступ к портам происходит через регистры ввода и вывода данных.
Регистр ввода данных порта GPIOx_IDR (Port input data register)

Регистр вывода данных порта GPIOx_ODR (Port output data register)

Первый доступен только для чтения. Биты IDR0 – IDR15 содержат состояние соответствующих выводов порта.
Запись данных во второй регистр устанавливает состояние выводов порта (ODR0 – ODR15).
Если задан режим вывода – вход, то состояние соответствующего бита ODR0 – ODR15 определяет, куда подключен подтягивающий резистор, к шине питания или земле.
Для управления состоянием отдельных выводов можно воспользоваться регистрами битовой обработки.
Регистр установки/сброса битов GPIOx_BSRR (Port bit set/reset register)

Регистр установки/сброса битов разделен на 2 равные части(0-15 и 16-31). Первая предназначена для установки выводов в состояние 1, вторая – в состояние 0.
- Запись данного с 1 в битах BS0 – BS15 устанавливает соответствующие выводы в состояние высокого уровня.
- Запись данного с 1 в битах BR0 – BR15 переводит соответствующие выводы в состояние низкого уровня.
Таким образом, одним обращением к регистру можно установить или сбросить нужные выводы, не изменяя состояние остальных. Если производить эту операцию с помощью регистра вывода данных, то потребуется операции чтение, модификация и запись.
Регистр сброса битов GPIOx_BRR (Port bit reset register)

Это 16ти разрядный регистр, который работает точно так, как младшая половина предыдущего регистра установки/сброса.
Запись слова с 1 в битах BR0 – BR15 переводит соответствующие выводы в состояние низкого уровня.
Конфигурация портов с помощью STM32CubeMX.
Здесь все просто и понятно. Мы это уже делали.
Давайте настроим вывод PB12 на вход с подтягивающим резистором к шине питания, а PB13 на активный выход.
Закладка System Core -> GPIO.
Правой кнопкой мыши нажимаем на вывод PB12. Выбираем GPIO_Input.

Для вывода PB13 задаем режим GPIO_Output

В поле Configuration выбираем строку PB12 и задаем Pull-up и имя вывода. Я написал Button.

Выбираем строку PB13 и задаем:
- высокий уровень при включении (High);
- активный выход (Output Push Pull);
- имя Led.

Я не буду описывать режимы, они очевидны.
Давайте настроим систему тактирования и вывод PC13, как в уроке 3, и создадим проект Lesson6_1.

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