Главная » Микроконтроллеры
Призовой фонд
на август 2017 г.
1. Регулируемый паяльник 60 Вт
Паяльник
2. Тестер компонентов LCR-T4
Паяльник
3. 350 руб.
От пользователей

STM8. Урок 3. Описание GPIO и библиотека SPL

Управление портами GPIO осуществляется с помощью 5 регистров: 

  1. Px_ODR  - вывод логического уровня в порт
  2. Px_IDR   - чтение логического уровня порта 
  3. Px_DDR  - настройка порта на вход или выход
  4. Px_CR1   - настройка дополнительных параметров 1
  5. Px_CR2  - настройка дополнительных параметров 2

Порты 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.

Прикрепленные файлы:

Теги:

Опубликована: 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (4) | Я собрал (0) | Подписаться

0
BARS_ #
Лепить SPL в 8-битник высший уровень извращения. Там без SPL код короче получится.
Ответить
0

[Автор]
Aleksey1408 #
Да, код получается короче, только смысл экономить флеш память, если код не будет занимать максимум 10% от объема флеша. Объем МК 32кБ максимальный объем который я затрачивал на флеш был около 8кБ при использовании RTOS OSA и stdio.h. Использование SPL на мой взгляд самый оптимальный способ работы с контроллером. Посмотрите регистры - они специально проектированы для использования языка СИ. Хотите прогать через битовые маски - милости просим в AVR. Я в свободное от работы время накропал библиотеку наподобие SPL для таймеров и АЦП и очень доволен. Жалею что библиотеку на подобие SPL не выпустил ATMEL
Ответить
0
BARS_ #
Я и в STM32 программлю через маски. Благо для этого заголовочник очень хорошо заточен, как и в STM8. На мой взгляд SPL - это худшее, что можно было сделать для МК. Без них и код понятнее.
Ответить
0

[Автор]
Aleksey1408 #
А в чем худшее? Один-два раза можно попробывать через маски, а потом зачем. Код становиться понятнее через маски? SPL - это большой прорыв вперед в программировании МК. Программирование МК начинает быть похоже на программирование в обычной среде с помощью API. SPL - это то чего не хватало для AVR. Зачем перечитывать мануал, если можно просто посмотреть SPL и выбрать то, требуется. Во-вторых SPL используют даже профессиональные программисты МК, а для начинающих возможностей SPL хватить на 100%. Во-всяком случае это лучше, чем Arduino.
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется сила тока?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Pickit 2 - USB-программатор PIC-микроконтроллеров
Pickit 2 - USB-программатор PIC-микроконтроллеров
LC-измеритель LC100-A iMAX B6 - зарядное для Lion, LiPo, LiFe, Pb, NiCd и NiMH аккумуляторов
вверх