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.

339 lines
8.4 KiB

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