Stm32 порты ввода вывода. Порты ввода-вывода STM32: настройка, режимы работы и особенности использования

Как настроить порты ввода-вывода STM32. Какие режимы работы поддерживают GPIO STM32. Особенности и ограничения при работе с портами ввода-вывода STM32. На что обратить внимание при использовании GPIO STM32.

Общая структура и характеристики портов ввода-вывода STM32

Порты ввода-вывода общего назначения (GPIO) являются важной частью микроконтроллеров STM32. Они обеспечивают интерфейс между микроконтроллером и внешним миром, позволяя подключать различные периферийные устройства и датчики. Рассмотрим основные характеристики GPIO в STM32:

  • Каждый порт состоит из 16 выводов (пинов)
  • Поддерживаются различные режимы работы — вход, выход, альтернативные функции
  • Максимальная частота переключения выходов до 50 МГц (зависит от конкретной модели)
  • Поддержка внешних прерываний на всех выводах
  • Возможность программной блокировки конфигурации выводов
  • Поддержка аналогового режима для работы с АЦП/ЦАП

Такая гибкая структура позволяет эффективно использовать GPIO STM32 в различных приложениях. При этом важно правильно настроить и использовать порты ввода-вывода с учетом их особенностей.


Основные режимы работы GPIO STM32

Выводы GPIO STM32 могут работать в следующих основных режимах:

Режим входа

В этом режиме вывод настраивается на прием входных сигналов. Возможны следующие варианты конфигурации входа:

  • Плавающий вход — высокоимпедансное состояние
  • Вход с подтяжкой к питанию
  • Вход с подтяжкой к земле
  • Аналоговый вход (для работы с АЦП)

Режим выхода

При настройке на выход вывод может управлять внешними устройствами. Поддерживаются следующие типы выходов:

  • Push-pull (двухтактный выход)
  • Open-drain (открытый сток)

Также можно задать скорость переключения выхода — 2 МГц, 10 МГц, 50 МГц.

Альтернативные функции

В этом режиме вывод подключается к одному из встроенных периферийных модулей микроконтроллера, например:

  • USART
  • I2C
  • SPI
  • Таймеры

Конкретный набор альтернативных функций зависит от модели STM32.

Особенности настройки GPIO STM32

При работе с портами ввода-вывода STM32 необходимо учитывать следующие особенности:

Включение тактирования

Перед использованием порта необходимо включить его тактирование в регистре RCC. Это делается установкой соответствующего бита в регистре RCC_AHBxENR или RCC_APBxENR.


Конфигурация режима работы

Режим работы каждого вывода задается в регистрах GPIOx_MODER. Для входа и выхода также нужно настроить подтяжку/тип выхода в GPIOx_PUPDR и GPIOx_OTYPER.

Установка скорости

Для выходов следует задать скорость переключения в регистре GPIOx_OSPEEDR. Это влияет на максимальную частоту и фронты сигналов.

Альтернативные функции

При использовании альтернативных функций нужно также настроить мультиплексор в регистрах GPIOx_AFRL и GPIOx_AFRH.

Ограничения при работе с GPIO STM32

При использовании портов ввода-вывода STM32 следует учитывать некоторые ограничения:

  • Не все выводы толерантны к 5В, большинство рассчитаны на 3.3В
  • Максимальный ток на один вывод — 25 мА
  • Суммарный ток всех выводов ограничен (уточняется в документации)
  • Скорость переключения ограничена (до 50 МГц для быстрых выходов)
  • Некоторые выводы имеют дополнительные функции и ограничения

Примеры использования GPIO STM32

Рассмотрим несколько типовых примеров работы с портами ввода-вывода STM32:


Настройка выхода для управления светодиодом

Для управления светодиодом нужно настроить вывод на выход в режиме push-pull:


// Включаем тактирование GPIOA
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;

// Настраиваем PA5 на выход push-pull
GPIOA->MODER |= GPIO_MODER_MODER5_0; 
GPIOA->OTYPER &= ~GPIO_OTYPER_OT_5;

Настройка входа для подключения кнопки

Для подключения кнопки настроим вход с подтяжкой к питанию:


// Включаем тактирование GPIOC
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN;

// Настраиваем PC13 на вход с подтяжкой 
GPIOC->MODER &= ~GPIO_MODER_MODER13;
GPIOC->PUPDR |= GPIO_PUPDR_PUPDR13_0;

Настройка альтернативной функции для UART

Для использования UART нужно настроить выводы на альтернативную функцию:


// Включаем тактирование GPIOA
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;

// Настраиваем PA2 и PA3 на альтернативную функцию (UART2)
GPIOA->MODER |= GPIO_MODER_MODER2_1 | GPIO_MODER_MODER3_1;
GPIOA->AFR[0] |= (7 << 8) | (7 << 12); 

Советы по эффективному использованию GPIO STM32

Для оптимальной работы с портами ввода-вывода STM32 рекомендуется:

  • Внимательно изучить документацию на конкретную модель STM32
  • Использовать встроенные подтяжки вместо внешних резисторов
  • Применять атомарные операции установки/сброса битов через BSRR
  • Настраивать минимально необходимую скорость для экономии энергии
  • Использовать прерывания вместо постоянного опроса входов
  • Применять механизм блокировки для защиты критичных настроек

Заключение

Порты ввода-вывода STM32 предоставляют гибкие возможности для взаимодействия микроконтроллера с внешними устройствами. Правильная настройка и использование GPIO позволяет эффективно решать различные задачи - от простого управления светодиодами до сложных интерфейсов. При этом важно учитывать особенности и ограничения GPIO на конкретной модели STM32.



STM32 GPIO или порты ввода-вывода. » Хабстаб

Каждый порт STM32 состоит из 16 выводов, а каждый вывод может быть сконфигурирован одним из 8 способов.

Ниже изображена структура порта ввода-вывода.

Для того чтобы порт заработал его надо подключить к шине

APB2, установив соответствующий бит IOPxEN, в регистре разрешения тактирования периферийных блоков RCC_APB2ENR.


RCC->APB2ENR |= RCC_APB2ENR_IOPxEN; // Разрешить тактирование PORTx.

После включения все выводы находятся в состоянии плавающего входа, он же высокоимпедансный вход, он же Hi-Z, он же третье состояние.

  • Выходной драйвер выключен
  • Триггер Шмитта отключён
  • Подтягивающие резисторы отключены
  • В регистре IDR всегда “0”

В режиме входа

  • Выходной драйвер выключен
  • Входной Триггер Шмитта включён
  • В зависимости от настройки, включаются резисторы подтяжки
  • Каждый такт шины APB2 данные с входа поступают в регистр IDR, считав этот регистр можно узнать состояние ножки

В режиме выхода

  • В режиме Open Drain при записи “0” открывается нижний транзистор, при записи “1” линия остаётся не подключённой
  • В режиме Push Pull при записи “1” открывается верхний транзистор, при записи “0” — нижний
  • Входной Триггер Шмитта включён
  • Резисторы подтяжки отключены
  • По каждому такту шины APB2 данные c выхода передаются в регистр IDR, оттуда же их можно считать в режиме Open Drain
  • Чтение регистра ODR возвращает последнее записанное значение в режиме Push Pull

 
В режиме альтернативной функции

  • Драйвер включается в режиме Push Pull или Open Drain, в зависимости от конфигурации
  • Выходной драйвер управляется сигналами периферии, а не регистром ODR
  • Входной триггер Шмитта включён
  • Резисторы подтяжки отключены
  • По каждому такту шины APB2 данные c выхода передаются в регистр IDR, оттуда же их можно считать в режиме Open Drain
  • Чтение регистра ODR возвращает последнее записанное значение в режиме Push Pull

 
Из таблицы видно, что возможны два варианта конфигурации, в режиме альтернативной функции: Push Pull и Open Drain.  Например, мы хотим, настроить в режим альтернативной функции ножку, отвечающую за приём данных по USART. Для этого в Reference Manual RM0008, начиная с 161 страницы, идут таблицы, в которых можно посмотреть как cконфигурировать вывод, для разной периферии.

Нам подойдет  Input floating или Input pull-up.
 
Конфигурация выводов задаётся в регистрах GPIOx_CRL, GPIOx_CRH, в этих регистрах для конфигурации каждого вывода отведено 4 бита, MODE[1:0] и CNF[1:0]. В GPIOx_CRL конфигурируются выводы с 0 по 7, а в GPIOx_CRH с 8 по 15.


Если MODE[1:0] = 00, то вывод настроен на вход, конфигурация входа в таком случае задаётся в регистрах 

CNF[1:0]. Если MODE[1:0] не равен 00, в таком случае вывод настроен как выход, а значение MODE [1:0] задаёт максимальную частоту, с которой может он переключаться.
 


//Полагаем что выводы после сброса в режиме плавающего входа
       
       //разрешаем тактирование порта A
	RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
		
	//вход с подтяжкой к +
	GPIOA->CRL &= ~GPIO_CRL_CNF0;
	GPIOA->CRL |= GPIO_CRL_CNF0_1;
	GPIOA->ODR |= GPIO_ODR_ODR0; 
	
	//вход с подтяжкой к -
	GPIOA->CRL &= ~GPIO_CRL_CNF1;
	GPIOA->CRL |= GPIO_CRL_CNF1_1;
	GPIOA->ODR &= ~GPIO_ODR_ODR1; 
	
	//аналоговый режим
	GPIOA->CRL &= ~GPIO_CRL_CNF2;
	
	//выход с открытым стоком 2MHz
	GPIOA->CRL &= ~GPIO_CRL_CNF3;
	GPIOA->CRL |= GPIO_CRL_CNF3_0;
	GPIOA->CRL |= GPIO_CRL_MODE3_1;
	
	//двухтактный выход 10MHz
	GPIOA->CRL &= ~GPIO_CRL_CNF4;
	GPIOA->CRL |= GPIO_CRL_MODE4_0;
	
	//альтернативная ф-ция, двухтактный выход, 50 MHz
	GPIOA->CRL &= ~GPIO_CRL_CNF5;
	GPIOA->CRL |= GPIO_CRL_CNF5_1;
	GPIOA->CRL |= GPIO_CRL_MODE5;
	
	//альтернативная ф-ция, выход с открытым стоком,  50 MHz
	GPIOA->CRL |= GPIO_CRL_CNF6;
	GPIOA->CRL |= GPIO_CRL_MODE6;

Считать состояние входа можно с помощью Port input data register или коротко GPIOx_IDR, где x – название порта, может быть от A до G.  Считать состояние любого вывода можно из 16 младших бит, старшие 16 бит не используются.


//проверяем значение нулевого вывода порта А
if (GPIOА->IDR & GPIO_IDR_IDR0)

Если порт настроен на выход, управлять его состоянием можно с помощью регистра Port output data register или

GPIOx_ODR. Значение, которое мы запишем в этот регистр, появится на соответствующих выводах порта. Для установки состояния порта, выделены 16 младших бит, старшие 16 бит не используются.


//если вывод в режиме входа то активируется подтяжка к питанию
GPIOA->ODR |= GPIO_ODR_ODR0;
//или к земле
GPIOA->ODR &= ~GPIO_ODR_ODR0;
//если в режиме выхода, то на нём установится соответствующий лог.уровень
//например так можно установить все выходы порта в 1
GPIOA->ODR = 0xFFFF;

В STM32 возможно атомарно управлять отдельными битами порта с помощью регистров GPIOx_BSRR (Port Bit Set/Reset Register) и GPIOx_BRR (Port Bit Reset Register).
Для установки отдельного бита порта вручную, надо считать значение порта, изменить нужный бит с помощью маски и результат вернуть обратно в GPIOx_ODR. Так как действий целых три, то возникшее между ними прерывание, может подпортить данные. С помощью описанных выше регистров, это делается в одно действие.
Для сброса бита надо в нулевой бит GPIOx_BRR записать единичку, при этом в нулевой бит GPIOx_ODR запишется 0, для этой операции выделены младшие 16 бит, старшие 16 бит не используются.


//сбросить нулевой бит порта А
GPIOA->BRR = GPIO_BRR_BR0;

С GPIOx_BSRR всё чуть интереснее, младшие 16 бит отвечают за установку 1, старшие 16 бит за сброс в 0. Чтобы установить 1 в нулевой бит, надо в нулевой бит GPIOx_BSRR записать 1. Чтобы установить 0 в нулевой бит, надо в 16 бит установить 1.


//сбросить нулевой бит 
GPIOA->BSRR = GPIO_BSRR_BR0;
//установить нулевой бит
GPIOA->BSRR = GPIO_BSRR_BS0;

У STM32 есть возможность защитить конфигурацию порта от изменения, для этого выделен регистр GPIOx_LCKR.  Младшие 16 бит используются для выбора вывода, который хотим заблокировать (выбор бита осуществляется установкой единицы), затем специальной последовательностью записей в 16 бит(LCKK) осуществляется блокировка.

Последовательность следующая: записать в LCKK 1 , записать  0 ,записать 1, затем из регистра LCKR считать 0, считать 1. Последняя считанная единица говорит о том, что вывод заблокирован. Разблокировка вывода произойдёт только после перезагрузки контроллера.
 


#include "stm32f10x.h"

uint32_t temp;
  	
int main(void)
{
        //разрешаем тактирование порта
	RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
        //настраиваем как двухтактный выход
	GPIOA->CRL &= ~GPIO_CRL_CNF0;
        //с максимальной частотой 50MHz
	GPIOA->CRL |= GPIO_CRL_MODE0;
	
        //выбираем вывод который хотим залочить
	GPIOA->LCKR |= GPIO_LCKR_LCK0;
        //записываем 1
	GPIOA->LCKR |= GPIO_LCKR_LCKK;
        //записываем 0
	GPIOA->LCKR &= ~GPIO_LCKR_LCKK;
        //записываем 1
	GPIOA->LCKR |= GPIO_LCKR_LCKK;
        //считываем 2 раза
	temp = GPIOA->LCKR;
	temp = GPIOA->LCKR;
}

Для получения более подробной информации можно обратиться Reference Manual RM0008, к разделу General-purpose and alternate-function I/Os (GPIOs and AFIOs).

Порты ввода-вывода в STM32 – RxTx.su

В данной статье поговорим про порты ввода-вывода в STM32. Посмотрим как в микроконтроллерах STM32 настроить порты. Настройка портов STM32 будет проходить в CubeMX, а также будем использовать программную подсистему  HAL.

И так, после создания проекта в CubeMX, программисту необходимо настроить порты ввода вывода. Посмотрим на рисунок ниже. На нем представлен проект в CubeMx для отладочной платы STM32F407VET6. Нажав левой клавишей мыши на любом из портов, мы увидим выпадающий список. Это список всех функций, которые может выполнять данная ножка порта. На нашем рисунке это ножка PE2 порта PE.

ВНИМАНИЕ!
Так как микроконтроллер STM32 32-битный, то один порт содержит 16 ножек. Нумерация начинается с 0 (0..15).

В данной статье нас интересуют такие функции как GPIO_Input и GPIO_Output. Т.е. порт на вход и порт на выход.

Если говорить простыми словами, то настроив порт на вход, мы говорим микроконтроллеру, что эта ножка будет принимать сигнал. Т.е. устанавливать на ножке 0 или 1 будет внешнее устройство или датчик. Когда мы настраиваем порт на выход, то это значит что установкой 0 или 1 на ножке, будет заниматься программист.

Настройка портов STM32

Настройка порта на Вход

Настроить порты STM32 очень простая задача, особенно если использовать HAL и кодогенератора CubeMX.  

Настроем ножку контроллера PE2 на вход. Для этого нажмем левой клавишей мышки на этой ножке и в выпадающем списке выберем GPIO_Input. Для более тонкой настройки необходимо перейти в меню System core -> GPIO.

В открывшемся меню настроек, мы увидим нашу ножку PE2, порта PE отмеченную как Input mode.

Так же можно установить подтяжку на этой ножке:

  1. Pull up подтяжка к 1. Это значит, что контроллер будет пытаться подтянуть уровень сигнала на ножке к уровню питания. Т.е к 1.
  2. Pull down – подтяжка к 0. Это значит, что контроллер будет пытаться подтянуть уровень сигнала к земле, т.е. к 0.
  3. No Pull up and No Pull down подтяжка не применяется. Это значит что контроллер будет считывать сигнал на данной ножке как есть. Т.е. если например сигнал не дотянет до уровня питания, то контроллер может прочитать его как 0.

Еще одной настройкой для порта, является настройка его имени User Label. Всегда удобно, особенно если проект большой давать ножкам порта значащие имена. Потом будет проще ориентироваться в коде и понимать, что куда подключено.

Внимание! Удобно именовать так: даем значащее имя и через знак подчеркивания указываем ножку на которую используем, например Led_PE4. Теперь мы знаем, что к ножке PE4 подключен светодиод.

Настройка порта на Выход

Настройка порта на выход аналогична как и настройка на вход описанная выше. Есть несколько отличий. Теперь, выбрав в настройках наша ножка отмечена как  OutputPushPull или  OutputPushDrain зависит от того что выберет пользователь.

GPIO output level – установка начального уровня на порте. Low – низкий уровень. High – высокий уровень.

GPIO mode -> Output Push Pull – активный режим, при котором транзисторы порта открываются или закрываются поочередно. Подключая выход к питанию или к земле. Одновременно они не включаются, так как это будет коротким замыканием

Output Push Drain – этот режим называют режимом с открытым стоком. В этом случае работает только один, нижний транзистор. Он замыкает выход на землю.

Вот и вся работа по настройке портов ввода вывода в STM32.

Документация

  • Даташит на микроконтроллер STM32f407

Где купить?

  • Отладочная плата STM32F407VET6
Анализ портов

STM32 GPIO | Встроенная лаборатория

Опубликовано Шавон Шахрияр |

В любом микроконтроллере есть хотя бы один порт ввода-вывода общего назначения. STM32 не другая порода и, как и ожидалось, также имеет несколько портов GPIO. Эти порты обычно называются GPIOA, GPIOB и т. д., но в отличие от большинства 8/16-битных микропроцессоров эти порты имеют ширину 16 бит. Таким образом, в общем случае каждый порт имеет 16 контактов ввода-вывода. Выводы портов имеют несколько режимов работы, и именно это делает их одновременно надежными и сложными. В макетных платах имена контактов порта ввода-вывода сокращены, поэтому вместо GPIOA0, GPIOB12 и т. д. мы найдем PA0, PB12 и т. д. Даже в справочных руководствах это короткое наименование широко используется. В конце концов, каждый вывод ввода-вывода по своей природе является универсальным.

Ключевые точки с GPIO STM32

  • При любом сбросе все GPIO являются плавающими входами. Это предотвращает случайное повреждение GPIO в случае возникновения чрезвычайной ситуации.
  • Все регистры GPIO должны быть доступны с 32-битными словами. Это обязательно.
  • Зарезервированные биты для любого регистра GPIO сохраняются в значениях сброса, т. е. 0.
  • Для каждого порта GPIO есть семь регистров, но только первые четыре являются наиболее важными. Остальное в большинстве случаев можно игнорировать.
  • Этими важными регистрами GPIO для каждого порта являются CRL, CRH, IDR и ODR. Остальные три регистра для портов GPIO вначале можно не использовать.
  • Для установки и очистки битов операции REGx |= (1 << бит) и REGx &= ~ (1 << бит) соответственно очень удобны и эффективны. Однако компилятор MikroC обеспечивает доступ на уровне битов через кодировку внутреннего файла заголовка, например GPIOB_BSRRbits.BS15 . Мы можем использовать этот метод или другой.
  • Некоторые входы/выходы толерантны к напряжению 5 В и имеют маркировку «FT» в спецификациях и других документах. Остальные контакты ввода-вывода не так толерантны, поэтому всегда следует обеспечивать работу с напряжением 3,3 В. STM32 имеет максимальный допуск VDD 4 В, но это значение не следует использовать ни в какой ситуации для безопасной работы. Лучше всего по возможности избегать использования 5V с GPIO. Это поможет избежать случайного повреждения микро из-за распространенных ошибок.
  • Неиспользуемые контакты GPIO должны быть сохранены в состоянии сброса или подключены к земле с помощью резисторов 10 кОм, чтобы они оставались либо плавающими входами, либо безопасно подключены к земле, хотя это не обязательно.
  • Выводы ввода-вывода
  • могут подавать или потреблять ток до 25 мА. Таким образом, с ними возможен прямой привод светодиодов. Для управления нагрузками, которым требуется больше этого значения, мы должны использовать внешние биполярные транзисторы, полевые МОП-транзисторы, оптопары, массивы транзисторов или другие драйверы.
  • Контакты ввода-вывода
  • не должны напрямую управлять индуктивными или емкостными нагрузками.
  • Следует соблюдать осторожность, чтобы не допустить выхода на выходную частоту выше 50 МГц. Это максимальная номинальная частота выводов ввода/вывода.
  • CRL/H регистрирует необходимый режим работы контакта GPIO независимо, как указано в таблице ниже:

  • CRL устанавливает GPIO от 0 до 7, а CRH устанавливает от 8 до 15. Все порты ввода-вывода имеют ширину 16 бит, в отличие от обычных 8-битных микросхем, таких как PIC или AVR.


Регистр CRL:

Регистр CRH:

  • Как видно из таблицы конфигурации портов, сразу после сброса CRL и CRH оба имеют значение 0x44444444. Это значение означает плавающий режим ввода.
  • Регистры
  • IDR отвечают за цифровые входы, а регистры ODR — за цифровые выходы. В обоих регистрах старшие 16 бит всегда равны 0, потому что GPIO имеют ширину 16 бит, а их репрезентативные регистры имеют ширину 32 бита. Таким образом, интерес представляют только нижние 16 полубайтов. Соглашение о написании кода будет 0x0000xxxx для IDR и ODR. Старшие полубайты зарезервированы и поэтому устанавливаются как нули.
  • Так же, как CRL и CRH, IDR и ODR должны быть доступны как 32 слова.
  • CRL и CRH должны быть инициализированы перед использованием регистров ODR или IDR порта GPIO.

Регистр ODR:

Регистр IDR:

 

  • Значения сброса IDR и ODR равны нулю. Это обеспечивает начальное логическое состояние низкого уровня для ODR и плавающее состояние для IDR.
  • После каждого сброса устройства все периферийные часы отключаются (кроме SRAM и FLITF). Перед использованием периферийного устройства вы должны включить его часы в регистре RCC_AHBENR, RCC_APB1ENR или RCC_APB2ENR. Эти регистры важны, и их всегда следует устанавливать перед использованием внутреннего периферийного устройства.

APB2 peripheral clock enable register (RCC_APB2ENR):

 

APB1 peripheral clock enable register (RCC_APB1ENR):

 

AHB peripheral clock enable register (RCC_AHBENR):

  • Вышеупомянутые регистры должны быть установлены в первую очередь.

MikroC для ARM имеет встроенную библиотеку для GPIO. Хотя с такими библиотеками легко начать работу, даже не имея представления о внутренних регистрах, они требуют много места и времени выполнения. Таким образом, для простых работ лучше всего избегать их, если только их использование не упрощает понимание и работу с большой программой.

Пример программы

Программа будет просто мигать светодиодом, подключенным к PB15, с временем включения и выключения 200 мс, пока не будет нажата кнопка, подключенная к PA0. При нажатии кнопки время задержки изменяется на 600 мс вместо 200 мс. Задержка 600 мс сохраняется до тех пор, пока кнопка не будет отпущена.

Микросхема STM32F108C8, встроенная в макетную плату mini ARM от LC Technology, использовалась в этой демонстрации.

Примеры кода STM32 GPIO

 

 

 

Демонстрационный видеоролик: https://www.youtube.com/watch?v=X8jLZYZCCQw

Удачного кодирования STM32.

Автор: Шавон М. Шахрияр

https://www.facebook.com/groups/microarena

https://www.facebook.com/MicroArena 0 0 0 0  

Похожие сообщения

Учебник

STM32 GPIO — прерывания, примеры, скорость, блокировка DeepBlue

Обучение программированию ПЛК - бесплатно 6 - De...

Пожалуйста, включите JavaScript

Обучение программированию ПЛК - бесплатно 6 - Десятичная/двоичная нумерация в ПЛК , мы обсудим аппаратное обеспечение STM32 GPIO. Как это работает и какие функции существуют, чтобы вы могли настроить его наилучшим образом для удовлетворения потребностей ваших приложений. Мы рассмотрим скорость GPIO, альтернативные функции, механизм блокировки и различные возможные конфигурации. Итак, приступим!


   Порты STM32 GPIO    

 

Каждый из портов ввода/вывода общего назначения имеет два 32-битных регистра конфигурации, два 32-битных регистра данных, 32-битный регистр установки/сброса, 1 6 регистров сброса -битный регистр сброса и 32-битный регистр блокировки. Каждый бит порта ввода-вывода свободно программируется, однако доступ к регистрам порта ввода-вывода должен осуществляться как к 32-битным словам (полусловный или байтовый доступ не разрешен). Назначение регистров установки/сброса состоит в том, чтобы разрешить атомарное чтение/изменение доступа к любому из регистров GPIO. Таким образом, нет риска возникновения IRQ между доступом на чтение и изменение.

Вот цифровая схема внутренней структуры типичного контакта GPIO. Он показывает диодную защиту, внутреннее включение/выключение подтягивания вверх или вниз, а также двухтактный выходной драйвер, включение/выключение выхода для переключения между режимами ввода/вывода, цифровой вход, управляемый Шмиттом, аналоговый вход.

Вы должны предположить, что все контакты GPIO по умолчанию не устойчивы к 5 В, пока вы не найдете в таблице данных, что определенный контакт устойчив к 5 В, только тогда вы можете использовать его как контакт 5 В. Штыри в основном 3,3 В и могут быть повреждены при подключении к цифровым входным линиям до 5 В. Сдвиг уровня может быть обязательным во многих случаях.

Таким образом, вы должны быть осторожны с уровнем напряжения для входных контактов. А также вы должны обратить внимание на выходной ток при установке выходных контактов GPIO. Максимальный ток, который может подаваться или поступать на любой вывод GPIO, составляет 25 мА согласно техническому описанию. И вы должны проверить это для конкретного целевого микроконтроллера, с которым вы имеете дело.

 

 


   STM32 GPIO Скорость    

 

Для режима ввода

Когда вывод GPIO установлен в режим ввода, данные, присутствующие на выводе ввода-вывода, записываются в регистр входных данных каждый тактовый цикл APB2. Это означает, что скорость шины APB2 определяет скорость выборки ввода для контактов GPIO.

Для режима вывода

Когда вывод GPIO установлен в режим вывода, у вас будет возможность настроить режим скорости вывода, запрограммировав соответствующие биты в регистрах конфигурации. Ниже приведена таблица различных режимов, доступных в техническом описании микроконтроллера STM32F103C8.

Однако другие микроконтроллеры будут иметь другие параметры скорости вывода вывода. Например, другой микроконтроллер, который мы будем использовать в этом курсе, STM32L432KC. Он имеет специальный регистр управления скоростью для контактов GPIO, которые имеют 4 различных варианта скорости: низкая скорость, средняя скорость, высокая скорость, очень высокая скорость.

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

Примечание: Типичные значения зависят от различных параметров, таких как линейное напряжение V DDio , общая емкость выводов.

  • Низкая скорость -> до 10 МГц
  • Средняя скорость -> до 50 МГц
  • Высокая скорость -> до 100 МГц
  • Очень высокая скорость -> до 180 МГц
В этой таблице только для справки показаны только низкоскоростной режим. Остальные режимы указаны в полной таблице в техпаспорте.

 


   Атомарные операции GPIO   

 

Программному обеспечению не нужно отключать прерывания при программировании GPIOx_ODR на битовом уровне: можно изменить только один или несколько битов в одном доступе на запись атомарного APB2. Это достигается путем программирования в «1» регистра установки/сброса битов (GPIOx_BSRR или только для сброса GPIOx_BRR), чтобы выбрать биты для изменения. Невыбранные биты не будут изменены.

 


   Внешние прерывания STM32 GPIO      

 

Все порты поддерживают внешние прерывания. Чтобы использовать внешние линии прерывания, порт должен быть сконфигурирован в режиме ввода. Мы обсудим это более подробно, когда перейдем к теме EXTI (внешний контроллер прерываний/событий).

 


   Выбор вывода периферийных устройств (PPS)            

 

Чтобы оптимизировать количество функций периферийного ввода-вывода для различных корпусов устройств, можно переназначить некоторые альтернативные функции некоторым другим контактам. Это достигается программно, путем программирования соответствующих регистров.

Эта опция может помочь вам переназначить контакты ввода-вывода периферийных устройств, чтобы вам не пришлось сильно менять компоновку печатной платы при смене целевого микроконтроллера на плате. Это может быть чрезвычайно выгодно и упростить процесс маршрутизации. И помочь вам убрать высокоскоростные сигналы, чтобы снизить уровень шума в определенных частях.

 


   STM32 Механизм блокировки GPIO      

 

Механизм блокировки позволяет заморозить конфигурацию ввода-вывода. Когда к биту порта применена последовательность LOCK, больше невозможно изменить значение бита порта до следующего сброса.

 


   Конфигурации STM32 GPIO          

 

В зависимости от конкретных аппаратных характеристик каждого порта ввода-вывода, указанного в техническом описании , каждый бит порта ввода-вывода общего назначения может быть настроен отдельно (GPIO) программно в нескольких режимах:

Конфигурация выхода

  • Выход с открытым стоком
  • Выход Push-Pull

Конфигурация входа

  • Входной плавание (HI-Z)
  • Входной подтягивание
  • Входной раздавшийся

Конфигурация переменной функции

  • ФУНКЦИЯ ФУНКЦИЯ АДРЕС-ПУН
  • ALTERATE FUNCAT

     


       STM32 GPIO Заключительные замечания        

     

    Не все выводы GPIO устойчивы к напряжению 5 В. В основном они 3.3v.

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

    При настройке выходного контакта GPIO вы можете выбрать скорость, подходящую для вашего приложения. Нужна ли вам высокочастотная коммутация на линии IO или нет.

    Скорость шины APB2 определяет частоту дискретизации для всех сконфигурированных контактов входа GPIO.

    Вы можете отключить любой вывод GPIO (сделать его высокоимпедансным), установив его в режим ввода с помощью Hi-Z.

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

    Альтернативные функциональные контакты могут быть заменены (переназначены) внутри, чтобы вы могли пользоваться большей свободой в маршрутизации этих сигналов.

    Все выводы GPIO являются выводами с возможностью прерывания, но их необходимо настроить в EXTI, как мы увидим позже в курсе.

     

     

     

    Это урок. В следующем уроке мы начнем нашу первую практическую лабораторную работу!

     

     

    Присоединяйтесь к нашим более чем 25 000 подписчиков на рассылку новостей!

    Будьте в курсе всех новых выпусков контента. Вы также получаете случайные БЕСПЛАТНЫЕ коды купонов для курсов и других вещей!

    Введите адрес электронной почты…

    Автор

    Khaled Magdy

    Я инженер встраиваемых систем с многолетним опытом разработки встроенного программного и аппаратного обеспечения. Я работаю инженером по встроенному ПО в автомобильной промышленности. Тем не менее, я по-прежнему занимаюсь проектированием оборудования и разработкой программного обеспечения для DSP, систем управления, робототехники, искусственного интеллекта/машинного обучения и других областей, которыми я увлечен. Я люблю читать, писать, создавать проекты и заниматься технической подготовкой. Читатель днем ​​и писатель ночью, это мой образ жизни.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *