что такое gpio порт
Что такое GPIO (General Purpose Input/Output).
Что такое GPIO (General Purpose Input/Output).
Порт GPIO (универсальный ввод/вывод) размещают внутри кристаллов прцессоров, чипсетов, вспомогательных чипов управления. Порт GPIO обрабатывает как входящие, так и исходящие цифровые сигналы. В качестве входного порта его можно использовать, например, для связи ЦП или PCH с сигналами полученными от переключателей, или цифровыми показаниями, полученными от датчиков. В качестве выходного порта его можно использовать для формирования сигналов управления внешними операциями на основе программ исполняемых процессором, например, для управления включением/ выключением светодиодной подсветки дисплея, или вывода сигналов управления двигателем и т. п..
GPIO называют «порт общего назначения», поскольку каждый его разряд может быть свободно настроен для работы по приему как входных сигналов, так и для формирования выходных сигналов (программным путем). В ранних вариантах каждый порт был либо исключительно входным, либо исключительно выходным. Однако сейчас GPIO является «гибким» по использованию своих контактов. Вы можете установить их назначение наилучшим образом в соответствии с вашими потребностями ( на вход, на выход или вход/выход в любой количественной комбинации.
Во время чтения, записи и работы с цифровыми значениями (0 и 1) внешние устройства часто используют уровни сигнала: «низкое» напряжение и «высокое» напряжение. GPIO выполняет необходимые преобразования в обоих направлениях.
Регистр входных данных порта (PIDR). Показывает состояние входных контактов. Для каждого вывода вход LOW-сигнала устанавливает соответствующее значение разряда регистра в 0; вход сигнала HIGH устанавливает соответствующее значение разряда регистра в 1. CPU программно считывает этот регистр, чтобы узнать самые последние уровни сигнала его разрядов. Значения сохраняются до перезаписывания; каждый раз, когда CPU считывает регистр, он будет отображать текущие состояния входных сигналов.
Рис. 1. Базовая структура GPIO (концептуальная).
Регистр выходных данных порта (PODR). Чтобы выводить данные через выходные выводы, ЦП программно записывает выходные значения в этот регистр. Значение 0 преобразуется в LOW-выход; 1 преобразуется в HIGH выход. Как и в обычной памяти, значения, записанные здесь, сохраняются до перезаписывания. Это означает, что уровень выходного контакта будет поддерживаться до тех пор, пока значение не будет изменено.
Модуль GPIO является гибким для различных приложений. Каждый вывод GPIO может быть настроен в качестве альтернативного режима ввода или альтернативного выхода. Альтернативная функция может быть выбрана регистром установки.
На рис. 3 видим, например, что разряд GPIO77 – используется для приема входного сигнала DGPU_PWRGD; разряд GPIO7 8 – используется для формирования выходного сигнала PXS_PWREN.
Рис. 3. Фрагмент схемы (однокристальный вариант Intel Haswell ULT/Broadwell U)
Рис. 4. Использование порта GPIO в ЕС контроллере (EC-KB9012).
В предыдущем уроке мы поговорили о необходимой нам документации и установили IDE. Сейчас самое время познакомится с GPIO.
В этом уроке мы:
Начало
Что это за зверь такой? Если по-нашему, то GPIO — это порты ввода-вывода общего назначения. Через них микроконтроллер по сути связан с внешним миром. Вот почему именно с этого и нужно начинать знакомство с STM32.
Я попрошу вас открыть скачанное ранее Справочное руководство, страницу 265 и взглянуть на раздел 8 General-purpose I/Os (GPIO). В первом же предложении сказано, что все написанное в разделе касается всей серии STM32F4, если только в каком-либо пункте не сказано иначе. Окей, возьмем на заметку, что в случае чего нужно смотреть Даташит. К пункту 8.1 мы еще вернемся при рассмотрении регистров GPIO, поэтому сейчас пропускаем его и переходим к пункту 8.2. В нем сказано, что:
Основные возможности GPIO рассмотрели, перейдем к режимам работы порта. Смотрим в пункте 8.3 GPIO functional description режимы:
Остановимся еще на одном важном моменте: после системного сброса порты по умолчанию находятся в режиме высокоимпедансного входа(Hi-Z).
Я попрошу вас еще раз пройтись по пунктам 8.1 — 8.3.2 Справочного руководства, и переходить к следующей части статьи только когда убедитесь, что освоили все вышеописанное. Не пытайтесь разобраться сразу во всем, это просто невозможно, у нас ведь практический курс и во всем не понятном мы будем разбираться по ходу изучения.
Разобрались? Отлично, теперь поговорим о регистрах.
Регистры GPIO
В соответствии с пунктом 8.1 GPIO introduction у нас есть 10 регистров для каждого порта. Давайте-ка разобъем их на типы:
Попрошу вас пройтись по пунктам 8.3.3 — 8.3.15 Справочного руководства и слегка заглянуть в 8.4. Слегка потому, что писать мы будем на Си, совсем изредка используя ассемблерные вставки в критичных участках. Серьезно, если у вас есть друг, который пишет под высокоуровневые МК только на ассемблере и он не джедай, скорее бегите за лекарствами. Можно на пальцах пересчитать проекты на STM32 которые требуют исключительно ассемблерного кода. Написать часть RTOS или криптофункцию на асме вполне оправданно, но проект целиком? К счастью лихие 90е прошли, и если код не влазит в кристалл, меняйте либо камень, либо код.
Приступим к практике
С теорией разобрались. Попробуем теперь применить полученные знания на практике. Еще раз напомню, что в нашем коде будет одна строчка, работающая на магии и пока что вам придется поверить мне на слово, что без этой строчки ничего не заработает(хотя скомпилируется без проблем). Так что мы просто вставим ее в код и на время забудем о ней(но вспомним в следующем уроке). Ну что, поехали.
Открываем кокос CoIDE и создаем новый проект:
Тут вводим имя проекта и выбираем директория, в которой он будет лежать(на картинке дефолтная, еще картинка сжата по высоте). Имя проекта обязательно английскими буквами и без пробелов, иначе могут возникнуть проблемы с периносимостью. Нажимаем Next
Нажимаем на Chip и опять Next
Выбираем наш установленный на F4-Discovery МК(STM32F407VG), жмем Finish.
Нам предложат добавить в проект библиотеки из репозитория. Добавляем: M4 CMSIS Core, CMSIS BOOT, RCC, GPIO отметив их галочками.
Ищем слева main.c и двойным кликом открываем. Теперь разберемся, что же мы добавили из репозитория. Словом каждый пункт из списка «PERIPHERAL.ST» является частью очень удобной библиотеки StdPeriph_Lib от ST. Саму библиотеку мы скачивали в предыдущем уроке. Тогда я попросил вас оставить из скачанного архива лишь файл «stm32f4xx_dsp_stdperiph_lib_um.chm» с документацией на библиотеку и сказал, что остальные файлы из архива нам не нужны поскольку библиотеку будем подключать из репозитория кокоса. Как видим, это намного удобнее, чем переносить файлы библиотеки в директорию вручную. Из репозитория помимо необходимого нам GPIO мы потянули еще и RCC(та самая магия, которую в этом уроке мы не трогаем).
Что за два остальных компонента репозитория, те, что с именем CMSIS? Это стандартизированная для всех Cortex-M библиотека абстракции, которая позволяет при написании кода думать на более высоком уровне(архитектуры вцелом и имеющейся периферии). Помимо упрощения написания кода, библиотека очень упрощает перенесение кода между разными МК с Cortex-M на борту(да-да, не только STM). К слову библиотека распространяется самой компанией ARM. При желании можно зайти сюда и почитать про библиотеку и скачать спецификацию на нее, но это чисто почитать на горшке досуге: в данном уроке можно обойтись без рассмотрения особенностей этой библиотеки.
Замените код в main.c на следующий:
Как говорил наш препод по программированию: «Вот мы и написали основную часть кода». Эту основную часть будем по ходу дела дополнять всем недостающим.
Допишем недостающие части кода. Поскольку мигать мы будем светодиодом, хорошо бы знать на какую ногу МК он прицеплен. Посмотрите на плату F4-Discovery, по две стороны нижнего usb у нас 2 светодиода, а между кнопками у нас расположены еще 4. Со светодиодами определились, теперь посмотрем куда создатели Discovery решили их подключить. Откройте Руководство Discovery(мы скачали его с сайта ST в прошлом уроке) и найдите в описании подключенных устройств LEDs (страница 16, п. 4.4) и выбираем, например синий диод. Там же смотрим, что он имеет обозначение LD6 и подключен к PD15(порт D вывод 15) нашего МК, но как именно он подключен нам пока не известно. Посмотрим на скачанной(в пр. уроке) схеме Discovery, в самом конце на 6 стр. находим вот такой структурный блок:
Отсюда видно, для того что бы зажечь синий светодиод необходимо подключить вывод PD15 к питанию, т.е. подать на ножку в режиме push-pull(двухтактный выход) логическую 1. Но как мы уже говорили ранее сначала вывод нужно сконфигурировать.
Ну а для того, что бы зажечь/погасить светодиод в StdPeriph_Lib у нас есть функции GPIO_SetBits и GPIO_ResetBits, предоставляющие интерфейс к регистру GPIOx_BSRR. Пожалуйста, найдите ее в документации к библиотеке. Код включения и выключения светодиода будет выглядеть следующим образом:
Что такое gpio порт
Далее рассмотрим возможности, свойства, особенности, характеристики и основы работы с GPIO. Будет рассмотрен также базовый пример использования GPIO.
Введение
В качестве базового примера, приведём простейшую программу, в которой осуществляется работа с GPIO. Здесь используется оценочная плата STM32VLDISCOVERY с микроконтроллером STM32F100RBT6B (подробнее об используемых средствах разработки смотрите «Минимальное приложение C++ для микроконтроллера ARM». )
Прежде чем перейти к анализу программы, рассмотрим некоторые теоретические вопросы, касающиеся GPIO.
GPIO: обзор
Предусмотрены 4 варианта режима для входа, и 4 режима для выхода.
Для каждого из указанных выходных режимов предусмотрен выбор одного из трёх скоростных вариантов.
Во время и после сброса все выводы портов сконфигурированы как плавающие входы.
Например, у микроконтроллеров STM32F100xx вывод с основной функцией PA0 имеет альтернативные функции: WKUP (сигнал для пробуждения из режима ожидания standby), USART2_CTS (одна из линий второго интерфейса USART), ADC1_IN0 (вход 0 ADC, аналоговый), TIM2_CH1_ETR (внешний тактовый сигнал для второго таймера). Разумеется, во избежание конфликтов, одновременно может быть включено только одно из периферийных устройств, использующих общий выход.
Есть определённые ограничения на использование некоторых портов ввода/вывода. Выводы PA13, PA14, PA15, PB3, PB4 после сброса конфигурируются как используемые для отладки, что существенно ограничивает возможность их применения как портов ввода/вывода. PD0, PD1 используются для подключения кварцевого резонатора (это основная функция). К PC14, PC15 подключается кварц часов реального времени на 32 кГц (альтернативная, но часто используемая функция). PB2 является по совместительству входом BOOT1, совместно с BOOT0 определяющим способ начальной загрузки (правда, если на BOOT0 подан 0, задающий режим загрузки из Flash, а это самый часто используемый вариант, то сигнал на входе BOOT1 безразличен и PB2 можно использовать свободно). Кроме того, PC13, PC14 и PC15 получают питание через ключ с малым допустимым током (около 3 мА), так что использование PC13..PC15 в режиме выхода весьма ограничено: частота переключения не должна превышать 2 МГц, максимальная ёмкость нагрузки 30 пФ, недопустимо использовать выход в качестве источника тока (например, для подключения светодиодов).
Если учесть, что многие выводы в готовом устройстве будут задействованы используемыми периферийными устройствами и интерфейсами, то с учётом всех ограничений, остаётся не так много свободных портов ввода/вывода, как может показаться на первый взгляд.
GPIO: устройство
Универсальность и множество доступных режимов работы вывода GPIO обеспечивается благодаря достаточно сложной схеме управления выводом. На рисунке изображена структурная схема для одного разряда порта ввода/вывода.
Чтобы получить на выходе сигнал с уровнем логической единицы до 5 В, следует использовать FT-вывод микроконтроллера в режиме выхода с открытым стоком (разумеется, со смещением от внешнего источника 5 В через резистор).
В datasheet на устройство указывается, какие выводы имеют допустимое напряжение 5 В. У микроконтроллеров STM32F100xx все сигнальные выводы являются FT-выводами, кроме: NRST, BOOT0, PA0..PA7, PB0, PB1, PB5, PC0..PC5, PC13, PC14, PC15 (из них PA0..PA7, PB0, PB1, PC0..PC5 не являются FT по той причине, что они в качестве альтернативной функции являются аналоговыми входами ADC: входы ADC1_IN0..ADC1_IN15). Уточняйте информацию в datasheet на своё устройство.
К выводу подключены драйвер входа и драйвер выхода.
Регистры установки/сброса битов упрощают доступ к отдельным разрядам порта ввода/вывода и обеспечивают атомарность доступа. Под атомарностью имеется в виду неделимость, непрерываемость операции, выполнение операции как одного действия.
Выбором соответствующего режима входа, может быть подключен один из подтягивающих резисторов. Наличие встроенных подтягивающих резисторов позволяет сократить количество компонентов на плате и упростить устройство в целом. Резисторы используются для того, чтобы принудительно задать уровень сигнала (высокий или низкий) на входе, который может в какие-то моменты работы устройства оставаться неподключённым, «висящим». Пример: вывод подключён через кнопку к общему проводу. Когда кнопка нажата, на выводе формируется логический 0. При разомкнутой кнопке подтягивающий резистор pull-up задаст логическую 1. Другие возможные варианты использования: подтягивание неиспользуемых выводов микроконтроллера (чтобы избежать наведения помех в этих выводах); при подключении к выходу с Z-состоянием или к выходу с открытым стоком. Стоит иметь в виду, что сопротивление внутренних подтягивающих резисторов довольно велико (для STM32F100xx по datasheet находится в пределах 30..50 кОм, типичное значение 40 кОм). С другой стороны, например для механических кнопок, может быть ограничен минимальный ток. При токе ниже минимального не гарантируется низкое сопротивление замкнутых контактов нажатой кнопки, кроме того это сопротивление может быть нестабильным и являться источником повышенного шума. Не знаю, по этой причине или из других соображений, но в STM32 value line Discovery evaluation board, например, используются внешние подтягивающие резисторы для подключения кнопок.
Кроме того могут быть и нетрадиционные варианты использования режима. Например, вход с подтягивающим резистором можно использовать как выход с большим внутренним сопротивлением! Такой вариант тоже иногда бывает полезен, особенно при желании минимизировать количество внешних компонентов.
GPIO: характеристики
Здесь будут рассмотрены только некоторые характеристики портов ввода/вывода микроконтроллеров STM32F100xx. За подробной информацией обращайтесь к datasheet.
Типовые значения обычно даются для температуры окружающей среды 25º C, напряжения питания 3.3 В.
Максимально допустимый выходной ток одного вывода составляет 25 мА; если нагружены несколько выводов, то нужно учитывать ограничение по току линий питания микроконтроллера и линий земли величиной 150 мА. Например, если 6 выводов отдают ток по 25 мА каждый, потребуется 150 мА от источника по линиям VDD. Так как сам микроконтроллер тоже потребляет ток, то уже получаем перегрузку.
Разумеется, не следует допускать работу выводов при максимальном токе. Во-первых, должен быть запас для более надёжной работы. Во-вторых, с увеличением тока, смещаются уровни сигналов на выходе из-за падения напряжения на внутреннем сопротивлении ключей.
Обозначение | Параметр | Условия измерения | Min | Max | Единица |
VOL | Напряжение низкого уровня на выходе | IIO=6 мА 2 В | 0.4 | В | |
VOH | Напряжение высокого уровня на выходе | VDD-0.4 | |||
VOL | Напряжение низкого уровня на выходе | IIO=8 мА 2.7 В | 0.4 | ||
VOH | Напряжение высокого уровня на выходе | VDD-0.4 | |||
VOL | Напряжение низкого уровня на выходе | IIO=20 мА 2.7 В | 1.3 | ||
VOH | Напряжение высокого уровня на выходе | VDD-1.3 |
Однако совместимость наблюдается только при не слишком больших токах выхода: до 6 мА при низких напряжениях питания (до 2.7 В) и до 8 мА при напряжении питания свыше 2.7 В. Большие токи допустимы, если только нет строгих требований к уровням выходного напряжения (например, управление ключом на биполярном транзисторе, управление оптоэлектронными приборами).
Обозначение | Параметр | Условия измерения | Min | Typ | Max | Единица |
VIL | Напряжение низкого уровня стандартного входа | -0.5 | 0.28*(VVDD-2)+0.8 | В | ||
Напряжение низкого уровня FT-входа | -0.5 | 0.32*(VVDD-2)+0.75 | ||||
VIH | Напряжение высокого уровня стандартного входа | 0.41*(VDD–2)+1.3 | VDD+0.5 | |||
Напряжение высокого уровня FT-входа | 0.42*(VDD–2)+1 | 5.5 | ||||
Vhys | Гистерезис триггера Шмитта на стандартном входе | 200 | мВ | |||
Гистерезис триггера Шмитта на FT-входе | 5% VDD | |||||
Ilkg | Ток утечки входа | VSS≤VIN≤VDD Стандартный вход | ±1 | мкА | ||
VIN=5 В FT-вход | 3 | |||||
RPU | Сопротивление подтягивающего к высокому уровню резистора | VIN=VSS | 30 | 40 | 50 | кОм |
RPD | Сопротивление подтягивающего к низкому уровню резистора | VIN=VDD | ||||
CIO | Ёмкость входа | 5 | пФ |
Входы также являются TTL и CMOS-совместимыми. Микроконтроллер без проблем может работать в смешанных схемах, содержащих CMOS и TTL-логику с напряжением питания 5 В. Неплохо, особенно с учётом того, что сами микросхемы TTL и CMOS не всегда совместимы между собой без преобразования уровней!
GPIO: управление
GPIO, как и все остальные устройства микроконтроллера, управляются с помощью регистров. Полный перечень регистров, их адреса, назначение, содержимое после сброса, правила доступа можно найти в руководстве пользователя для микроконтроллера.
Таким образом, регистр GPIOx_CRL содержит 8 битовых полей размером по 4 бита каждое, отвечающих за конфигурирование соответствующих разрядов 0..7 порта GPIOx, структура регистра поясняется следующей таблицей:
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
Px7 conf. | Px6 conf. | Px5 conf. | Px4 conf. | ||||||||||||
rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw |
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Px3 conf. | Px2 conf. | Px1 conf. | Px0 conf. | ||||||||||||
rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw |
Структура регистров GPIOx_CRH аналогична:
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
Px15 conf. | Px14 conf. | Px13 conf. | Px12 conf. | ||||||||||||
rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw |
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Px11 conf. | Px10 conf. | Px9 conf. | Px8 conf. | ||||||||||||
rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw |
Теперь перейдём к рассмотрению самого битового поля, определяющего режим работы соответствующего ему разряда порта (соответствующего вывода микроконтроллера).
Смещение бита | +3 | +2 | +1 | +0 |
Наименование | CNF1 | CNF0 | MODE1 | MODE0 |
Биты MODE (два младших бита четырёхбитового поля конфигурации) задают режим работы вывода: вход или выход, а для выхода, кроме того, определяют скоростные возможности.
MODE | Режим |
00 | Вход |
01 | Выход, максимальная частота 10 МГц |
10 | Выход, максимальная частота 2 МГц |
11 | Выход, максимальная частота 50 МГц |
Такой загадочный параметр, как максимальная частота выходного сигнала всего лишь определяет время нарастания и спада сигнала на выходе при переключении. Величина 50 МГц указанная в руководстве (Reference manual) проникла туда, очевидно из документации на более высокоскоростные устройства, тогда как в спецификации (Datasheet) честно говорится о максимальных частотах 10, 2 и 24 МГц. Время спада и нарастания при переключении составляет 1/4 часть от периода максимальной частоты при ёмкости нагрузки 50 пФ (t=1/(4*Fmax)). Составляет соответственно 25 нс, 125 нс и 8..12 нс. Так как увеличение скорости переключения приводит к увеличению потребляемой мощности, не стоит без необходимости выбирать высокоскоростные режимы.
Биты CNF определяют детали конфигурации для бита порта в каждом из режимов.
CNF | Значение |
00 | Аналоговый вход |
01 | Цифровой плавающий вход |
10 | Цифровой вход с подтягивающим резистором |
11 | Зарезервировано |
Во время и после сброса, выводы портов вводы/выводов конфигурируются как плавающие входы (во избежание конфликтов с подключёнными к микроконтроллеру устройствами).
Варианты режимов выхода задаются битами CNF и приведены в следующей таблице.
CNF | Значение |
00 | Двухтактный выход |
01 | Выход с открытым стоком |
10 | Альтернативная функция, двухтактный выход |
11 | Альтернативная функция, выход с открытым стоком |
Конфигурационное значение для разряда определяем путём комбинирования отдельных битов в соответствии с требуемым режимом работы вывода. Или можем сразу взять готовое значение из таблицы.
Режим работы вывода | Конфигурационное значение |
Вход аналоговый | 0x0 |
Вход цифровой плавающий | 0x4 |
Вход цифровой с подтяжкой | 0x8 |
Выход, основная функция, двухтактный, 10МГц | 0x1 |
Выход, основная функция, двухтактный, 2МГц | 0x2 |
Выход, основная функция, двухтактный, 50МГц | 0x3 |
Выход, основная функция, открытый сток, 10МГц | 0x5 |
Выход, основная функция, открытый сток, 2МГц | 0x6 |
Выход, основная функция, открытый сток, 50МГц | 0x7 |
Выход, альтернативная функция, двухтактный, 10МГц | 0x9 |
Выход, альтернативная функция, двухтактный, 2МГц | 0xA |
Выход, альтернативная функция, двухтактный, 50МГц | 0xB |
Выход, альтернативная функция, открытый сток, 10МГц | 0xD |
Выход, альтернативная функция, открытый сток, 2МГц | 0xE |
Выход, альтернативная функция, открытый сток, 50МГц | 0xF |
Конфигурационное значение | Режим работы вывода |
0x0 | Вход аналоговый |
0x1 | Выход, основная функция, двухтактный, 10МГц |
0x2 | Выход, основная функция, двухтактный, 2МГц |
0x3 | Выход, основная функция, двухтактный, 50МГц |
0x4 | Вход цифровой плавающий |
0x5 | Выход, основная функция, открытый сток, 10МГц |
0x6 | Выход, основная функция, открытый сток, 2МГц |
0x7 | Выход, основная функция, открытый сток, 50МГц |
0x8 | Вход цифровой с подтяжкой |
0x9 | Выход, альтернативная функция, двухтактный, 10МГц |
0xA | Выход, альтернативная функция, двухтактный, 2МГц |
0xB | Выход, альтернативная функция, двухтактный, 50МГц |
0xC | X |
0xD | Выход, альтернативная функция, открытый сток, 10МГц |
0xE | Выход, альтернативная функция, открытый сток, 2МГц |
0xF | Выход, альтернативная функция, открытый сток, 50МГц |
Если мы хотим изменить конфигурацию только одного или нескольких выводов, не трогая остальных, делаем это как обычно, в два этапа: сначала сбрасываем все биты изменяемых битовых полей (оператором &), а затем устанавливаем новое значение полей (оператором | или + ). При этом есть смысл воспользоваться дополнительной переменной для вычислений. Настроим PC9 как в предыдущем примере, при этом настройку остальных выводов не будем изменять:
Существует более короткий в записи вариант без промежуточной переменной, но его в данном случае лучше не использовать:
А так можно, это полностью эквивалентно варианту с промежуточной переменной:
Пример программы
Итак, обещанная программа для зажигания светодиода, подключенного анодом через резистор к PC9.
Выполняя программу по шагам с помощью отладчика, можно наблюдать за поведением светодиода. В данном случае он является индикатором состояния выхода PC9, которым мы управляем с помощью регистров порта.
Неиспользуемые выводы
С другой стороны, обладая высоким входным сопротивлением, неподключённые входы очень подвержены воздействию помех. Диодная защита на входе предотвратит его повреждение от воздействия помех с напряжением выше допустимого значения, но не препятствует переключению логических элементов под действием этих помех, что приводит к росту потребляемой мощности.
Не забываем о том, что в любом случае, прежде чем настраивать конфигурацию портов, следует включить их тактовый сигнал. После настройки, тактовый сигнал неиспользуемых портов следует отключить для уменьшения потребляемой мощности.
Защита выводов от перегрузки
Для того чтобы ограничить ток через выводы микроконтроллера при ошибочном подключении к внешним элементам схемы, можно использовать включение через ограничивающие ток резисторы. Максимальный ток для большинства выводов микроконтроллеров STM32F100xx составляет 25 мА. Так что резистор сопротивлением 200 Ом защитит вывод от перегрузки как в случае закорачивания линии на землю, так и при случайном подключении линии к источнику питания до 5 В (для FT-выводов) или к источнику VDD (для не FT-выводов). Если принять ёмкость нагрузки равной 50 пФ, то получившаяся RC-цепь будет иметь постоянную времени 10 нс. Поэтому описанная защита не годится для выводов, которые должны работать с высокочастотными сигналами. Если есть угроза случайного подключения не FT-вывода к источнику +5 В, сопротивление резистора должно быть выбрано с учётом максимально допустимого инжекционного тока. Например, при напряжении питания 3.3 В, максимальном инжекционном токе 5 мА, принимая падение напряжения на защитном диоде имеющим порядок 0.5 В, получаем, что требуется резистор с сопротивлением, как минимум 240 Ом.
Рис. %img:prt
На рисунке под I подразумевается сила тока по модулю. Обычно направленный к микросхеме (втекающий) ток считается положительным, а вытекающий ток считается имеющим отрицательное значение.
В окончательном устройстве, при наличии связей с другими устройствами, вероятно, потребуется предусмотреть более серьёзные меры защиты от неблагоприятных внешних воздействий, но на этапе макетирования и отладки, простейшая защита вполне способна спасти от многих ошибок.