Любая ножка порта GPIO может быть настроена в одной из четырех возможных конфигураций:
• Input (вход): Floating (плавающий вход с высоким входным сопротивлением, ничем не нагруженный), Pull-up (с верхним нагрузочным резистором), Pull-down (с нижним нагрузочным резистором).
• Output (выход): Push-Pull двухтактный ключ (Pull-up с верхней нагрузкой, Pull-down с нижней нагрузкой или no Pull просто двухтактный выход), Open Drain открытый сток (Pull-up, Pull-down или no Pull). В режиме выхода может быть запрограммирована скорость работы порта: 2 МГц, 25 МГц, 50 МГц или 100 МГц.
• Alternate Function (альтернативная функция): Push-Pull (Pull-up, Pull-down или no Pull), Open Drain (Pull-up, Pull-down или no Pull).
• Analog (аналоговая линия): этот режим необходим, когда вывод используется как канал ADC (АЦП) или выход DAC (ЦАП).
• Output (выход): Push-Pull двухтактный ключ (Pull-up с верхней нагрузкой, Pull-down с нижней нагрузкой или no Pull просто двухтактный выход), Open Drain открытый сток (Pull-up, Pull-down или no Pull). В режиме выхода может быть запрограммирована скорость работы порта: 2 МГц, 25 МГц, 50 МГц или 100 МГц.
• Alternate Function (альтернативная функция): Push-Pull (Pull-up, Pull-down или no Pull), Open Drain (Pull-up, Pull-down или no Pull).
• Analog (аналоговая линия): этот режим необходим, когда вывод используется как канал ADC (АЦП) или выход DAC (ЦАП).
Во время активного сигнала сброса и сразу после его окончания все альтернативные функции на выводах портов не активны (за исключением выводов, задействованных под JTAG), и все порты оказываются сконфигурированными как плавающие входы с высоким сопротивлением.
Выводы генератора LSE (OSC32_IN и OSC32_OUT) могут использоваться как GPIO (PC14 и PC15 соответственно), если генератор LSE выключен. LSE имеет приоритет перед функцией GPIO.
Выводы генератора HSE (OSC_IN и OSC_OUT) могут использоваться как GPIO (PH0 и PH1), когда генератор HSE выключен (основной кварцевый генератор не используется, что бывает очень редко). HSE имеет приоритет над функцией GPIO.
Выводы генератора HSE (OSC_IN и OSC_OUT) могут использоваться как GPIO (PH0 и PH1), когда генератор HSE выключен (основной кварцевый генератор не используется, что бывает очень редко). HSE имеет приоритет над функцией GPIO.
Чтобы порт начал работать в режиме программного ввода/вывода, нужно 2 вещи: разрешить его тактирование, и настроить параметры порта.
Настройка тактирования порта
Чтобы порт GPIOx начал работать, и можно было программно управлять состоянием его ножек, нужно включить тактирование порта. Каждый из портов GPIOx подключен к ядру микроконтроллера через шину AHB1, и для управления включения тактирования в нормальном режиме работы служит регистр RCC_AHB1ENR.
Например, чтобы пользоваться ножкой PA3 как портом ввода/вывода, нужно разрешить тактирование GPIOA, для чего в разряд GPIOAEN надо записать единицу. Для этой цели служат удобные библиотечные функции (в этом примере разрешено тактирование порта GPIOA):
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
Управление портом как выходом
Для того, чтобы можно было начать управлять выводом, переводя его в состояние лог. 0 или лог. 1, порт надо настроить. Пример настройки порта PF6 как выхода:
/* Разрешить тактирование GPIOF */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
/* Конфигурирование ножки PF6, туда подключен светодиод STAT1
платы разработчика Olimex STM32-P407 */
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOF, &GPIO_InitStructure);
После того, как порт настроен, можно его программно переключать в любое нужное состояние. Для переключения порта служат регистры BSRRL и BSRRH, пример:
/* Бесконечный цикл мигания светодиодом STAT1 */
while(1)
{
GPIOF->BSRRL = GPIO_Pin_6; //STAT==1, светодиод горит
Delay(3000000L);
GPIOF->BSRRH = GPIO_Pin_6; //STAT==0, светодиод погас
Delay(3000000L);
}
Для управления ножками можно также применять удобные функции GPIO_SetBits и GPIO_ResetBits.
Чтение состояния порта как входа
Получить текущее состояние ножки порта, работающей в режиме входа, можно с помощью функции GPIO_ReadInputDataBit(). Но для начала нужно соответствующие ножки настроить как входы, и разрешить тактирование порта. Вот пример настройки портов для чтения джойстика платы Olimex STM32-P407 [2]:
/* Разрешить тактирование GPIOG, туда подключены контакты джойстика. */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
/* Конфигурирование ножек джойстика платы разработчика Olimex STM32-P407.
* PG6 RIGHT
* PG7 UP
* PG8 DOWN
* PG11 LEFT
* PG15 CENT */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_11 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_Init(GPIOG, &GPIO_InitStructure);
Как опрашивать состояние порта:
if(GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_15))
{
//сюда попадаем, если с входа прочитана лог. 1.
...
}
http://microsin.net/programming/ARM/stm32f407-peripheral-clock-enable.html
http://microsin.net/programming/ARM/stm32f407-gpio-pins-alternate-function.html
Комментариев нет:
Отправить комментарий