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.

326 lines
8.0 KiB

1 year ago
1 year ago
1 year ago
  1. #include "zaf_gpio.h"
  2. static bool gpio_enable_clock(GPIO_TypeDef *m_gpio) {
  3. #ifdef GPIOA
  4. if (m_gpio == GPIOA) {
  5. __HAL_RCC_GPIOA_CLK_ENABLE();
  6. return true;
  7. }
  8. #endif
  9. #ifdef GPIOB
  10. if (m_gpio == GPIOB) {
  11. __HAL_RCC_GPIOB_CLK_ENABLE();
  12. return true;
  13. }
  14. #endif
  15. #ifdef GPIOC
  16. if (m_gpio == GPIOC) {
  17. __HAL_RCC_GPIOC_CLK_ENABLE();
  18. return true;
  19. }
  20. #endif
  21. #ifdef GPIOD
  22. if (m_gpio == GPIOD) {
  23. __HAL_RCC_GPIOD_CLK_ENABLE();
  24. return true;
  25. }
  26. #endif
  27. #ifdef GPIOE
  28. if (m_gpio == GPIOE) {
  29. __HAL_RCC_GPIOE_CLK_ENABLE();
  30. return true;
  31. }
  32. #endif
  33. #ifdef GPIOF
  34. if (m_gpio == GPIOF) {
  35. __HAL_RCC_GPIOF_CLK_ENABLE();
  36. return true;
  37. }
  38. #endif
  39. #ifdef GPIOG
  40. if (m_gpio == GPIOG) {
  41. __HAL_RCC_GPIOG_CLK_ENABLE();
  42. return true;
  43. }
  44. #endif
  45. #ifdef GPIOH
  46. if (m_gpio == GPIOH) {
  47. __HAL_RCC_GPIOH_CLK_ENABLE();
  48. return true;
  49. }
  50. #endif
  51. #ifdef GPIOI
  52. if (m_gpio == GPIOI) {
  53. __HAL_RCC_GPIOI_CLK_ENABLE();
  54. return true;
  55. }
  56. #endif
  57. #ifdef GPIOJ
  58. if (m_gpio == GPIOJ) {
  59. __HAL_RCC_GPIOJ_CLK_ENABLE();
  60. return true;
  61. }
  62. #endif
  63. #ifdef GPIOK
  64. if (m_gpio == GPIOK) {
  65. __HAL_RCC_GPIOK_CLK_ENABLE();
  66. return true;
  67. }
  68. #endif
  69. return false;
  70. }
  71. static GPIO_TypeDef *_chip_get_gpio(Pin_t pin) {
  72. int port = pin >> 4;
  73. switch (port) {
  74. case 1:
  75. #ifdef GPIOA
  76. return GPIOA;
  77. #endif
  78. break;
  79. case 2:
  80. #ifdef GPIOB
  81. return GPIOB;
  82. #endif
  83. break;
  84. case 3:
  85. #ifdef GPIOC
  86. return GPIOC;
  87. #endif
  88. break;
  89. case 4:
  90. #ifdef GPIOD
  91. return GPIOD;
  92. #endif
  93. break;
  94. case 5:
  95. #ifdef GPIOE
  96. return GPIOE;
  97. #endif
  98. break;
  99. case 6:
  100. #ifdef GPIOF
  101. return GPIOF;
  102. #endif
  103. break;
  104. case 7:
  105. #ifdef GPIOG
  106. return GPIOG;
  107. #endif
  108. break;
  109. default:
  110. break;
  111. }
  112. return NULL;
  113. }
  114. static uint16_t _chip_get_pinoff(Pin_t pin) {
  115. uint16_t pinoff = pin & 0x0F;
  116. switch (pinoff) {
  117. case 0:
  118. return GPIO_PIN_0;
  119. case 1:
  120. return GPIO_PIN_1;
  121. case 2:
  122. return GPIO_PIN_2;
  123. case 3:
  124. return GPIO_PIN_3;
  125. case 4:
  126. return GPIO_PIN_4;
  127. case 5:
  128. return GPIO_PIN_5;
  129. case 6:
  130. return GPIO_PIN_6;
  131. case 7:
  132. return GPIO_PIN_7;
  133. case 8:
  134. return GPIO_PIN_8;
  135. case 9:
  136. return GPIO_PIN_9;
  137. case 10:
  138. return GPIO_PIN_10;
  139. case 11:
  140. return GPIO_PIN_11;
  141. case 12:
  142. return GPIO_PIN_12;
  143. case 13:
  144. return GPIO_PIN_13;
  145. case 14:
  146. return GPIO_PIN_14;
  147. case 15:
  148. return GPIO_PIN_15;
  149. default:
  150. break;
  151. };
  152. return 0;
  153. }
  154. IRQn_Type getEXTIIRQn(int32_t m_pinoff) {
  155. switch (m_pinoff) {
  156. case GPIO_PIN_0:
  157. return EXTI0_IRQn;
  158. case GPIO_PIN_1:
  159. return EXTI1_IRQn;
  160. case GPIO_PIN_2:
  161. return EXTI2_IRQn;
  162. case GPIO_PIN_3:
  163. return EXTI3_IRQn;
  164. case GPIO_PIN_4:
  165. return EXTI4_IRQn;
  166. case GPIO_PIN_5:
  167. case GPIO_PIN_6:
  168. case GPIO_PIN_7:
  169. case GPIO_PIN_8:
  170. case GPIO_PIN_9:
  171. return EXTI9_5_IRQn;
  172. case GPIO_PIN_10:
  173. case GPIO_PIN_11:
  174. case GPIO_PIN_12:
  175. case GPIO_PIN_13:
  176. case GPIO_PIN_14:
  177. case GPIO_PIN_15:
  178. return EXTI15_10_IRQn;
  179. default:
  180. ZASSERT(0);
  181. }
  182. return EXTI0_IRQn;
  183. }
  184. void zaf_gpio_init_as_input(zaf_gpio_t *gpio, Pin_t pin,zaf_gpio_mode_t mode,zaf_gpio_irq_t irqtype, bool mirror) {
  185. if (pin == PinNull) return;
  186. gpio->mirror = mirror;
  187. gpio->mode = mode;
  188. gpio->irqtype = irqtype;
  189. gpio->gpiotype = kxs_gpio_input;
  190. gpio->pin = pin;
  191. gpio->gpio = _chip_get_gpio(pin);
  192. gpio->pinoff = _chip_get_pinoff(pin);
  193. // kxs_gpio_nopull, //
  194. // kxs_gpio_pullup, //
  195. // kxs_gpio_pulldown, //
  196. // kxs_gpio_od,
  197. uint32_t pulluptype = 0;
  198. if (mode == kxs_gpio_nopull) {
  199. pulluptype = GPIO_NOPULL;
  200. } else if (mode == kxs_gpio_pullup) {
  201. pulluptype = GPIO_PULLUP;
  202. } else if (mode == kxs_gpio_pulldown) {
  203. pulluptype = GPIO_PULLDOWN;
  204. }
  205. gpio_enable_clock(gpio->gpio);
  206. // kxs_gpio_no_irq,
  207. // kxs_gpio_rising_irq,
  208. // kxs_gpio_falling_irq,
  209. // kxs_gpio_rising_and_falling_irq,
  210. GPIO_InitTypeDef init_type_def = {0};
  211. if (gpio->irqtype == kxs_gpio_no_irq) {
  212. init_type_def.Pin = gpio->pinoff;
  213. init_type_def.Mode = GPIO_MODE_INPUT;
  214. init_type_def.Pull = pulluptype;
  215. init_type_def.Speed = GPIO_SPEED_FREQ_LOW;
  216. } else if (gpio->irqtype == kxs_gpio_rising_irq) {
  217. init_type_def.Pin = gpio->pinoff;
  218. init_type_def.Mode = gpio->mirror ? GPIO_MODE_IT_FALLING : GPIO_MODE_IT_RISING;
  219. init_type_def.Pull = pulluptype;
  220. init_type_def.Speed = GPIO_SPEED_FREQ_LOW;
  221. } else if (gpio->irqtype == kxs_gpio_falling_irq) {
  222. init_type_def.Pin = gpio->pinoff;
  223. init_type_def.Mode = !gpio->mirror ? GPIO_MODE_IT_FALLING : GPIO_MODE_IT_RISING;
  224. init_type_def.Pull = pulluptype;
  225. init_type_def.Speed = GPIO_SPEED_FREQ_LOW;
  226. } else if (gpio->irqtype == kxs_gpio_rising_and_falling_irq) {
  227. init_type_def.Pin = gpio->pinoff;
  228. init_type_def.Mode = GPIO_MODE_IT_RISING_FALLING;
  229. init_type_def.Pull = pulluptype;
  230. init_type_def.Speed = GPIO_SPEED_FREQ_LOW;
  231. }
  232. HAL_GPIO_Init(gpio->gpio, &init_type_def);
  233. if (gpio->irqtype != kxs_gpio_no_irq) {
  234. HAL_NVIC_SetPriority(getEXTIIRQn(gpio->pinoff), SDK_IRQ_PREEMPTPRIORITY_DEFAULT, 0);
  235. HAL_NVIC_EnableIRQ(getEXTIIRQn(gpio->pinoff));
  236. }
  237. gpio->inited = true;
  238. return;
  239. }
  240. void zaf_gpio_init_as_output(zaf_gpio_t *gpio, Pin_t pin,zaf_gpio_mode_t mode, bool mirror, bool initLevel) {
  241. if (pin == PinNull) return;
  242. gpio->mirror = mirror;
  243. gpio->mode = mode;
  244. gpio->irqtype = kxs_gpio_no_irq;
  245. gpio->gpiotype = kxs_gpio_output;
  246. gpio->pin = pin;
  247. gpio->gpio = _chip_get_gpio(pin);
  248. gpio->pinoff = _chip_get_pinoff(pin);
  249. gpio_enable_clock(gpio->gpio);
  250. GPIO_InitTypeDef init_type_def = {0};
  251. initLevel = gpio->mirror ? !initLevel : initLevel;
  252. GPIO_PinState pinState = initLevel ? GPIO_PIN_SET : GPIO_PIN_RESET;
  253. HAL_GPIO_WritePin(gpio->gpio, gpio->pinoff, pinState);
  254. if (gpio->mode == kxs_gpio_nopull) {
  255. init_type_def.Pin = gpio->pinoff;
  256. init_type_def.Mode = GPIO_MODE_OUTPUT_PP;
  257. init_type_def.Pull = GPIO_NOPULL;
  258. init_type_def.Speed = GPIO_SPEED_FREQ_LOW;
  259. } else if (gpio->mode == kxs_gpio_pullup) {
  260. init_type_def.Pin = gpio->pinoff;
  261. init_type_def.Mode = GPIO_MODE_OUTPUT_PP;
  262. init_type_def.Pull = GPIO_PULLUP;
  263. init_type_def.Speed = GPIO_SPEED_FREQ_LOW;
  264. } else if (gpio->mode == kxs_gpio_pulldown) {
  265. init_type_def.Pin = gpio->pinoff;
  266. init_type_def.Mode = GPIO_MODE_OUTPUT_PP;
  267. init_type_def.Pull = GPIO_PULLDOWN;
  268. init_type_def.Speed = GPIO_SPEED_FREQ_LOW;
  269. } else if (gpio->mode == kxs_gpio_od) {
  270. init_type_def.Pin = gpio->pinoff;
  271. init_type_def.Mode = GPIO_MODE_OUTPUT_OD;
  272. init_type_def.Pull = 0;
  273. init_type_def.Speed = GPIO_SPEED_FREQ_LOW;
  274. }
  275. HAL_GPIO_Init(gpio->gpio, &init_type_def);
  276. gpio->inited = true;
  277. return;
  278. }
  279. bool zaf_gpio_read(zaf_gpio_t *gpio) {
  280. GPIO_PinState pinState = HAL_GPIO_ReadPin(gpio->gpio, gpio->pinoff);
  281. return !gpio->mirror ? pinState == GPIO_PIN_SET : pinState != GPIO_PIN_SET;
  282. }
  283. void zaf_gpio_write(zaf_gpio_t *gpio, bool level) {
  284. level = gpio->mirror ? !level : level;
  285. GPIO_PinState pinState = level ? GPIO_PIN_SET : GPIO_PIN_RESET;
  286. HAL_GPIO_WritePin(gpio->gpio, gpio->pinoff, pinState);
  287. }
  288. void EXTI0_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); }
  289. void EXTI1_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1); }
  290. void EXTI2_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2); }
  291. void EXTI3_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3); }
  292. void EXTI4_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4); }
  293. void EXTI9_5_IRQHandler(void) {
  294. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);
  295. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_6);
  296. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_7);
  297. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_8);
  298. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_9);
  299. }
  300. void EXTI15_10_IRQHandler(void) {
  301. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_10);
  302. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_11);
  303. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);
  304. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
  305. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14);
  306. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_15);
  307. }