#include "api_rt_gpio.h" #include "gd32f30x.h" Gpio_Handle const Gpios[GPIO_PIN_COUNT] = { [0] = {.GpioBase = GPIOC, .Index = 0}, [1] = {.GpioBase = GPIOC, .Index = 1}, [2] = {.GpioBase = GPIOC, .Index = 8}, [3] = {.GpioBase = GPIOC, .Index = 7}, [4] = {.GpioBase = GPIOC, .Index = 15}, [5] = {.GpioBase = GPIOC, .Index = 13}, [6] = {.GpioBase = GPIOC, .Index = 14}, [7] = {.GpioBase = GPIOC, .Index = 10}, [8] = {.GpioBase = GPIOC, .Index = 11}, [9] = {.GpioBase = GPIOD, .Index = 2}, [10] = {.GpioBase = GPIOB, .Index = 9}, [11] = {.GpioBase = GPIOB, .Index = 8}, [12] = {.GpioBase = GPIOA, .Index = 12}, [13] = {.GpioBase = GPIOC, .Index = 12}, [14] = {.GpioBase = GPIOB, .Index = 2}, [15] = {.GpioBase = GPIOB, .Index = 10}, }; void iRtGpio_Init() { } void iGpio_SetMode(uint16_t pin, ApiGpio_PinMode mode) { const Gpio_Handle *const gpio = &Gpios[pin]; switch (mode) { case ApiGpio_Input: gpio_init(gpio->GpioBase, GPIO_MODE_IPD, GPIO_OSPEED_50MHZ, BIT(gpio->Index)); break; case ApiGpio_Output: gpio_init(gpio->GpioBase, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, BIT(gpio->Index)); break; case ApiGpio_AlternateFunction: gpio_init(gpio->GpioBase, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, BIT(gpio->Index)); break; default: break; } } ApiGpio_Level iGpio_Read(uint16_t pin) { const Gpio_Handle *const gpio = &Gpios[pin]; ApiGpio_Level level = ApiGpio_LowLevel; if ((uint32_t)RESET != (GPIO_ISTAT(gpio->GpioBase)&((uint32_t)((uint32_t)0x01U << gpio->Index)))) { level = ApiGpio_HighLevel; } return level; } void iGpio_Write(uint16_t pin, ApiGpio_Level level) { const Gpio_Handle *const gpio = &Gpios[pin]; if (level == ApiGpio_HighLevel) { GPIO_OCTL(gpio->GpioBase) |= ((uint32_t)((uint32_t)0x01U << gpio->Index)); } else { GPIO_OCTL(gpio->GpioBase) &= ~((uint32_t)((uint32_t)0x01U << gpio->Index)); } }