3. STM32. Программирование STM32F103. GPIO

В предыдущей статье мы рассматривали простенькую программу, которая мигает светодиодом. Немного модифицируем ее и попробуем разобраться, как настроить выводы микроконтроллера для работы на вход и выход. C13 настроим как выход. К нему подключен светодиод на тестовой плате. B0 настроим на вход и подключим к нему кнопку. В нажатом положении кнопка должна замыкать ногу B0 на землю.

STM32F103_GPIO

Код программы

Прежде всего рассмотрим, что мы инклудим:

stm32f10x.h — касается конкретной серии микроконтроллера; stm32f10x_gpio.h — касается GPIO выводов портов, с чем мы и будем работать; stm32f10x_rcc.h — А это что такое? Дело в том, что у STM32 все модули (GPIO, ADC, EXTI, USART, I 2 C, SPI, и другие) после включения микроконтроллера отключены от тактирования. И мы должны программно включать тактирование той периферии, которую планируем использовать. Кроме того, мы можем настроить частоту тактирования некоторых модулей отдельно. Подробно о тактировании будет в следующей статье.

Сейчас нам надо усвоить, что перед тем, как использовать то порт, или интерфейс, или какой-нибудь модуль, надо подать на него тактирование. В stm32f10x_rcc.h описаны функции, которые управляют тактированием.

Смотрим в программе строку, включает тактирования порта GPIOC:

Далее выполняем настройку вывода порта. В нашем случае PC13 (на тестовой плате к нему подключен светодиод) настраиваем как выход. Настройка выполняются через структуру GPIO_InitTypeDef.

Наконец можем задать высокий или низкий уровень на выходе PC13:

Когда задаем высокий уровень, светодиод не горит, низкий — горит.

Далее выполняем конфигурацию PB0. Он будет работать как вход с подтяжкой к "1" (GPIO_Mode_IPU). То есть, когда кнопка отпущенная (нога PB0 висит в воздухе), на входе PB0 будет "1".

Состояние кнопки опрашивается функцией:

Программа опрашивает состояние кнопки и мигает светодиодом только когда кнопка отпущенная, то есть когда на входе B0 высокий уровень.

Подключим вместо кнопки датчик движения HC-SR501. Обратите внимание, питания датчика 5В. Теперь светодиод будет мигать, когда сенсор зафиксирует движение. Поздравляю! Теперь можно немного поиграть: помахать перед сенсором движения руками, погонять перед ним кота, собаку, других домашних животных.

DSCN6944 DSCN6932

Памятка

  • GPIO_Pin — номера пинов, которые конфигурируются. Пример для нескольких пинов: GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
  • GPIO_Speed — задает скорость для выбранных пинов. Может принимать следующие значения: GPIO_Speed_10MHz, GPIO_Speed_2MHz, GPIO_Speed_50MHz
  • GPIO_Mode — задает режим работи пинов. Может принимать следующие значения:
  • GPIO_Mode_AIN — аналоговый вход;
  • GPIO_Mode_IN_FLOATING — вход без подтяжки (Float)
  • GPIO_Mode_IPD — вход с подтяжкой к земле (Pull-down)
  • GPIO_Mode_IPU — вход с подтяжкой к питанию (Pull-up)
  • GPIO_Mode_Out_OD — выход с открытым стоком (Open Drain)
  • GPIO_Mode_Out_PP — выход с двумя состояниями (Push-Pull)
  • GPIO_Mode_AF_OD — выход с открытым стоком для альтернативных функций (Alternate Function). Используется когда выводы управляются периферией, которая может быть задействована на этом выводе. Например USART, I 2 C и тому подобное.
  • GPIO_Mode_AF_PP — то же что и перед этим, но с двумя состояниями.

Замечание

Это можно сделать и один раз следующим образом:

Программа будет меньше по размеру. Так обычно и делают. Включают тактирование всем модулям, настраивают все прерывания и так далее. Это правильный путь к оптимизации программы. Но на этапе изучения микроконтроллера, для наглядности, я буду писать именно так, как в этом примере. Чтобы было ясно: что и зачем надо включить и как настроить, чтобы настроить ту или иную периферию. Это будет не всегда рационально, но всегда понятно.


Источник: blog.avislab.com