Микроконтроллеры

Порты микроконтроллеров STM32

Основные регистры порта ввода/вывода микроконтроллера STM32

Под портом понимается определенный именованный набор ног микроконтроллера. В STM микроконтроллерах они именуются как GPIOA,GPIOB,GPIOC и т.д. Порты ввода/вывода в микроконтроллерах STM32 имеют, как правило, по 16 линий (ног). Под линией понимается та или иная ножка микроконтроллера. Каждая линия порта может быть сконфигурирована определенным образом и выполнять следующие функции:

  • цифрового ввода;
  • цифрового вывода;
  • входа внешнего прерывания;
  • функцию ввода/вывода других модулей микроконтроллера.

Сконфигурировать порт на нужный режим работы можно использую регистры микроконтроллера. К этим регистрам можно обращаться напрямую, а также использовать специальные методы из библиотеки периферий.

Давайте рассмотрим основные регистры необходимые для работы с портами ввода/вывода.

Регистры отвечающие за конфигурацию порта

Прежде чем начать работу с портом вывода его нужно сконфигурировать под ваши нужды.

За настройку или конфигурацию порта отвечают регистры конфигурации. В микроконтроллерах семейства STM32F302xx, STM32F303xx и STM32F313xx это следующие регистры:

  • GPIOx_MODER;
  • GPIOx_OTYPER;
  • GPIOx_OSPEEDR;
  • GPIOx_PUPDR.

Регистр GPIOx_MODER (где x=A...F)

регистр режима работы

Это 32-х битный регистр отвечает за режим работы линии. Для конфигурации опеределенной линии требует 2 бита. Возможны следующие комбинации:

  • 00 - линия настроена на вход;
  • 01 - на выход;
  • 10- режим альтернативной функции;
  • 11 - аналоговый режим.

Регистр GPIOx_TYPER (где x=A...F)

Данный регистр используеться для настройки типа работы линии использует в работе 16 бит остальные 16 зарезервированны. Принемает следующие значения:

  • 0 - пуш пульнай режим;
  • 1 - открытый сток

Регистр GPIOx_PUPDR (где x=A...F)

Данные регистр отвечает за подтяжку. Принемает следующие значения:

  • 00 - без подтяжки
  • 01 - подтяжка к плюсу питания
  • 10 - подтяжка к земле

Регистр GPIOx_SPEEDR (где x=A...F)

Регистр настройки скорости работы линии.

  • 00 - 2 МГц;
  • 01 - 10 МГц;
  • 10 - 50 МГц.

Регистр вывода (выходной регистр) 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);

Который принимает два значение первый это собственно сам порт который нам необходимо включить, а второй это состояние данного порта, включен или выключен.

Далее объявляем структуру, и производим ее настройку. 

Добавить комментарий


Защитный код
Обновить

Последние комментарии

Последнии темы форума

  • Нет сообщений для показа