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.

338 lines
8.4 KiB

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