Функции HAL для работы с портами STM32

Рассмотрим в данной статье функции HAL для работы с портами STM32. Функции библиотеки HAL рассмотрим на примере проекта для отладочной платы STM32F407VET6. На мой взгляд изучать микроконтроллеры и функции HAL лучше на примере какого либо проекта. Тогда в памяти быстрее отложится изучаемый материал и пригодится в будущих разработках.

В нашем проекте будем по нажатию кнопки зажигать светодиод, при последующим нажатии светодиод будем гасить.

Обратимся к схеме отладочной платы STM32F407VET6, как мы видим, светодиод подключен к ножке PA6 и PA7. В программе будем использовать PA7. Так же из схемы мы видим, что у нас 3 кнопки. В программе будем использовать кнопку подключенную к контакту PE4.

Светодиод и кнопки в отладочной схеме STM32F407VET6

Настройка портов STM32 в CubeMX

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

Настройка контакта светодиода PA7

Обратите внимание, что начальный уровень сигнала High, но светодиод погашен. Т.е. наш светодиод включается низким уровнем на контакте.

Теперь посмотрим настройку контакта кнопки:

Так как наша кнопка срабатывает по низкому уровню сигнала, то начальный уровень на контакте высокий.

Сконфигурировав наши контакты генерируем код и открываем его в CubeIDE. Все основные настройки для работы с кнопкой и светодиодом за нас установит CubeMX. Останется только написать код в функции main.

#include "stdbool.h"        // Подключаем библиотеку для работы с типом bool
bool btnClick = false;      // глобальная переменная, флаг нажатия кнопки
 while (1)
  {
        //пока кнопка нажата, находимся в цикле while 
	while (!HAL_GPIO_ReadPin(GPIOE, Button_PE4_Pin))
	{
		btnClick = true;  // отмечаем что кнопка нажата
	}

       // если кнопка была нажата, меняем ее состояние на противоположное и сбрасываем флаг нажатия
	if (btnClick)
	{
		HAL_GPIO_TogglePin(GPIOA, LED_A7_Pin);
		btnClick = false;
	}
  }

Скачать весь текст программы для CubeMx и CubeIDE можно здесь.

Видео демонстрации программы:

Функция HAL для STM32. Порты ввода-вывода.

Рассмотрим подробно все функции HAL для работы с портами STM32.

GPIO_PinState HAL_GPIO_ReadPin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)

Функция HAL: HAL_GPIO_ReadPin. Данная функция позволяет прочитать состояние контакта порта.

  • GPIOx — принимает используемый порт (GPIOA, GPIOB, GPIOC … );
  • GPIO_Pin – здесь указываем какая ножка порта используется (0..15).
void HAL_GPIO_WritePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)

Следующая функция HAL: HAL_GPIO_WritePin. Функция записи в порт высокого или низкого уровня.

  • GPIOx — принимает используемый порт (GPIOA, GPIOB, GPIOC … );
  • GPIO_Pin – здесь указываем какая ножка порта используется (0..15).
  • GPIO_PinState – уровень сигнала для установки. Принимает следующие значения:
    GPIO_PIN_RESET: низкий уровень;
    GPIO_PIN_SET: высокий уровень.
    Так же можно записать числами 0 — низкий уровень, 1 — высокий уровень.
void HAL_GPIO_TogglePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)

Функция HAL: HAL_GPIO_TogglePin. С помощью этой функции можно сменить состояние уровня контакта на противоположное.

  • GPIOx — принимает используемый порт (GPIOA, GPIOB, GPIOC … );
  • GPIO_Pin – здесь указываем какая ножка порта используется (0..15).
HAL_StatusTypeDef HAL_GPIO_LockPin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)

Функция HAL: HAL_GPIO_LockPin. Эта функция ставит блокировку регистров настройки порта.

  • GPIOx — принимает используемый порт (GPIOA, GPIOB, GPIOC … );
  • GPIO_Pin – здесь указываем какая ножка порта используется (0..15).

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

void HAL_GPIO_Init (GPIO_TypeDef * GPIOx, GPIO_InitTypeDef * GPIO_Init)

Функция HAL: HAL_GPIO_Init. Функция инициализации портов.

  • GPIOx – Принимает используемый порт (GPIOA, GPIOB, GPIOC … )
  • GPIO_Init – передаем указатель на структуру инициализации порта типа GPIO_InitTypeDef.

Структура имеет следующий вид:

typedef struct
{
   uint32_t Pin;    // Номер вывода
   uint32_t Mode;   // Режим
   uint32_t Pull;   // Режим подтягивающего резистора
   uint32_t Speed;  // Скорость переключения выходного сигнала
} GPIO_InitTypeDef;
  • Pin — номер вывода. Может принимать значения: GPIO_PIN_0…GPIO_PIN_15, GPIO_PIN_ALL или GPIO_PIN_MASK.
    • GPIO_PIN_MASK — маска на несколько контактов (например: GPIO_PIN_1 | GPIO_PIN_8 | GPIO_PIN_14 ).
  • Mode — режим вывода.
    • GPIO_MODE_INPUT — свободный вход, брошенный в воздухе.
    • GPIO_MODE_OUTPUT_PP — активный выход (Push Pull).
    • GPIO_MODE_OUTPUT_OD — выход с общим стоком.
    • GPIO_MODE_AF_PP — активный выход альтернативной функции.
    • GPIO_MODE_AF_OD — выход с общим стоком альтернативной функции.
    • GPIO_MODE_AF_INPUT — вход альтернативной функции.
    • GPIO_MODE_ANALOG — аналоговый выход.
    • GPIO_MODE_IT_RISING — внешнее прерывание по положительному фронту.
    • GPIO_MODE_IT_FALLING — внешнее прерывание по отрицательному фронту.
    • GPIO_MODE_IT_RISSING_FALLING — внешнее прерывание по положительному/отрицательному фронту.
    • GPIO_MODE_EVT_RISING — внешнее событие по положительному фронту.
    • GPIO_MODE_EVT_FALLING — внешнее событие по отрицательному фронту.
    • GPIO_MODE_EVT_RISING_FALLING — внешнее событие по положительному/отрицательному фронту.
  • Pull — режим подтягивающего резистора.
    • GPIO_NOPULL — резистор отключен.
    • GPIO_PULLUP — резистор подключен к шине питания.
    • GPIO_PULLDOWN — резистор подключен к земле.
  • Speed — максимальное быстродействие переключения выходного сигнала.
    • GPIO_SPEED_FREQ_LOW — низкая.
    • GPIO_SPEED_FREQ_MEDIUM — средняя.
    • GPIO_SPEED_FREQ_HIGH — высокая.
void HAL_GPIO_DeInit (GPIO_TypeDef * GPIOx, uint32_t GPIO_Pin)

Функция HAL: HAL_GPIO_DeInit. Деинициализирует вывод. Или по другому, сбрасывает настройки контакта до состояния сброса микроконтроллера STM32.

  • GPIOx — принимает используемый порт (GPIOA, GPIOB, GPIOC … );
  • GPIO_Pin – здесь указываем какая ножка порта используется (0..15).

Заметка.
Последние две функции генерирует CubeMX, так что с ними можно только ознакомиться для полного понимания работы с портами ввода — вывода.

Документация

Где купить?

  • Отладочная плата STM32F407VET6
5 1 голос
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии