Под портом понимается определенный именованный набор ног микроконтроллера. В STM микроконтроллерах они именуются как GPIOA,GPIOB,GPIOC и т.д. Порты ввода/вывода в микроконтроллерах STM32 имеют, как правило, по 16 линий (ног). Под линией понимается та или иная ножка микроконтроллера. Каждая линия порта может быть сконфигурирована определенным образом и выполнять следующие функции:
Сконфигурировать порт на нужный режим работы можно использую регистры микроконтроллера. К этим регистрам можно обращаться напрямую, а также использовать специальные методы из библиотеки периферий.
Давайте рассмотрим основные регистры необходимые для работы с портами ввода/вывода.
Прежде чем начать работу с портом вывода его нужно сконфигурировать под ваши нужды.
За настройку или конфигурацию порта отвечают регистры конфигурации. В микроконтроллерах семейства STM32F302xx, STM32F303xx и STM32F313xx это следующие регистры:
Регистр GPIOx_MODER (где x=A...F)
Это 32-х битный регистр отвечает за режим работы линии. Для конфигурации опеределенной линии требует 2 бита. Возможны следующие комбинации:
Регистр GPIOx_TYPER (где x=A...F)
Данный регистр используеться для настройки типа работы линии использует в работе 16 бит остальные 16 зарезервированны. Принемает следующие значения:
Регистр GPIOx_PUPDR (где x=A...F)
Данные регистр отвечает за подтяжку. Принемает следующие значения:
Регистр GPIOx_SPEEDR (где x=A...F)
Регистр настройки скорости работы линии.
Регистр вывода (выходной регистр) GPIOx_ODR (где x=A…F) – output data register
Данный регистр используется для вывода данных в порт. При записи определенных значений в данный регистр на линии (ножке) устанавливается аналогичное значение. Так как у нас 16 линий а регистр имеет 32 бита, то используются только первые (младшие) 16 бит.
Регистр ввода (регистр состояния порта или входных данных) GPIOx_IDR (где x=A…F) – input data register
Данный регистр доступен только для чтения. Своего рода индикатор состояния порта. Аналог PINxв микроконтроллерах серии AVR.
Регистр побитовой установки выходного порта GPIOx_BSRR
Данный регистр побитно устанавливает состояние ножки в порте вывода.
Подробнее о всех регистрах конкретного микроконтроллера можно узнать в referens manual.pdf который можно скачать с официального сайт www.st.com
Также порт можно настроить при помощи специальной библиотеки, в которой находятся разные методы для работы с регистрами ввода/вывода, а также объявлены специальные переменные. Данная библиотека освобождает программиста от необходимости «вручную» вычислять какое значение нужно записать в тот или иной регистр.
Рассмотрим пример кода включающий светодиод
#include "stm32f30x.h" // Device header
#include "stm32f30x_rcc.h"
#include "stm32f30x_gpio.h"
void init_led(void)
{
RCC_APB2PeriphClockCmd (GPIOE,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; //Задаем максимальную скорость
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //Режим выход
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //Указываем ножку к которой присоединен светодиод
GPIO_Init(GPIOE,GPIO_InitStructure); // Инициальзация структуры
}
int main(void)
{
init_led();
GPIO_SetBits(GPIOE,GPIO_Pin_8); //Кстанавливаем высокое состояние на ножке
while(1)
{
_NOP();
}
}
В целях экономии электроэнергии, вся периферия у микроконтроллеров отключена. Для того чтобы «активировать» ту или иную периферию необходимо для начала подать на него тактовые сигналы.
Мы работаем с портом GPIOE поэтому нам необходимо включить тактирование при помощи метода
RCC_APB2PeriphClockCmd (uint32_t RCC_APB2Periph, FunctionalState NewState);
Который принимает два значение первый это собственно сам порт который нам необходимо включить, а второй это состояние данного порта, включен или выключен.
Далее объявляем структуру, и производим ее настройку.