You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

234 lines
6.2 KiB

1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
  1. #pragma once
  2. #include <functional>
  3. #include "stm32/stm32.hpp"
  4. extern "C" {
  5. #include "logger.h"
  6. }
  7. namespace iflytop {
  8. using namespace std;
  9. #define STM32_GPIO_LISTENER_NUM 10
  10. class ZGPIO {
  11. public:
  12. typedef enum {
  13. kRisingIrqEvent,
  14. kFallingIrqEvent,
  15. } IrqTypeEvent_t;
  16. typedef enum {
  17. kMode_nopull, //
  18. kMode_pullup, //
  19. kMode_pulldown, //
  20. kMode_od, //
  21. } GPIOMode_t;
  22. typedef enum { kType_AIN, kType_Input, kType_Output } GPIOType_t;
  23. typedef enum {
  24. kIRQ_noIrq,
  25. kIRQ_risingIrq,
  26. kIRQ_fallingIrq,
  27. kIRQ_risingAndFallingIrq,
  28. } GPIOIrqType_t;
  29. typedef function<void(ZGPIO *GPIO_Pin, IrqTypeEvent_t irqevent)> onirq_t;
  30. typedef struct {
  31. Pin_t pin;
  32. GPIOMode_t mode;
  33. GPIOIrqType_t irqtype;
  34. bool mirror;
  35. } InputGpioCfg_t;
  36. typedef struct {
  37. Pin_t pin;
  38. GPIOMode_t mode;
  39. bool mirror;
  40. bool initLevel;
  41. bool log_when_setstate;
  42. } OutputGpioCfg_t;
  43. private:
  44. Pin_t m_pin = PinNull;
  45. GPIO_TypeDef *m_gpio;
  46. uint16_t m_pinoff;
  47. GPIOType_t m_gpiotype;
  48. GPIOMode_t m_mode;
  49. GPIOIrqType_t m_irqtype;
  50. bool m_mirror;
  51. bool lastLevel;
  52. bool m_log_when_setstate = false;
  53. onirq_t m_onirq;
  54. bool m_initflag;
  55. bool m_preset_pin = false;
  56. public:
  57. ZGPIO(){};
  58. ZGPIO(Pin_t pin) {
  59. m_pin = pin;
  60. m_preset_pin = true;
  61. };
  62. void initAsInput(Pin_t pin, GPIOMode_t mode, GPIOIrqType_t irqtype, bool mirror);
  63. void initAsOutput(Pin_t pin, GPIOMode_t mode, bool mirror, bool initLevel);
  64. void initAsOutput(OutputGpioCfg_t *outputcfg) {
  65. m_log_when_setstate = outputcfg->log_when_setstate;
  66. initAsOutput(outputcfg->pin, outputcfg->mode, outputcfg->mirror, outputcfg->initLevel);
  67. }
  68. void initAsInput(InputGpioCfg_t *inputcfg) { initAsInput(inputcfg->pin, inputcfg->mode, inputcfg->irqtype, inputcfg->mirror); }
  69. void initAsInput(GPIOMode_t mode, GPIOIrqType_t irqtype, bool mirror) {
  70. ZASSERT(m_preset_pin);
  71. initAsInput(m_pin, mode, irqtype, mirror);
  72. }
  73. void initAsOutput(GPIOMode_t mode, bool mirror, bool initLevel) {
  74. ZASSERT(m_preset_pin);
  75. initAsOutput(m_pin, mode, mirror, initLevel);
  76. }
  77. void enableTrace(bool enable) { m_log_when_setstate = enable; }
  78. void regListener(onirq_t listener);
  79. bool isMirror();
  80. bool isItRisingEXITGPIO();
  81. bool isItFallingEXITGPIO();
  82. bool isItRisingAndItFallingEXITGPIO();
  83. bool getState();
  84. uint32_t getStateUint32();
  85. bool setState(bool state);
  86. void toggleState();
  87. bool isNull() { return m_pin == PinNull; }
  88. Pin_t getPin() { return m_pin; }
  89. IRQn_Type getEXTIIRQn();
  90. GPIO_TypeDef *getHalPinPort() { return m_gpio; }
  91. uint16_t getHalPin() { return m_pinoff; }
  92. bool tryTriggerIRQ(uint16_t GPIO_Pin);
  93. bool isInit() { return m_initflag; }
  94. private:
  95. bool enableClock();
  96. };
  97. } // namespace iflytop
  98. extern iflytop::ZGPIO IO_PA0;
  99. extern iflytop::ZGPIO IO_PA1;
  100. extern iflytop::ZGPIO IO_PA2;
  101. extern iflytop::ZGPIO IO_PA3;
  102. extern iflytop::ZGPIO IO_PA4;
  103. extern iflytop::ZGPIO IO_PA5;
  104. extern iflytop::ZGPIO IO_PA6;
  105. extern iflytop::ZGPIO IO_PA7;
  106. extern iflytop::ZGPIO IO_PA8;
  107. extern iflytop::ZGPIO IO_PA9;
  108. extern iflytop::ZGPIO IO_PA10;
  109. extern iflytop::ZGPIO IO_PA11;
  110. extern iflytop::ZGPIO IO_PA12;
  111. extern iflytop::ZGPIO IO_PA13;
  112. extern iflytop::ZGPIO IO_PA14;
  113. extern iflytop::ZGPIO IO_PA15;
  114. extern iflytop::ZGPIO IO_PB0;
  115. extern iflytop::ZGPIO IO_PB1;
  116. extern iflytop::ZGPIO IO_PB2;
  117. extern iflytop::ZGPIO IO_PB3;
  118. extern iflytop::ZGPIO IO_PB4;
  119. extern iflytop::ZGPIO IO_PB5;
  120. extern iflytop::ZGPIO IO_PB6;
  121. extern iflytop::ZGPIO IO_PB7;
  122. extern iflytop::ZGPIO IO_PB8;
  123. extern iflytop::ZGPIO IO_PB9;
  124. extern iflytop::ZGPIO IO_PB10;
  125. extern iflytop::ZGPIO IO_PB11;
  126. extern iflytop::ZGPIO IO_PB12;
  127. extern iflytop::ZGPIO IO_PB13;
  128. extern iflytop::ZGPIO IO_PB14;
  129. extern iflytop::ZGPIO IO_PB15;
  130. extern iflytop::ZGPIO IO_PC0;
  131. extern iflytop::ZGPIO IO_PC1;
  132. extern iflytop::ZGPIO IO_PC2;
  133. extern iflytop::ZGPIO IO_PC3;
  134. extern iflytop::ZGPIO IO_PC4;
  135. extern iflytop::ZGPIO IO_PC5;
  136. extern iflytop::ZGPIO IO_PC6;
  137. extern iflytop::ZGPIO IO_PC7;
  138. extern iflytop::ZGPIO IO_PC8;
  139. extern iflytop::ZGPIO IO_PC9;
  140. extern iflytop::ZGPIO IO_PC10;
  141. extern iflytop::ZGPIO IO_PC11;
  142. extern iflytop::ZGPIO IO_PC12;
  143. extern iflytop::ZGPIO IO_PC13;
  144. extern iflytop::ZGPIO IO_PC14;
  145. extern iflytop::ZGPIO IO_PC15;
  146. extern iflytop::ZGPIO IO_PD0;
  147. extern iflytop::ZGPIO IO_PD1;
  148. extern iflytop::ZGPIO IO_PD2;
  149. extern iflytop::ZGPIO IO_PD3;
  150. extern iflytop::ZGPIO IO_PD4;
  151. extern iflytop::ZGPIO IO_PD5;
  152. extern iflytop::ZGPIO IO_PD6;
  153. extern iflytop::ZGPIO IO_PD7;
  154. extern iflytop::ZGPIO IO_PD8;
  155. extern iflytop::ZGPIO IO_PD9;
  156. extern iflytop::ZGPIO IO_PD10;
  157. extern iflytop::ZGPIO IO_PD11;
  158. extern iflytop::ZGPIO IO_PD12;
  159. extern iflytop::ZGPIO IO_PD13;
  160. extern iflytop::ZGPIO IO_PD14;
  161. extern iflytop::ZGPIO IO_PD15;
  162. extern iflytop::ZGPIO IO_PE0;
  163. extern iflytop::ZGPIO IO_PE1;
  164. extern iflytop::ZGPIO IO_PE2;
  165. extern iflytop::ZGPIO IO_PE3;
  166. extern iflytop::ZGPIO IO_PE4;
  167. extern iflytop::ZGPIO IO_PE5;
  168. extern iflytop::ZGPIO IO_PE6;
  169. extern iflytop::ZGPIO IO_PE7;
  170. extern iflytop::ZGPIO IO_PE8;
  171. extern iflytop::ZGPIO IO_PE9;
  172. extern iflytop::ZGPIO IO_PE10;
  173. extern iflytop::ZGPIO IO_PE11;
  174. extern iflytop::ZGPIO IO_PE12;
  175. extern iflytop::ZGPIO IO_PE13;
  176. extern iflytop::ZGPIO IO_PE14;
  177. extern iflytop::ZGPIO IO_PE15;
  178. extern iflytop::ZGPIO IO_PF0;
  179. extern iflytop::ZGPIO IO_PF1;
  180. extern iflytop::ZGPIO IO_PF2;
  181. extern iflytop::ZGPIO IO_PF3;
  182. extern iflytop::ZGPIO IO_PF4;
  183. extern iflytop::ZGPIO IO_PF5;
  184. extern iflytop::ZGPIO IO_PF6;
  185. extern iflytop::ZGPIO IO_PF7;
  186. extern iflytop::ZGPIO IO_PF8;
  187. extern iflytop::ZGPIO IO_PF9;
  188. extern iflytop::ZGPIO IO_PF10;
  189. extern iflytop::ZGPIO IO_PF11;
  190. extern iflytop::ZGPIO IO_PF12;
  191. extern iflytop::ZGPIO IO_PF13;
  192. extern iflytop::ZGPIO IO_PF14;
  193. extern iflytop::ZGPIO IO_PF15;
  194. extern iflytop::ZGPIO IO_PG0;
  195. extern iflytop::ZGPIO IO_PG1;
  196. extern iflytop::ZGPIO IO_PG2;
  197. extern iflytop::ZGPIO IO_PG3;
  198. extern iflytop::ZGPIO IO_PG4;
  199. extern iflytop::ZGPIO IO_PG5;
  200. extern iflytop::ZGPIO IO_PG6;
  201. extern iflytop::ZGPIO IO_PG7;
  202. extern iflytop::ZGPIO IO_PG8;
  203. extern iflytop::ZGPIO IO_PG9;
  204. extern iflytop::ZGPIO IO_PG10;
  205. extern iflytop::ZGPIO IO_PG11;
  206. extern iflytop::ZGPIO IO_PG12;
  207. extern iflytop::ZGPIO IO_PG13;
  208. extern iflytop::ZGPIO IO_PG14;
  209. extern iflytop::ZGPIO IO_PG15;