Найти в Дзене

GD32F303. GPIO

В зависимости от типа корпуса доступны до 112 пинов ввода-вывода общего назначения (GPIO) — PA0-PA15, PB0-PB15, PC0-PC15, PD0-PD15, PE0-PE15, PF0-PF15 и PG0-PG15 для реализации. Каждый порт GPIO имеет соответствующие регистры управления и настройки.
Каждый из пинов GPIO может быть настроен программно как выход (push-pull or open-drain), вход, вывод альтернативной функции или вывод в аналоговом режиме. Каждый вывод GPIO можно настроить как pull-up, pull-down или floating. Все GPIO рассчитаны на повышенные токи, за исключением аналогового режима.
Настройка режима работы пина осуществляется через регистры CTL0/CTL1. Подробности настройки приведены в Таблице 8-1 User Manual. Текущее значение бита, настроенного как вход, хранится в регистре ISTAT. Состояние пина, настроенного как выход, определяется соответствующим битом регистра OCTL. Bare metal
#include "gd32f30x.h"
int main()
{
/* enable GPIOB clock */
RCU->APB2EN |= RCU_APB2EN_PBEN;
/* configure led pin PB2 as push-pull 50MHz

В зависимости от типа корпуса доступны до 112 пинов ввода-вывода общего назначения (GPIO) — PA0-PA15, PB0-PB15, PC0-PC15, PD0-PD15, PE0-PE15, PF0-PF15 и PG0-PG15 для реализации. Каждый порт GPIO имеет соответствующие регистры управления и настройки.
Каждый из пинов GPIO может быть настроен программно как выход (push-pull or open-drain), вход, вывод альтернативной функции или вывод в аналоговом режиме. Каждый вывод GPIO можно настроить как pull-up, pull-down или floating. Все GPIO рассчитаны на повышенные токи, за исключением аналогового режима.
Настройка режима работы пина осуществляется через регистры CTL0/CTL1.

Подробности настройки приведены в Таблице 8-1 User Manual.

-2

Текущее значение бита, настроенного как вход, хранится в регистре ISTAT. Состояние пина, настроенного как выход, определяется соответствующим битом регистра OCTL.

-3

Bare metal
#include "gd32f30x.h"

int main()
{
/* enable GPIOB clock */
RCU->APB2EN |= RCU_APB2EN_PBEN;
/* configure led pin PB2 as push-pull 50MHz output */
GPIOB->CTL0 &= ~(GPIO_CTL0_CTL2_1 | GPIO_CTL0_CTL2_0);
GPIOB->CTL0 |= GPIO_CTL0_MD2_1 | GPIO_CTL0_MD2_0;
/* configure button pin PB4 as pull-up input */
GPIOB->CTL0 |= GPIO_CTL0_CTL4_1;
GPIOB->CTL0 &= ~(GPIO_CTL0_MD4_1 | GPIO_CTL0_MD4_0 | GPIO_CTL0_CTL4_0);

while(1)
{
if(GPIOB->ISTAT & GPIO_ISTAT_ISTAT4)
/* led on if PB4 is high */
GPIOB->OCTL |= GPIO_OCTL_OCTL2;
else
/* led off if PB4 is low */
GPIOB->OCTL &= ~GPIO_OCTL_OCTL2;
}
}

Driver
#include "gd32f30x_gpio.h"

int main)
{
/* enable GPIOB clock */
rcu_periph_clock_enable(RCU_GPIOB);
/* configure led pin PB2 as push-pull 50MHz output */
gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2);
/* configure button pin PB4 as pull-up input */
gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_2MHZ, GPIO_PIN_4);

while(1)
{
if(gpio_input_bit_get(GPIOB, GPIO_PIN_4) == SET)
/* led on if PB4 is high */
gpio_bit_write(GPIOB, GPIO_PIN_2, SET);
else
/* led off if PB4 is low */
gpio_bit_write(GPIOB, GPIO_PIN_2, RESET);
}
}