api_rt_gpio.c 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #include "api_rt_gpio.h"
  2. #include "gd32f30x.h"
  3. Gpio_Handle const Gpios[GPIO_PIN_COUNT] = {
  4. [0] = {.GpioBase = GPIOC, .Index = 0},
  5. [1] = {.GpioBase = GPIOC, .Index = 1},
  6. [2] = {.GpioBase = GPIOC, .Index = 7},
  7. [3] = {.GpioBase = GPIOC, .Index = 8},
  8. [4] = {.GpioBase = GPIOC, .Index = 15},
  9. [5] = {.GpioBase = GPIOC, .Index = 13},
  10. [6] = {.GpioBase = GPIOC, .Index = 14},
  11. [7] = {.GpioBase = GPIOC, .Index = 10},
  12. [8] = {.GpioBase = GPIOC, .Index = 11},
  13. [9] = {.GpioBase = GPIOC, .Index = 2},
  14. [10] = {.GpioBase = GPIOB, .Index = 9},
  15. [11] = {.GpioBase = GPIOB, .Index = 8},
  16. [12] = {.GpioBase = GPIOA, .Index = 12},
  17. [13] = {.GpioBase = GPIOC, .Index = 12},
  18. [14] = {.GpioBase = GPIOB, .Index = 2},
  19. [15] = {.GpioBase = GPIOB, .Index = 10},
  20. };
  21. void iRtGpio_Init()
  22. {
  23. }
  24. void iGpio_SetMode(uint16_t pin, ApiGpio_PinMode mode)
  25. {
  26. const Gpio_Handle *const gpio = &Gpios[pin];
  27. switch (mode)
  28. {
  29. case ApiGpio_Input:
  30. gpio_init(gpio->GpioBase, GPIO_MODE_IPD, GPIO_OSPEED_50MHZ, BIT(gpio->Index));
  31. break;
  32. case ApiGpio_Output:
  33. gpio_init(gpio->GpioBase, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, BIT(gpio->Index));
  34. break;
  35. case ApiGpio_AlternateFunction:
  36. gpio_init(gpio->GpioBase, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, BIT(gpio->Index));
  37. break;
  38. default:
  39. break;
  40. }
  41. }
  42. ApiGpio_Level iGpio_Read(uint16_t pin)
  43. {
  44. const Gpio_Handle *const gpio = &Gpios[pin];
  45. ApiGpio_Level level = ApiGpio_LowLevel;
  46. if ((uint32_t)RESET != (GPIO_ISTAT(gpio->GpioBase)&((uint32_t)((uint32_t)0x01U << gpio->Index))))
  47. {
  48. level = ApiGpio_HighLevel;
  49. }
  50. return level;
  51. }
  52. void iGpio_Write(uint16_t pin, ApiGpio_Level level)
  53. {
  54. const Gpio_Handle *const gpio = &Gpios[pin];
  55. if (level == ApiGpio_HighLevel)
  56. {
  57. GPIO_OCTL(gpio->GpioBase) |= ((uint32_t)((uint32_t)0x01U << gpio->Index));
  58. }
  59. else
  60. {
  61. GPIO_OCTL(gpio->GpioBase) &= ~((uint32_t)((uint32_t)0x01U << gpio->Index));
  62. }
  63. }