Управление портами GPIO осуществляется с помощью 5 регистров:
Порты GPIO, в отличии от периферии, не нуждается в настройке тактирования.
Пока прочитаешь текст настройки порта можно забыть что было в начала. Приведу графическую схему настройки порта.
Итак, настройка порта начинается с выбора направления пина на вход или выход. Если мы выберем настройку ПИНа на выход, то необходимо выбрать режим выхода. Существует два вида выхода: Открытый сток или Тяни-толкай. Открытый сток необходим для программной реализации протоколов I2C, 1-Wire. Дополнительные настройки режима выхода: скорость нарастания фронта и начальный логический уровень.
При настройке ПИНа на вход можно настроить подтягивающий резистор и настроить порт на внешнее прерывание.
Опишем основные функции библиотеки SPL stm8l15x_gpio.h/c.
Функции настройки GPIO:
void GPIO_DeInit(GPIO_TypeDef* GPIOx); — Сброс всех регистров порта к 0 значениям.
void GPIO_Init(GPIO_TypeDef* GPIOx, uint8_t GPIO_Pin, GPIO_Mode_TypeDef GPIO_Mode); — Настройка порта на один из режимов описанных в типе GPIO_Mode_TypeDef.
typedef enum
{
GPIO_Mode_In_FL_No_IT = (uint8_t)0x00, /*!< Вход без подтяг. резистора, без внешних прерываний */
GPIO_Mode_In_PU_No_IT = (uint8_t)0x40, /*!< Вход с подтяг. резистором, без внешних прерываний */
GPIO_Mode_In_FL_IT = (uint8_t)0x20, /*!< Вход без подтяг. резистора, с внеш. прерываниями */
GPIO_Mode_In_PU_IT = (uint8_t)0x60, /*!< Вход с подтяг. резистором, с внеш. прерываниями */
GPIO_Mode_Out_OD_Low_Fast = (uint8_t)0xA0, /*!< Открытый сток, низкий уровень выхода, 10MHz */
GPIO_Mode_Out_PP_Low_Fast = (uint8_t)0xE0, /*!< Тяни толкай, низкий уровень выхода, 10MHz */
GPIO_Mode_Out_OD_Low_Slow = (uint8_t)0x80, /*!< Открытый сток, низкий уровень выхода, 2MHz */
GPIO_Mode_Out_PP_Low_Slow = (uint8_t)0xC0, /*!< Тяни толкай, низкий уровень выхода, 2MHz */
GPIO_Mode_Out_OD_HiZ_Fast = (uint8_t)0xB0, /*!< Открытый сток, плавающий вход, 10MHz */
GPIO_Mode_Out_PP_High_Fast = (uint8_t)0xF0, /*!< Тяни толкай, высокий уровень выхода, 10MHz */
GPIO_Mode_Out_OD_HiZ_Slow = (uint8_t)0x90, /*!< Открытый сток, плавающий вход, 2MHz */
GPIO_Mode_Out_PP_High_Slow = (uint8_t)0xD0 /*!< Тяни толкай, высокий уровень выхода, 2MHz */
}GPIO_Mode_TypeDef;
void GPIO_ExternalPullUpConfig(GPIO_TypeDef* GPIOx, uint8_t GPIO_Pin, FunctionalState NewState); — функция необходима для настойки подтягивающего резистора в режиме ВХОДА.
Далее следуют функции необходимые для настройки логического уровня и чтения логического уровня.
void GPIO_Write(GPIO_TypeDef* GPIOx, uint8_t GPIO_PortVal); — запись данных в целый порт
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin, BitAction GPIO_BitVal); — запись выского или низкого уровня в выбранный Пин (Пины*).
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint8_t GPIO_Pin); — настраиваем высокий логический уровень на выбранном Порту и Пине (Пинах*)
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint8_t GPIO_Pin); — настраиваем низкий логический уровень на выбранном Порту и Пине (Пинах*)
void GPIO_ToggleBits(GPIO_TypeDef* GPIOx, uint8_t GPIO_Pin); — переключаем выбранный порт и пин(пины*) выхода на противоположенное значение.
*Для того, чтобы выбрать несколько пинов необходима следующая запись: GPIO_Pin_0|GPIO_Pin_6. Здесь мы выбрали два пина 0 и 6.
Функции для чтения данных:
uint8_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx); — чтение логического уровня всего порта
BitStatus GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin); — чтение логического уровня выбранного пина. Если уровень низкий значение функции будет 0, иначе будет отличное значение.
Спасибо за внимание. Надеюсь, что данный материал будет полезным. К статье прикрепляю файл word c рисунком настройки GPIO.
Прикрепленные файлы:
- GPIO.docx (26 Кб)