Главная » Микроконтроллеры
Призовой фонд
на октябрь 2017 г.
1. Термометр Relsib WT51
Рэлсиб
2. 1000 руб
PCBWay
3. Регулируемый паяльник 60 Вт
Паяльник
4. 100 руб.
От пользователей

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

AVR-программатор USB ASP
AVR-программатор USB ASP
Конструктор УНЧ 60 Вт на LM3886 Паяльная станция Hakko 936
вверх