PROGCONT.RU

Форма входа







Регистрпция Вход/

STM8S GPIO или порты ввода-вывода.

 Прежде чем творить с контроллером вы обязательно загляните в следующую таблицу, которая находится в описании контроллера(datasheet) и зависит от вида корпуса, в моем случае LQFP32(STM8S903K3).

нет рисунка

Колонка:
 SDIP32 и LQFP/UFQFP32-виды корпусов, в нашем случае второй вариант.
 Pin name-Название или функция вывода.
 Type-Назначение: I/O-может быть как входом так и выходом; S-выводы необходимые для работы контролера.
 Input-floating-Если крестик то возможно использовать как болтающийся вход(не подтянут к земле или питанию), прочерк нет такой возможности.
 Input-wpu-Если крестик то возможно вывод подтянуть через внутренний резистор к питанию, прочерк нельзя.
 Input-Ext. interrupt-Если крестик возможно установить внешнее прерывание на этом выводе, при переходе с высокого на низкий уровень или наоборот, прочерк нет прерывания.
 Output-High sink-Если крестик выдерживает ток 20mA но не больше на 4 выводах одновременно, прочерк не более 10mA, смотрите таблицы Output driving current (standard ports), Output driving current (true open drain ports), Output driving current (high sink ports).
 Output-Speed-Максимальные скорости на которых может работать порт(успевать менять уровни), O1-Slow до 2MHz, O2-Fast 10MHz, O3-Fast/slow выбирается программно slow после сброса, O4-Fast/slow выбирается программно fast после сброса.
 Output-OD-Крестик есть режим open-drain(внутренний транзистор открывается только на землю), T-используется только как open-drain(на этом выводе отсутствуют P-buffer, weak pull-up, и защитный диод к VDD), прочерк не используется как open-drain.
 Output-PP-Крестик есть P-buffer(подключается к питанию или к земле), прочерк не может подключаться к питанию.
 Main function(after reset)-Функцию которую будет выполнять вывод после сброса.
 Default alternate function-Альтернативная функция по умолчанию.
 Alternate function after remap[option bit]-Альтернативная функция после переназначения.

 Теперь что нужно знать про электрические параметры это то, что напряжение, на котором может работать контроллер минимум 2.95 и максимум 5.5 вольт, параметры по току смотрим ниже таблицу.

нет рисунка

Строка:
I VDDI-максимальные токи входящие в контролер.
I VSSO-максимальные токи выходящие из контролера.
I IO-максимальный входящий(Output current sunk by any I/O and control pin) и выходящий(Output current source by any I/Os and control pin) ток вывода I/O
I INJ(PIN)-первая строка(Injected current on any pin) проникающие токи которые нельзя превышать(токи которые возникают на выводе если напряжение опустится ниже земли или выше питания но превышающая максимальные параметры), вторая строка(Injected current on OSCIN pin) максимальные проникающие токи для вывода OSCIN и третья строка(Injected current on any other pin) все остальные выводы.
∑I INJ(PIN)-сумма всех проникающих токов.
 Еще подчеркну что все выводы в этой таблице выдерживают как входящий так и выходящий ток 20mA, что бы не спалить контроллер ознакомитесь со следующими таблицами Output driving current (standard ports), Output driving current (true open drain ports), Output driving current (high sink ports).

Посмотрите схему, что бы понять как работает вывод.

нет рисунка

 Внимание, все выводы после включения или сброса контроллера настроены как Floating input(или как GPIO_MODE_IN_FL_NO_IT)!

 Приступим к работе с библиотекой SPL, информация бралось из файла stm8s_gpio.h.
Начнем с функции настройки порта GPIO_Init(GPIOx, GPIO_Pin, GPIO_Mode);
Где:
GPIOx-Имя порта A,B,C,D или E;
GPIO_Pin-Номер вывода порта 0-7;
GPIO_Mode-Режим для вывода, возможны следующие варианты.
GPIO_MODE_IN_FL_NO_IT-пин настроен как болтающийся(не подтянут к земле или питанию) вход, прерывание выключено если имеется.
GPIO_MODE_IN_PU_NO_IT-пин настроен как вход подтянутый к питанию через резистор, прерывание выключено если имеется.
GPIO_MODE_IN_FL_IT-пин настроен как болтающийся(не подтянут к земле или питанию) вход, прерывание включено если имеется.
GPIO_MODE_IN_PU_IT-пин настроен как вход подтянутый к питанию через резистор, прерывание включено если имеется.
GPIO_MODE_OUT_OD_LOW_FAST-пин настроем как выход открывается только на землю, зразу установлен низкий уровень и с максимальной скоростью переключения 10 MHz.
GPIO_MODE_OUT_PP_LOW_FAST-пин настроем как выход подключатся к питанию или земле, зразу установлен низкий уровень и с максимальной скоростью переключения 10 MHz.
GPIO_MODE_OUT_OD_LOW_SLOW-пин настроем как выход открывается только на землю, с максимальной скоростью переключения 2 MHz.
GPIO_MODE_OUT_PP_LOW_SLOW-пин настроем как выход подключатся к питанию или земле, зразу установлен низкий уровень и с максимальной скоростью переключения 2 MHz.
Ниже 4 режима аналогичны предыдущим только после настройки на этих пинах будет высокий уровень.
GPIO_MODE_OUT_OD_HIZ_FAST
GPIO_MODE_OUT_PP_HIGH_FAST
GPIO_MODE_OUT_OD_HIZ_SLOW
GPIO_MODE_OUT_PP_HIGH_SLOW

Скоростью переключения это своего рода защита соседних пинов от наводок, при режиме 10 MHz переход вывода с низкого на высокий уровень или на оборот будет происходить быстрее чем 2 MHz, поэтому индуктивная наводка будет больше влиять на соседние ноги контроллера, это будет вредить например если вы используете ADC(аналого-цифровой преобразователь) на соседних пинах.

 Теперь практика.

/*Порт А, пин 4 настроен как выход с подключению к питанию и земле, после настройки на нем будет низкий уровень, скорость переключения до 10 MHz.*/
GPIO_Init( GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);

GPIO_Write(GPIOx, PortVal)-Записывает в порт(GPIOx) восьмибитное значение (PortVal).
Например что бы выставить высокий уровень порта А, пин 3 нужно выполнить.

GPIO_Write( GPIOA, 8);

GPIO_WriteHigh( GPIOx, PortPins)-Выставляет высокий уровень в порту(GPIOx)
GPIO_WriteLow( GPIOx, PortPins)-Выставляет низкий уровень в порту(GPIOx)
на пине(GPIO_PIN_0-7 пин от 0 до 7, GPIO_PIN_LNIB младший полубайт, GPIO_PIN_HNIB старший полубайт, GPIO_PIN_ALL все пины).

//Устанавливает высокий уровень порт A, пин 3.
GPIO_WriteHigh( GPIOA, GPIO_PIN_3);
//Устанавливает низкий уровень порт A, пин 3.
GPIO_WriteLow( GPIOA, GPIO_PIN_3);

GPIO_WriteReverse( GPIOx, PortPins)-Меняет состояние пина на противоположный, полезна для мигание светодиодом, параметры как у предыдущей функции.

//Если высокий уровень на пине, то после выполнения будет низкий.
GPIO_WriteReverse( GPIOA, GPIO_PIN_3);
//И наоборот.
GPIO_WriteReverse( GPIOA, GPIO_PIN_3);

GPIO_ReadInputData( GPIOx)-Возвращает восьмибитное значение порта.

/*Проверяем значение порта, если к порту GPIOA пину 3 подвели питание то будет срабатывать условие.*/
if(GPIO_ReadInputData( GPIOA)==8){ //Тут то, что надо выполнить. }

GPIO_ReadOutputData( GPIOx)-Функция похожа на предыдущую только прочтет порт, если он настроен как выход, не знаю, зачем проверять то, что мы туда установили.

GPIO_ReadInputPin( GPIOx, GPIO_Pin)-Проверяет состояние пина, если на нем высокий уровень возвращает 1, низкий 0.

if(GPIO_ReadInputPin( GPIOA, GPIO_PIN_3)){
//Тут то, что надо выполнить если на пине высокий уровень.
}
if(!GPIO_ReadInputPin( GPIOA, GPIO_PIN_3)){
//Тут то, что надо выполнить если на пине низкий уровень.
}

GPIO_ExternalPullUpConfig( GPIOx, GPIO_Pin, NewState)-Если NewState буде DISABLE то отключает внутренний подтягивающий резистор, ENABLE включает.

//GPIOA пину 3 подключили внутренний подтягивающий резистор.
GPIO_ExternalPullUpConfig( GPIOA, GPIO_PIN_3, ENABLE);

 Не большая программа, пример работы пинов как на вход та и на выход.

#include "stm8s.h"
int main( void ){
//Порт GPIOC пин GPIO_PIN_3 работает как вход с подтягивающим резистором.
GPIO_Init(GPIOC, GPIO_PIN_3, GPIO_MODE_IN_PU_NO_IT);
//Порт GPIOC пин GPIO_PIN_4 работает как выход с подключение к питанию или земле.
GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_OUT_PP_LOW_SLOW);
while(1){
/*GPIOC, GPIO_PIN_3 если не подключен к земле то на GPIOC, GPIO_PIN_4 будет высокий уровень.*/
if(GPIO_ReadInputPin( GPIOC, GPIO_PIN_3)){
GPIO_WriteHigh( GPIOC, GPIO_PIN_4);
}
/*GPIOC, GPIO_PIN_3 подключен к земле на GPIOC, GPIO_PIN_4 будет низкий уровень.*/
if(!GPIO_ReadInputPin( GPIOC, GPIO_PIN_3)){
GPIO_WriteLow( GPIOC, GPIO_PIN_4);
}
}
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
{
while (1){}
}
#endif

 Осталось поговорить про переназначение(remap) выводов контроллера, буду объяснять на примере IAR.
Смотрим описание контроллера.

нет рисунка

 Внимание, отладочная плата или контроллер должны быть подключены к компилятору.
Жмем вверху компилятора IAR на ST-LINK, выскочит список, выбираем Option Bytes..., появится следующий список.

нет рисунка Что бы получить на выводе PC6 функцию Timer 1 channel 1 нужно поменять AFR0(у каждой функции свой Option Bit, указывается рядом с функцией) с Default на Alternate Active(правая кнопка мыши) и жмем на OK.
 Иногда попадается вот такой [AFR1:0] тут надо менять AFR1 и AFR0 на Alternate Active, переназначенная функция остается даже после сброса, пока вы не переназначите аналогичным способом.


Комментариев нет  Только зарегистрированные пользователи могут оставлять комментарии!