gpio.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. #ifndef GPIO_H
  2. #define GPIO_H
  3. #include "stm32f4xx_conf.h"
  4. #include "stm32f4xx.h"
  5. #include <stdlib.h>
  6. #include <stdint.h>
  7. #include <stdbool.h>
  8. #include <string.h>
  9. #define GLITCH_TIMEOUT 200
  10. /*
  11. * Alternative function numbers definitions
  12. */
  13. enum af_n {AF0 = 0, AF1, AF2, AF3, AF4, AF5, AF6, AF7,
  14. AF8, AF9, AF10, AF11, AF12, AF13, AF14, AF15};
  15. #define _GPIO_AF_SHIFT 10
  16. /* Flags for gpio init */
  17. #define GPIO_IN 0x01
  18. #define GPIO_IN_PU 0x02
  19. #define GPIO_OUT 0x04
  20. #define GPIO_SET 0x08
  21. #define GPIO_INV 0x10
  22. #define GPIO_OD 0x20
  23. #define GPIO_BKP 0x40
  24. #define GPIO_NOINIT 0x80
  25. #define GPIO_DIR_CHANGE 0x100
  26. #define GPIO_AF 0x200
  27. #define AF_TIM1 ((AF1 << _GPIO_AF_SHIFT) | GPIO_AF)
  28. #define AF_TIM2 ((AF1 << _GPIO_AF_SHIFT) | GPIO_AF)
  29. #define AF_TIM3 ((AF2 << _GPIO_AF_SHIFT) | GPIO_AF)
  30. #define AF_TIM4 ((AF2 << _GPIO_AF_SHIFT) | GPIO_AF)
  31. #define AF_TIM5 ((AF2 << _GPIO_AF_SHIFT) | GPIO_AF)
  32. #define AF_TIM8 ((AF3 << _GPIO_AF_SHIFT) | GPIO_AF)
  33. #define AF_TIM9 ((AF3 << _GPIO_AF_SHIFT) | GPIO_AF)
  34. #define AF_TIM10 ((AF3 << _GPIO_AF_SHIFT) | GPIO_AF)
  35. #define AF_TIM11 ((AF3 << _GPIO_AF_SHIFT) | GPIO_AF)
  36. #define AF_I2C1 ((AF4 << _GPIO_AF_SHIFT) | GPIO_AF)
  37. #define AF_I2C2 ((AF4 << _GPIO_AF_SHIFT) | GPIO_AF)
  38. #define AF_I2C3 ((AF4 << _GPIO_AF_SHIFT) | GPIO_AF)
  39. #define AF_SPI1 ((AF5 << _GPIO_AF_SHIFT) | GPIO_AF)
  40. #define AF_SPI2 ((AF5 << _GPIO_AF_SHIFT) | GPIO_AF)
  41. #define AF_SPI3 ((AF6 << _GPIO_AF_SHIFT) | GPIO_AF)
  42. #define AF_USART1 ((AF7 << _GPIO_AF_SHIFT) | GPIO_AF)
  43. #define AF_USART2 ((AF7 << _GPIO_AF_SHIFT) | GPIO_AF)
  44. #define AF_USART3 ((AF7 << _GPIO_AF_SHIFT) | GPIO_AF)
  45. #define AF_USART4 ((AF8 << _GPIO_AF_SHIFT) | GPIO_AF)
  46. #define AF_USART5 ((AF8 << _GPIO_AF_SHIFT) | GPIO_AF)
  47. #define AF_USART6 ((AF8 << _GPIO_AF_SHIFT) | GPIO_AF)
  48. #define AF_CAN1 ((AF9 << _GPIO_AF_SHIFT) | GPIO_AF)
  49. #define AF_CAN2 ((AF9 << _GPIO_AF_SHIFT) | GPIO_AF)
  50. #define AF_TIM12 ((AF9 << _GPIO_AF_SHIFT) | GPIO_AF)
  51. #define AF_TIM13 ((AF9 << _GPIO_AF_SHIFT) | GPIO_AF)
  52. #define AF_TIM14 ((AF9 << _GPIO_AF_SHIFT) | GPIO_AF)
  53. #define AF_OTG_FS ((AF10 << _GPIO_AF_SHIFT) | GPIO_AF)
  54. #define AF_OTG_HS ((AF10 << _GPIO_AF_SHIFT) | GPIO_AF)
  55. #define AF_ETH ((AF11 << _GPIO_AF_SHIFT) | GPIO_AF)
  56. #define AF_FSMC ((AF12 << _GPIO_AF_SHIFT) | GPIO_AF)
  57. #define AF_SDIO ((AF12 << _GPIO_AF_SHIFT) | GPIO_AF)
  58. #define AF_OTG_HS_FS ((AF12 << _GPIO_AF_SHIFT) | GPIO_AF)
  59. #define AF_DCMI ((AF13 << _GPIO_AF_SHIFT) | GPIO_AF)
  60. #define AF_EVENTOUT ((AF14 << _GPIO_AF_SHIFT) | GPIO_AF)
  61. typedef struct {
  62. GPIO_TypeDef *port;
  63. uint8_t pin;
  64. uint16_t flags;
  65. } gpio_pindef_t;
  66. #include "board.h"
  67. extern gpio_pindef_t gpio_pins[GPIO_TOTAL_COUNT];
  68. /*
  69. * GPIO register bitmasks
  70. */
  71. #define GPIO_MODER_MASK 0x03
  72. #define GPIO_TYPER_MASK 0x01
  73. #define GPIO_SPEEDR_MASK 0x03
  74. #define GPIO_PUPDR_MASK 0x03
  75. #define GPIO_AFR_MASK 0x0f
  76. /*
  77. * Port configuration values.
  78. * A configuration is passing to gpio_hw_config_pin() bitwise in
  79. * a 16-bit 'conf' parameter where low byte representing a port
  80. * configuration and high using only for representing a number of an
  81. * alternative function (if GPIO_MODE_AF is chosen).
  82. * Shifts is using to encode/decode the config bits to/from 'conf'.
  83. */
  84. #define GPIO_MODE_CFG_SHIFT 0
  85. #define GPIO_TYPE_CFG_SHIFT 2
  86. #define GPIO_SPEED_CFG_SHIFT 4
  87. #define GPIO_PUPD_CFG_SHIFT 6
  88. #define GPIO_MODE_IN_CFG (0x00 << GPIO_MODE_CFG_SHIFT)
  89. #define GPIO_MODE_OUT_CFG (0x01 << GPIO_MODE_CFG_SHIFT)
  90. #define GPIO_MODE_AF_CFG (0x02 << GPIO_MODE_CFG_SHIFT)
  91. #define GPIO_MODE_ANALOG_CFG (0x03 << GPIO_MODE_CFG_SHIFT)
  92. #define GPIO_TYPE_PP_CFG (0x00 << GPIO_TYPE_CFG_SHIFT)
  93. #define GPIO_TYPE_OD_CFG (0x01 << GPIO_TYPE_CFG_SHIFT)
  94. #define GPIO_SPEED_LOW_CFG (0x00 << GPIO_SPEED_CFG_SHIFT)
  95. #define GPIO_SPEED_MED_CFG (0x01 << GPIO_SPEED_CFG_SHIFT)
  96. #define GPIO_SPEED_FAST_CFG (0x02 << GPIO_SPEED_CFG_SHIFT)
  97. #define GPIO_SPEED_HIGH_CFG (0x03 << GPIO_SPEED_CFG_SHIFT)
  98. #define GPIO_PU_CFG (0x01 << GPIO_PUPD_CFG_SHIFT)
  99. #define GPIO_PD_CFG (0x02 << GPIO_PUPD_CFG_SHIFT)
  100. void gpio_init(void);
  101. void gpio_set(gpio_t pin, bool value);
  102. void gpio_invert_output(gpio_t pin);
  103. bool gpio_get(gpio_t pin);
  104. bool gpio_is_output(gpio_t pin);
  105. void gpio_set_direction(gpio_t pin, bool out);
  106. void gpio_hw_config_pin(GPIO_TypeDef *port, uint8_t pin, uint16_t conf);
  107. //void gpio_connect_af(GPIO_TypeDef *port, uint8_t pin, uint8_t af);
  108. void gpio_connect_af(gpio_t id, uint8_t af_n);
  109. void exti_handler(void);
  110. void gpio_test(void);
  111. #endif /* GPIO_H */