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.

488 lines
12 KiB

1 year ago
1 year ago
  1. #include "zgpio.hpp"
  2. extern "C" {
  3. #include "logger.h"
  4. }
  5. #define TAG "GPIO"
  6. #define PC_IRQ_PREEMPTPRIORITY_DEFAULT 5
  7. namespace iflytop {
  8. /*******************************************************************************
  9. * LISTENER *
  10. *******************************************************************************/
  11. static ZGPIO *s_irqGPIO[20];
  12. int s_irqGPIO_num = 0;
  13. extern "C" {
  14. /**
  15. * @brief This function handles EXTI line3 interrupt.
  16. */
  17. void EXTI0_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); }
  18. void EXTI1_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1); }
  19. void EXTI2_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2); }
  20. void EXTI3_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3); }
  21. void EXTI4_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4); }
  22. void EXTI9_5_IRQHandler(void) {
  23. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);
  24. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_6);
  25. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_7);
  26. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_8);
  27. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_9);
  28. }
  29. void EXTI15_10_IRQHandler(void) {
  30. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_10);
  31. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_11);
  32. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);
  33. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
  34. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14);
  35. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_15);
  36. }
  37. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
  38. for (int i = 0; i < s_irqGPIO_num; i++) {
  39. s_irqGPIO[i]->tryTriggerIRQ(GPIO_Pin);
  40. }
  41. }
  42. }
  43. void ZGPIO::regListener(onirq_t listener) { m_onirq = listener; }
  44. /*******************************************************************************
  45. * GPIOIMPL *
  46. *******************************************************************************/
  47. /*******************************************************************************
  48. * BASE_FUNC *
  49. *******************************************************************************/
  50. bool ZGPIO::enableClock() {
  51. #ifdef GPIOA
  52. if (m_gpio == GPIOA) {
  53. __HAL_RCC_GPIOA_CLK_ENABLE();
  54. return true;
  55. }
  56. #endif
  57. #ifdef GPIOB
  58. if (m_gpio == GPIOB) {
  59. __HAL_RCC_GPIOB_CLK_ENABLE();
  60. return true;
  61. }
  62. #endif
  63. #ifdef GPIOC
  64. if (m_gpio == GPIOC) {
  65. __HAL_RCC_GPIOC_CLK_ENABLE();
  66. return true;
  67. }
  68. #endif
  69. #ifdef GPIOD
  70. if (m_gpio == GPIOD) {
  71. __HAL_RCC_GPIOD_CLK_ENABLE();
  72. return true;
  73. }
  74. #endif
  75. #ifdef GPIOE
  76. if (m_gpio == GPIOE) {
  77. __HAL_RCC_GPIOE_CLK_ENABLE();
  78. return true;
  79. }
  80. #endif
  81. #ifdef GPIOF
  82. if (m_gpio == GPIOF) {
  83. __HAL_RCC_GPIOF_CLK_ENABLE();
  84. return true;
  85. }
  86. #endif
  87. #ifdef GPIOG
  88. if (m_gpio == GPIOG) {
  89. __HAL_RCC_GPIOG_CLK_ENABLE();
  90. return true;
  91. }
  92. #endif
  93. #ifdef GPIOH
  94. if (m_gpio == GPIOH) {
  95. __HAL_RCC_GPIOH_CLK_ENABLE();
  96. return true;
  97. }
  98. #endif
  99. #ifdef GPIOI
  100. if (m_gpio == GPIOI) {
  101. __HAL_RCC_GPIOI_CLK_ENABLE();
  102. return true;
  103. }
  104. #endif
  105. #ifdef GPIOJ
  106. if (m_gpio == GPIOJ) {
  107. __HAL_RCC_GPIOJ_CLK_ENABLE();
  108. return true;
  109. }
  110. #endif
  111. #ifdef GPIOK
  112. if (m_gpio == GPIOK) {
  113. __HAL_RCC_GPIOK_CLK_ENABLE();
  114. return true;
  115. }
  116. #endif
  117. return false;
  118. }
  119. void regIRQGPIO(ZGPIO *gpio) {
  120. for (int i = 0; i < s_irqGPIO_num; i++) {
  121. if (s_irqGPIO[i] == gpio) {
  122. return;
  123. }
  124. }
  125. EARLY_ASSERT((s_irqGPIO_num + 1) < (int)ZARRAY_SIZE(s_irqGPIO));
  126. s_irqGPIO[s_irqGPIO_num] = gpio;
  127. s_irqGPIO_num++;
  128. }
  129. bool ZGPIO::isMirror() { return m_mirror; }
  130. void ZGPIO::initAsInput(Pin_t pin, GPIOMode_t mode, GPIOIrqType_t irqtype, bool mirror) {
  131. if (pin == PinNull) return;
  132. m_mirror = mirror;
  133. m_mode = mode;
  134. m_irqtype = irqtype;
  135. m_gpiotype = kType_Input;
  136. m_pin = pin;
  137. m_gpio = stm32_get_gpio_group(pin);
  138. m_pinoff = stm32_get_pinoff(pin);
  139. uint32_t pulluptype = 0;
  140. if (mode == kMode_nopull) {
  141. pulluptype = GPIO_NOPULL;
  142. } else if (mode == kMode_pullup) {
  143. pulluptype = GPIO_PULLUP;
  144. } else if (mode == kMode_pulldown) {
  145. pulluptype = GPIO_PULLDOWN;
  146. }
  147. enableClock();
  148. GPIO_InitTypeDef m_GPIO_InitStruct = {0};
  149. if (m_irqtype == kIRQ_noIrq) {
  150. m_GPIO_InitStruct.Pin = m_pinoff;
  151. m_GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  152. m_GPIO_InitStruct.Pull = pulluptype;
  153. m_GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  154. } else if (m_irqtype == kIRQ_risingIrq) {
  155. m_GPIO_InitStruct.Pin = m_pinoff;
  156. m_GPIO_InitStruct.Mode = m_mirror ? GPIO_MODE_IT_FALLING : GPIO_MODE_IT_RISING;
  157. m_GPIO_InitStruct.Pull = pulluptype;
  158. m_GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  159. } else if (m_irqtype == kIRQ_fallingIrq) {
  160. m_GPIO_InitStruct.Pin = m_pinoff;
  161. m_GPIO_InitStruct.Mode = !m_mirror ? GPIO_MODE_IT_FALLING : GPIO_MODE_IT_RISING;
  162. m_GPIO_InitStruct.Pull = pulluptype;
  163. m_GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  164. } else if (m_irqtype == kIRQ_risingAndFallingIrq) {
  165. m_GPIO_InitStruct.Pin = m_pinoff;
  166. m_GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
  167. m_GPIO_InitStruct.Pull = pulluptype;
  168. m_GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  169. }
  170. HAL_GPIO_Init(m_gpio, &m_GPIO_InitStruct);
  171. if (m_irqtype != kIRQ_noIrq) {
  172. regIRQGPIO(this);
  173. lastLevel = getState();
  174. HAL_NVIC_SetPriority(getEXTIIRQn(), PC_IRQ_PREEMPTPRIORITY_DEFAULT, 0);
  175. HAL_NVIC_EnableIRQ(getEXTIIRQn());
  176. }
  177. m_initflag = true;
  178. return;
  179. }
  180. void ZGPIO::initAsOutput(Pin_t pin, GPIOMode_t mode, bool mirror, bool initLevel) {
  181. if (pin == PinNull) return;
  182. m_mirror = mirror;
  183. m_mode = mode;
  184. m_irqtype = kIRQ_noIrq;
  185. m_gpiotype = kType_Output;
  186. m_pin = pin;
  187. m_gpio = stm32_get_gpio_group(pin);
  188. m_pinoff = stm32_get_pinoff(pin);
  189. enableClock();
  190. GPIO_InitTypeDef m_GPIO_InitStruct = {0};
  191. initLevel = m_mirror ? !initLevel : initLevel;
  192. GPIO_PinState pinState = initLevel ? GPIO_PIN_SET : GPIO_PIN_RESET;
  193. HAL_GPIO_WritePin(m_gpio, m_pinoff, pinState);
  194. if (m_mode == kMode_nopull) {
  195. m_GPIO_InitStruct.Pin = m_pinoff;
  196. m_GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  197. m_GPIO_InitStruct.Pull = GPIO_NOPULL;
  198. m_GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  199. } else if (m_mode == kMode_pullup) {
  200. m_GPIO_InitStruct.Pin = m_pinoff;
  201. m_GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  202. m_GPIO_InitStruct.Pull = GPIO_PULLUP;
  203. m_GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  204. } else if (m_mode == kMode_pulldown) {
  205. m_GPIO_InitStruct.Pin = m_pinoff;
  206. m_GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  207. m_GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  208. m_GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  209. } else if (m_mode == kMode_od) {
  210. m_GPIO_InitStruct.Pin = m_pinoff;
  211. m_GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
  212. m_GPIO_InitStruct.Pull = 0;
  213. m_GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  214. }
  215. HAL_GPIO_Init(m_gpio, &m_GPIO_InitStruct);
  216. m_initflag = true;
  217. return;
  218. }
  219. bool ZGPIO::isItRisingEXITGPIO() { return m_irqtype == kIRQ_risingIrq; }
  220. bool ZGPIO::isItFallingEXITGPIO() { return m_irqtype == kIRQ_fallingIrq; }
  221. bool ZGPIO::isItRisingAndItFallingEXITGPIO() { return m_irqtype == kIRQ_risingAndFallingIrq; }
  222. /*******************************************************************************
  223. * EXT FUNC *
  224. *******************************************************************************/
  225. /**
  226. * @brief
  227. *
  228. * @param checkloop
  229. * @param GPIO_Pin
  230. * @return true
  231. * @return false
  232. *
  233. * STM32的GPIO中断线是共用的GPIO的即时状态判断是否是这个引脚产生的中??
  234. *
  235. * ??:
  236. * GPIO_MODE_IT_RISING ?? GPIO_MODE_IT_FALLING
  237. * GPIO_MODE_IT_RISING_FALLING true
  238. */
  239. bool ZGPIO::tryTriggerIRQ(uint16_t GPIO_Pin) {
  240. bool ret = false;
  241. bool nostate = false;
  242. if (GPIO_Pin != m_pinoff) return false;
  243. if (!(isItRisingEXITGPIO() || isItFallingEXITGPIO() || isItRisingAndItFallingEXITGPIO())) {
  244. return false;
  245. }
  246. nostate = getState();
  247. if (isItRisingEXITGPIO()) {
  248. if (nostate) {
  249. ret = true;
  250. if (m_onirq) {
  251. m_onirq(this, kRisingIrqEvent);
  252. }
  253. }
  254. } else if (isItFallingEXITGPIO()) {
  255. if (!nostate) {
  256. ret = true;
  257. if (m_onirq) {
  258. m_onirq(this, kFallingIrqEvent);
  259. }
  260. }
  261. } else {
  262. if (lastLevel != nostate) {
  263. ret = true;
  264. if (m_onirq) {
  265. if (lastLevel)
  266. m_onirq(this, kRisingIrqEvent);
  267. else
  268. m_onirq(this, kFallingIrqEvent);
  269. }
  270. }
  271. }
  272. lastLevel = nostate;
  273. return ret;
  274. }
  275. void ZGPIO::toggleState() { HAL_GPIO_TogglePin(m_gpio, m_pinoff); }
  276. uint32_t ZGPIO::getStateUint32() {
  277. if (getState())
  278. return 1;
  279. else
  280. return 0;
  281. }
  282. bool ZGPIO::getState() {
  283. if (m_pin == PinNull) return false;
  284. bool ret = false;
  285. if (HAL_GPIO_ReadPin(m_gpio, m_pinoff) == GPIO_PIN_SET) {
  286. ret = true;
  287. } else {
  288. ret = false;
  289. }
  290. if (m_mirror) ret = !ret;
  291. return ret;
  292. }
  293. bool ZGPIO::setState(bool state) {
  294. if (m_pin == PinNull) return true;
  295. if (m_mirror) state = !state;
  296. if (m_log_when_setstate) {
  297. ZLOGI(TAG, "%s%s set %d", stm32_gpio_group_get_name(m_gpio), stm32_pinoff_get_name(m_pinoff), state);
  298. }
  299. if (state) {
  300. HAL_GPIO_WritePin(m_gpio, m_pinoff, GPIO_PIN_SET);
  301. } else {
  302. HAL_GPIO_WritePin(m_gpio, m_pinoff, GPIO_PIN_RESET);
  303. }
  304. return true;
  305. }
  306. IRQn_Type ZGPIO::getEXTIIRQn() {
  307. switch (m_pinoff) {
  308. case GPIO_PIN_0:
  309. return EXTI0_IRQn;
  310. case GPIO_PIN_1:
  311. return EXTI1_IRQn;
  312. case GPIO_PIN_2:
  313. return EXTI2_IRQn;
  314. case GPIO_PIN_3:
  315. return EXTI3_IRQn;
  316. case GPIO_PIN_4:
  317. return EXTI4_IRQn;
  318. case GPIO_PIN_5:
  319. case GPIO_PIN_6:
  320. case GPIO_PIN_7:
  321. case GPIO_PIN_8:
  322. case GPIO_PIN_9:
  323. return EXTI9_5_IRQn;
  324. case GPIO_PIN_10:
  325. case GPIO_PIN_11:
  326. case GPIO_PIN_12:
  327. case GPIO_PIN_13:
  328. case GPIO_PIN_14:
  329. case GPIO_PIN_15:
  330. return EXTI15_10_IRQn;
  331. default:
  332. ZASSERT(0);
  333. }
  334. return EXTI0_IRQn;
  335. }
  336. /**
  337. * @brief GPIO为中断模??
  338. *
  339. * @param pull GPIO_NOPULL, GPIO_PULLUP, GPIO_PULLDOWN
  340. * @param mode GPIO_MODE_IT_RISING, GPIO_MODE_IT_FALLING, GPIO_MODE_IT_RISING_FALLING
  341. * @return true
  342. * @return false
  343. */
  344. } // namespace iflytop
  345. using namespace iflytop;
  346. ZGPIO IO_PA0(PA0);
  347. ZGPIO IO_PA1(PA1);
  348. ZGPIO IO_PA2(PA2);
  349. ZGPIO IO_PA3(PA3);
  350. ZGPIO IO_PA4(PA4);
  351. ZGPIO IO_PA5(PA5);
  352. ZGPIO IO_PA6(PA6);
  353. ZGPIO IO_PA7(PA7);
  354. ZGPIO IO_PA8(PA8);
  355. ZGPIO IO_PA9(PA9);
  356. ZGPIO IO_PA10(PA10);
  357. ZGPIO IO_PA11(PA11);
  358. ZGPIO IO_PA12(PA12);
  359. ZGPIO IO_PA13(PA13);
  360. ZGPIO IO_PA14(PA14);
  361. ZGPIO IO_PA15(PA15);
  362. ZGPIO IO_PB0(PB0);
  363. ZGPIO IO_PB1(PB1);
  364. ZGPIO IO_PB2(PB2);
  365. ZGPIO IO_PB3(PB3);
  366. ZGPIO IO_PB4(PB4);
  367. ZGPIO IO_PB5(PB5);
  368. ZGPIO IO_PB6(PB6);
  369. ZGPIO IO_PB7(PB7);
  370. ZGPIO IO_PB8(PB8);
  371. ZGPIO IO_PB9(PB9);
  372. ZGPIO IO_PB10(PB10);
  373. ZGPIO IO_PB11(PB11);
  374. ZGPIO IO_PB12(PB12);
  375. ZGPIO IO_PB13(PB13);
  376. ZGPIO IO_PB14(PB14);
  377. ZGPIO IO_PB15(PB15);
  378. ZGPIO IO_PC0(PC0);
  379. ZGPIO IO_PC1(PC1);
  380. ZGPIO IO_PC2(PC2);
  381. ZGPIO IO_PC3(PC3);
  382. ZGPIO IO_PC4(PC4);
  383. ZGPIO IO_PC5(PC5);
  384. ZGPIO IO_PC6(PC6);
  385. ZGPIO IO_PC7(PC7);
  386. ZGPIO IO_PC8(PC8);
  387. ZGPIO IO_PC9(PC9);
  388. ZGPIO IO_PC10(PC10);
  389. ZGPIO IO_PC11(PC11);
  390. ZGPIO IO_PC12(PC12);
  391. ZGPIO IO_PC13(PC13);
  392. ZGPIO IO_PC14(PC14);
  393. ZGPIO IO_PC15(PC15);
  394. ZGPIO IO_PD0(PD0);
  395. ZGPIO IO_PD1(PD1);
  396. ZGPIO IO_PD2(PD2);
  397. ZGPIO IO_PD3(PD3);
  398. ZGPIO IO_PD4(PD4);
  399. ZGPIO IO_PD5(PD5);
  400. ZGPIO IO_PD6(PD6);
  401. ZGPIO IO_PD7(PD7);
  402. ZGPIO IO_PD8(PD8);
  403. ZGPIO IO_PD9(PD9);
  404. ZGPIO IO_PD10(PD10);
  405. ZGPIO IO_PD11(PD11);
  406. ZGPIO IO_PD12(PD12);
  407. ZGPIO IO_PD13(PD13);
  408. ZGPIO IO_PD14(PD14);
  409. ZGPIO IO_PD15(PD15);
  410. ZGPIO IO_PE0(PE0);
  411. ZGPIO IO_PE1(PE1);
  412. ZGPIO IO_PE2(PE2);
  413. ZGPIO IO_PE3(PE3);
  414. ZGPIO IO_PE4(PE4);
  415. ZGPIO IO_PE5(PE5);
  416. ZGPIO IO_PE6(PE6);
  417. ZGPIO IO_PE7(PE7);
  418. ZGPIO IO_PE8(PE8);
  419. ZGPIO IO_PE9(PE9);
  420. ZGPIO IO_PE10(PE10);
  421. ZGPIO IO_PE11(PE11);
  422. ZGPIO IO_PE12(PE12);
  423. ZGPIO IO_PE13(PE13);
  424. ZGPIO IO_PE14(PE14);
  425. ZGPIO IO_PE15(PE15);
  426. ZGPIO IO_PF0(PF0);
  427. ZGPIO IO_PF1(PF1);
  428. ZGPIO IO_PF2(PF2);
  429. ZGPIO IO_PF3(PF3);
  430. ZGPIO IO_PF4(PF4);
  431. ZGPIO IO_PF5(PF5);
  432. ZGPIO IO_PF6(PF6);
  433. ZGPIO IO_PF7(PF7);
  434. ZGPIO IO_PF8(PF8);
  435. ZGPIO IO_PF9(PF9);
  436. ZGPIO IO_PF10(PF10);
  437. ZGPIO IO_PF11(PF11);
  438. ZGPIO IO_PF12(PF12);
  439. ZGPIO IO_PF13(PF13);
  440. ZGPIO IO_PF14(PF14);
  441. ZGPIO IO_PF15(PF15);
  442. ZGPIO IO_PG0(PG0);
  443. ZGPIO IO_PG1(PG1);
  444. ZGPIO IO_PG2(PG2);
  445. ZGPIO IO_PG3(PG3);
  446. ZGPIO IO_PG4(PG4);
  447. ZGPIO IO_PG5(PG5);
  448. ZGPIO IO_PG6(PG6);
  449. ZGPIO IO_PG7(PG7);
  450. ZGPIO IO_PG8(PG8);
  451. ZGPIO IO_PG9(PG9);
  452. ZGPIO IO_PG10(PG10);
  453. ZGPIO IO_PG11(PG11);
  454. ZGPIO IO_PG12(PG12);
  455. ZGPIO IO_PG13(PG13);
  456. ZGPIO IO_PG14(PG14);
  457. ZGPIO IO_PG15(PG15);