furi_hal_gpio.h 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. #pragma once
  2. #include "stdbool.h"
  3. #include <stm32wbxx_ll_gpio.h>
  4. #include <stm32wbxx_ll_system.h>
  5. #include <stm32wbxx_ll_exti.h>
  6. #ifdef __cplusplus
  7. extern "C" {
  8. #endif
  9. /**
  10. * Number of gpio on one port
  11. */
  12. #define GPIO_NUMBER (16U)
  13. /**
  14. * Interrupt callback prototype
  15. */
  16. typedef void (*GpioExtiCallback)(void* ctx);
  17. /**
  18. * Gpio interrupt type
  19. */
  20. typedef struct {
  21. GpioExtiCallback callback;
  22. void* context;
  23. volatile bool ready;
  24. } GpioInterrupt;
  25. /**
  26. * Gpio modes
  27. */
  28. typedef enum {
  29. GpioModeInput,
  30. GpioModeOutputPushPull,
  31. GpioModeOutputOpenDrain,
  32. GpioModeAltFunctionPushPull,
  33. GpioModeAltFunctionOpenDrain,
  34. GpioModeAnalog,
  35. GpioModeInterruptRise,
  36. GpioModeInterruptFall,
  37. GpioModeInterruptRiseFall,
  38. GpioModeEventRise,
  39. GpioModeEventFall,
  40. GpioModeEventRiseFall,
  41. } GpioMode;
  42. /**
  43. * Gpio pull modes
  44. */
  45. typedef enum {
  46. GpioPullNo,
  47. GpioPullUp,
  48. GpioPullDown,
  49. } GpioPull;
  50. /**
  51. * Gpio speed modes
  52. */
  53. typedef enum {
  54. GpioSpeedLow,
  55. GpioSpeedMedium,
  56. GpioSpeedHigh,
  57. GpioSpeedVeryHigh,
  58. } GpioSpeed;
  59. /**
  60. * Gpio alternate functions
  61. */
  62. typedef enum {
  63. GpioAltFn0MCO = 0, /*!< MCO Alternate Function mapping */
  64. GpioAltFn0LSCO = 0, /*!< LSCO Alternate Function mapping */
  65. GpioAltFn0JTMS_SWDIO = 0, /*!< JTMS-SWDIO Alternate Function mapping */
  66. GpioAltFn0JTCK_SWCLK = 0, /*!< JTCK-SWCLK Alternate Function mapping */
  67. GpioAltFn0JTDI = 0, /*!< JTDI Alternate Function mapping */
  68. GpioAltFn0RTC_OUT = 0, /*!< RCT_OUT Alternate Function mapping */
  69. GpioAltFn0JTD_TRACE = 0, /*!< JTDO-TRACESWO Alternate Function mapping */
  70. GpioAltFn0NJTRST = 0, /*!< NJTRST Alternate Function mapping */
  71. GpioAltFn0RTC_REFIN = 0, /*!< RTC_REFIN Alternate Function mapping */
  72. GpioAltFn0TRACED0 = 0, /*!< TRACED0 Alternate Function mapping */
  73. GpioAltFn0TRACED1 = 0, /*!< TRACED1 Alternate Function mapping */
  74. GpioAltFn0TRACED2 = 0, /*!< TRACED2 Alternate Function mapping */
  75. GpioAltFn0TRACED3 = 0, /*!< TRACED3 Alternate Function mapping */
  76. GpioAltFn0TRIG_INOUT = 0, /*!< TRIG_INOUT Alternate Function mapping */
  77. GpioAltFn0TRACECK = 0, /*!< TRACECK Alternate Function mapping */
  78. GpioAltFn0SYS = 0, /*!< System Function mapping */
  79. GpioAltFn1TIM1 = 1, /*!< TIM1 Alternate Function mapping */
  80. GpioAltFn1TIM2 = 1, /*!< TIM2 Alternate Function mapping */
  81. GpioAltFn1LPTIM1 = 1, /*!< LPTIM1 Alternate Function mapping */
  82. GpioAltFn2TIM2 = 2, /*!< TIM2 Alternate Function mapping */
  83. GpioAltFn2TIM1 = 2, /*!< TIM1 Alternate Function mapping */
  84. GpioAltFn3SAI1 = 3, /*!< SAI1_CK1 Alternate Function mapping */
  85. GpioAltFn3SPI2 = 3, /*!< SPI2 Alternate Function mapping */
  86. GpioAltFn3TIM1 = 3, /*!< TIM1 Alternate Function mapping */
  87. GpioAltFn4I2C1 = 4, /*!< I2C1 Alternate Function mapping */
  88. GpioAltFn4I2C3 = 4, /*!< I2C3 Alternate Function mapping */
  89. GpioAltFn5SPI1 = 5, /*!< SPI1 Alternate Function mapping */
  90. GpioAltFn5SPI2 = 5, /*!< SPI2 Alternate Function mapping */
  91. GpioAltFn6MCO = 6, /*!< MCO Alternate Function mapping */
  92. GpioAltFn6LSCO = 6, /*!< LSCO Alternate Function mapping */
  93. GpioAltFn6RF_DTB0 = 6, /*!< RF_DTB0 Alternate Function mapping */
  94. GpioAltFn6RF_DTB1 = 6, /*!< RF_DTB1 Alternate Function mapping */
  95. GpioAltFn6RF_DTB2 = 6, /*!< RF_DTB2 Alternate Function mapping */
  96. GpioAltFn6RF_DTB3 = 6, /*!< RF_DTB3 Alternate Function mapping */
  97. GpioAltFn6RF_DTB4 = 6, /*!< RF_DTB4 Alternate Function mapping */
  98. GpioAltFn6RF_DTB5 = 6, /*!< RF_DTB5 Alternate Function mapping */
  99. GpioAltFn6RF_DTB6 = 6, /*!< RF_DTB6 Alternate Function mapping */
  100. GpioAltFn6RF_DTB7 = 6, /*!< RF_DTB7 Alternate Function mapping */
  101. GpioAltFn6RF_DTB8 = 6, /*!< RF_DTB8 Alternate Function mapping */
  102. GpioAltFn6RF_DTB9 = 6, /*!< RF_DTB9 Alternate Function mapping */
  103. GpioAltFn6RF_DTB10 = 6, /*!< RF_DTB10 Alternate Function mapping */
  104. GpioAltFn6RF_DTB11 = 6, /*!< RF_DTB11 Alternate Function mapping */
  105. GpioAltFn6RF_DTB12 = 6, /*!< RF_DTB12 Alternate Function mapping */
  106. GpioAltFn6RF_DTB13 = 6, /*!< RF_DTB13 Alternate Function mapping */
  107. GpioAltFn6RF_DTB14 = 6, /*!< RF_DTB14 Alternate Function mapping */
  108. GpioAltFn6RF_DTB15 = 6, /*!< RF_DTB15 Alternate Function mapping */
  109. GpioAltFn6RF_DTB16 = 6, /*!< RF_DTB16 Alternate Function mapping */
  110. GpioAltFn6RF_DTB17 = 6, /*!< RF_DTB17 Alternate Function mapping */
  111. GpioAltFn6RF_DTB18 = 6, /*!< RF_DTB18 Alternate Function mapping */
  112. GpioAltFn6RF_MISO = 6, /*!< RF_MISO Alternate Function mapping */
  113. GpioAltFn6RF_MOSI = 6, /*!< RF_MOSI Alternate Function mapping */
  114. GpioAltFn6RF_SCK = 6, /*!< RF_SCK Alternate Function mapping */
  115. GpioAltFn6RF_NSS = 6, /*!< RF_NSS Alternate Function mapping */
  116. GpioAltFn7USART1 = 7, /*!< USART1 Alternate Function mapping */
  117. GpioAltFn8LPUART1 = 8, /*!< LPUART1 Alternate Function mapping */
  118. GpioAltFn8IR = 8, /*!< IR Alternate Function mapping */
  119. GpioAltFn9TSC = 9, /*!< TSC Alternate Function mapping */
  120. GpioAltFn10QUADSPI = 10, /*!< QUADSPI Alternate Function mapping */
  121. GpioAltFn10USB = 10, /*!< USB Alternate Function mapping */
  122. GpioAltFn11LCD = 11, /*!< LCD Alternate Function mapping */
  123. GpioAltFn12COMP1 = 12, /*!< COMP1 Alternate Function mapping */
  124. GpioAltFn12COMP2 = 12, /*!< COMP2 Alternate Function mapping */
  125. GpioAltFn12TIM1 = 12, /*!< TIM1 Alternate Function mapping */
  126. GpioAltFn13SAI1 = 13, /*!< SAI1 Alternate Function mapping */
  127. GpioAltFn14TIM2 = 14, /*!< TIM2 Alternate Function mapping */
  128. GpioAltFn14TIM16 = 14, /*!< TIM16 Alternate Function mapping */
  129. GpioAltFn14TIM17 = 14, /*!< TIM17 Alternate Function mapping */
  130. GpioAltFn14LPTIM2 = 14, /*!< LPTIM2 Alternate Function mapping */
  131. GpioAltFn15EVENTOUT = 15, /*!< EVENTOUT Alternate Function mapping */
  132. GpioAltFnUnused = 16, /*!< just dummy value */
  133. } GpioAltFn;
  134. /**
  135. * Gpio structure
  136. */
  137. typedef struct {
  138. GPIO_TypeDef* port;
  139. uint16_t pin;
  140. } GpioPin;
  141. /**
  142. * GPIO initialization function, simple version
  143. * @param gpio GpioPin
  144. * @param mode GpioMode
  145. */
  146. void furi_hal_gpio_init_simple(const GpioPin* gpio, const GpioMode mode);
  147. /**
  148. * GPIO initialization function, normal version
  149. * @param gpio GpioPin
  150. * @param mode GpioMode
  151. * @param pull GpioPull
  152. * @param speed GpioSpeed
  153. */
  154. void furi_hal_gpio_init(
  155. const GpioPin* gpio,
  156. const GpioMode mode,
  157. const GpioPull pull,
  158. const GpioSpeed speed);
  159. /**
  160. * GPIO initialization function, extended version
  161. * @param gpio GpioPin
  162. * @param mode GpioMode
  163. * @param pull GpioPull
  164. * @param speed GpioSpeed
  165. * @param alt_fn GpioAltFn
  166. */
  167. void furi_hal_gpio_init_ex(
  168. const GpioPin* gpio,
  169. const GpioMode mode,
  170. const GpioPull pull,
  171. const GpioSpeed speed,
  172. const GpioAltFn alt_fn);
  173. /**
  174. * Add and enable interrupt
  175. * @param gpio GpioPin
  176. * @param cb GpioExtiCallback
  177. * @param ctx context for callback
  178. */
  179. void furi_hal_gpio_add_int_callback(const GpioPin* gpio, GpioExtiCallback cb, void* ctx);
  180. /**
  181. * Enable interrupt
  182. * @param gpio GpioPin
  183. */
  184. void furi_hal_gpio_enable_int_callback(const GpioPin* gpio);
  185. /**
  186. * Disable interrupt
  187. * @param gpio GpioPin
  188. */
  189. void furi_hal_gpio_disable_int_callback(const GpioPin* gpio);
  190. /**
  191. * Remove interrupt
  192. * @param gpio GpioPin
  193. */
  194. void furi_hal_gpio_remove_int_callback(const GpioPin* gpio);
  195. /**
  196. * GPIO write pin
  197. * @param gpio GpioPin
  198. * @param state true / false
  199. */
  200. static inline void furi_hal_gpio_write(const GpioPin* gpio, const bool state) {
  201. // writing to BSSR is an atomic operation
  202. if(state == true) {
  203. gpio->port->BSRR = gpio->pin;
  204. } else {
  205. gpio->port->BSRR = (uint32_t)gpio->pin << GPIO_NUMBER;
  206. }
  207. }
  208. /**
  209. * GPIO read pin
  210. * @param port GPIO port
  211. * @param pin pin mask
  212. * @return true / false
  213. */
  214. static inline void
  215. furi_hal_gpio_write_port_pin(GPIO_TypeDef* port, uint16_t pin, const bool state) {
  216. // writing to BSSR is an atomic operation
  217. if(state == true) {
  218. port->BSRR = pin;
  219. } else {
  220. port->BSRR = pin << GPIO_NUMBER;
  221. }
  222. }
  223. /**
  224. * GPIO read pin
  225. * @param gpio GpioPin
  226. * @return true / false
  227. */
  228. static inline bool furi_hal_gpio_read(const GpioPin* gpio) {
  229. if((gpio->port->IDR & gpio->pin) != 0x00U) {
  230. return true;
  231. } else {
  232. return false;
  233. }
  234. }
  235. /**
  236. * GPIO read pin
  237. * @param port GPIO port
  238. * @param pin pin mask
  239. * @return true / false
  240. */
  241. static inline bool furi_hal_gpio_read_port_pin(GPIO_TypeDef* port, uint16_t pin) {
  242. if((port->IDR & pin) != 0x00U) {
  243. return true;
  244. } else {
  245. return false;
  246. }
  247. }
  248. #ifdef __cplusplus
  249. }
  250. #endif