Урок 6. Порты ввода-вывода STM32.

Уроки 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 – альтернативная функция вывода в режиме открытый сток.
  • Существует система защиты конфигурационных параметров порта. Для ее активизации необходимо выполнить определенную последовательность действий над регистрами конфигурации. Разблокировка происходит только после сброса.
  • В нашем микроконтроллере STM32F103C8T6 существуют 37 портов ввода-вывода:
    • GPIOA – 16 выводов: PA0-PA15;
    • GPIOB – 16 выводов: PB0-PB15;
    • GPIOC – 3 вывода: PC13-PC15;
    • GPIOD – 2 выводов: PD0, PD1.

Распиновка STM32F103C8T6

 

Порты STM32 с аппаратной точки зрения.

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

В документации приводится базовая схема вывода порта.

Базовая схема 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_CRL

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

GPIOx_CRH

На каждый вывод отводится 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

1 0

1 1

0 или 1
Открытый сток 0 1 0 или 1
Выход альтернативной функции Активный выход 1 0 -
Открытый сток 1 1 -
Вход Аналоговый вход 0 0 0 0 -
Свободный вход 0 1 -
Вход, подтяжка к земле 1 0 0
Вход, подтяжка к питанию 1

 

Состояние регистров конфигурации можно защитить от непредусмотренных изменений. Для этого существует регистр блокировки конфигурации.

Регистр блокировки конфигурации порта GPIOx_LCKR  (Port configuration lock register)

GPIOx_LCKR

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

Проверить установлена ли защита конфигурации можно чтением этого же 16-го бита (LCKK). При активированной защите два подряд чтения бита должны дать результат 0, 1.

Доступ к портам происходит через регистры ввода и вывода данных.

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

GPIOx_IDR

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

GPIOx_ODR

Первый доступен только для чтения. Биты IDR0 – IDR15 содержат состояние соответствующих выводов порта.

Запись данных во второй регистр устанавливает состояние выводов порта (ODR0 – ODR15).

Если задан режим вывода – вход, то состояние соответствующего бита ODR0 – ODR15 определяет, куда подключен подтягивающий резистор, к шине питания или земле.

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

Регистр установки/сброса битов GPIOx_BSRR (Port bit set/reset register)

GPIOx_BSRR

Регистр установки/сброса битов разделен на 2 равные части(0-15 и 16-31). Первая предназначена для установки выводов в состояние 1, вторая – в состояние 0.

  • Запись данного с 1 в битах BS0 – BS15 устанавливает соответствующие выводы в состояние высокого уровня.
  • Запись данного с 1 в битах BR0 – BR15 переводит соответствующие выводы в состояние низкого уровня.

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

Регистр сброса битов GPIOx_BRR (Port bit reset register)

GPIOx_BRR

Это 16ти разрядный регистр, который работает точно так, как младшая половина предыдущего регистра установки/сброса.

Запись слова с  1 в битах BR0 – BR15 переводит соответствующие выводы в состояние низкого уровня.

 

Конфигурация портов с помощью STM32CubeMX.

Здесь все просто и понятно. Мы это уже делали.

Давайте настроим вывод PB12 на вход с подтягивающим резистором к шине питания, а PB13 на активный выход.

Закладка System Core -> GPIO.

Правой кнопкой мыши нажимаем на вывод PB12. Выбираем GPIO_Input.

STM32CubeMX

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

STM32CubeMX

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

STM32CubeMX

 

Выбираем строку PB13 и задаем:

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

STM32CubeMX

Я не буду описывать режимы, они очевидны.

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

STM32CubeMX

Проект будем использовать в следующем уроке.

 

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

Предыдущий урок     Список уроков     Следующий урок

0

Автор публикации

не в сети 9 часов

Эдуард

285
Комментарии: 1946Публикации: 198Регистрация: 13-12-2015

22 комментария на «Урок 6. Порты ввода-вывода STM32.»

  1. 1. Вопрос про регистр ввода/вывода и регистр установки/сброса:
    Не понял, чем отличается запись установка состояния выводов через регистр GPIOx_ODR и GPIOx_BSRR
    Я же в обоих случаях могу записать в соответствующие биты 1ы и 0и, которые установят выходы в высокие и низкие состояния. Почему в первом случае нужно что-то считывать,модифицировать,записывать?
    2. Нет ли ошибки в описании регистра BSRR? 2ой пункт: «Запись данного с 1 в битах BR16 – BR31 переводит соответствующие выводы в состояние низкого уровня.»

    0
    • Здравствуйте!
      Запись в регистр ODR изменяет все биты порта. Если вам надо установить, например, 1 в каком-либо разряде порта, то вы должны считать его состояние, установить 1 в нужном разряде и модифицированное данное записать в порт.
      Запись в регистр BSRR изменяет только биты порта, в которые записывается 1.
      Ошибки в описании BSRR нет.

      0
  2. Здравствуйте!
    Вопрос про «Регистр установки/сброса битов GPIOx_BSRR (Port bit set/reset register)»
    Регистр установки/сброса битов разделен на 2 равные части(0-15 и 16-31). Первая предназначена для установки выводов в состояние 1, вторая – в состояние 0.

    Запись данного с 1 в битах BS0 – BS15 устанавливает соответствующие выводы в состояние высокого уровня.
    Запись данного с 1 в битах BR0 – BR15 переводит соответствующие выводы в состояние низкого уровня.

    1)Почему для установки 0 и 1 используются регистр разделенный на 2 равные части (по 16 бит х 2 = 32 бит) а не как в случае с Регистром сброса битов GPIOx_BRR, в котором 16 бит ?
    2)Почему нельзя было сделать регистр от 0 до 15 для установки 0 или 1?
    3)Что будет если например одновременно установить BR15 BS15? Не будет ли это противоречить друг-другу?
    4)Регистр сброса битов GPIOx_BRR. Зачем заново изобретать велосипед если для сброса битов уже есть младшая половина GPIOx_BSRR регистра установки/сброса?

    0
    • Здравствуйте!
      1. Очевидно, чтобы одним обращением к регистру можно было и сбросить и установить нужные биты.
      2. Наверное можно было, но зачем. Можно выполнить только установку через GPIOx_BSRR.
      3. Не знаю. Думаю это некорректная, бессмысленная операция.
      4. Трудно сказать. Зачем-то разработчики выделили операцию сброса.

      0
    • 3) BS имеет приоритет над BR, другими словами если вы устанавливаете 1 в BS0 и BR0, операция установки 1 в BR0 будет проигнорирована.

      0
  3. Здравствуйте!
    Подскажите, как присвоить (считать) входные данные порта, например, PB0…PB7 переменной perem?
    Можно ли так: perem= GPIOB->IDR;?
    Как отбросить «лишние» старшие PB8…PB15 если uint8_t perem;?

    0
    • Здравствуйте!
      Так как вы пишите можно, только лучше явно преобразовать в 8ми битовый формат.
      perem= (uint8_t) GPIOB->IDR;

      0
  4. Здравствуйте!

    Я так понимаю что возможность изменения конфигурации и режимов ВЫВОДОВ портов сделано для того, чтобы можно было к одному выводу подключить два устройства: одно принимает, а другое передаёт, например, только в разное время?

    то есть, есть первоначальная настройка и изменение в процессе работы МК: менять ему назначения(режимы) выводов?

    Это делается для тех кому не хватает выводов(пинов)?

    И можно клацать изменением конфигурации пина хоть на четверти частоты работы процессора? Один такт изменяем, второй отсылаем бит, третий изменяем, четвертый такт принимаем бит? зачем?

    0
    • Здравствуйте!
      Бывают двунаправленные сигналы, которые очень быстро надо переводить из одного уровня в другой, переводить в третье состояние. Например, программная реализация интерфейса I2C.

      0
  5. Здравствуйте! В режиме опен дрейн, какое напряжение может подключаться к выходу?

    0
    • Здравствуйте!
      Разницы никакой. На выводах стоят защитные диоды к 3,3 В или 5 В для толерантных выводов. Значит те же 3,3 В или 5 В.

      0
  6. Отличная статья!
    В вашей статье написано что Analog – аналоговый вход ( вход АЦП, компараторов и т.п.). В настройках каждого порта можно выбрать GPIO_Analog, а на некоторых ADC_IN. В чем разница этих настроек, если аналоговый вход — это тоже вход АЦП?

    0
    • Здравствуйте!
      Настроить GPIO, как аналоговый вход это значит установить элементы порта в состояние, при котором на вход может поступать аналоговый сигнал. Очевидно, запретить работу выходных ключей, отключить подтягивающие резисторы и т.п.
      А для АЦП необходимы другие настройки, других узлов микроконтроллера.

      0
      • Т.е. если я настроил порт как аналоговый (GPIO_Analog), то я не использую в данном случае АЦП.
        Тогда следующий вопрос, как мне прочитать с порта этот аналоговый сигнал?

        0
        • Здравствуйте!
          Почему не используете АЦП. Вы подготавливаете порт для использования АЦП. Даете возможность сигналу с вывода микроконтроллера поступать на вход АЦП. А чтобы считать уровень сигнала надо использовать АЦП.

          0
          • Здравствуйте!
            Ясно, что АЦП задействуется для считывания, но тогда возвращаясь к моему первому вопросу, в чем отличие от порта настроенного как ADC_IN ?

            0
  7. Спасибо большое за труд! Самое доходчивое и внятное объяснение микроконтроллеров stm32. А главное — последовательное!

    0
  8. Output open-drain – выход с открытым стоком. Функционально аналогичен выходу с открытым коллектором. При низком логическом уровне замыкает вывод на землю, при высоком – бросает в воздухе.

    Поправьте, не будет он в воздухе болтаться, там два защитных диода на пине, потому если там не 0 то всегда будет VDD

    0

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Нажимая кнопку "Отправить" Вы даёте свое согласие на обработку введенной персональной информации в соответствии с Федеральным Законом №152-ФЗ от 27.07.2006 "О персональных данных".