drv_gpio.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2018-11-06 balanceTWK first version
  9. * 2019-04-23 WillianChan Fix GPIO serial number disorder
  10. * 2020-06-16 thread-liu add STM32MP1
  11. * 2020-09-01 thread-liu add GPIOZ
  12. * 2020-09-18 geniusgogo optimization design pin-index algorithm
  13. */
  14. #include <board.h>
  15. #include "drv_gpio.h"
  16. #ifdef RT_USING_PIN
  17. #define PIN_NUM(port, no) (((((port) & 0xFu) << 4) | ((no) & 0xFu)))
  18. #define PIN_PORT(pin) ((uint8_t)(((pin) >> 4) & 0xFu))
  19. #define PIN_NO(pin) ((uint8_t)((pin) & 0xFu))
  20. #if defined(SOC_SERIES_STM32MP1)
  21. #if defined(GPIOZ)
  22. #define gpioz_port_base (175) /* PIN_STPORT_MAX * 16 - 16 */
  23. #define PIN_STPORT(pin) ((pin > gpioz_port_base) ? ((GPIO_TypeDef *)(GPIOZ_BASE )) : ((GPIO_TypeDef *)(GPIOA_BASE + (0x1000u * PIN_PORT(pin)))))
  24. #else
  25. #define PIN_STPORT(pin) ((GPIO_TypeDef *)(GPIOA_BASE + (0x1000u * PIN_PORT(pin))))
  26. #endif /* GPIOZ */
  27. #else
  28. #define PIN_STPORT(pin) ((GPIO_TypeDef *)(GPIOA_BASE + (0x400u * PIN_PORT(pin))))
  29. #endif /* SOC_SERIES_STM32MP1 */
  30. #define PIN_STPIN(pin) ((uint16_t)(1u << PIN_NO(pin)))
  31. #if defined(GPIOZ)
  32. #define __STM32_PORT_MAX 12u
  33. #elif defined(GPIOK)
  34. #define __STM32_PORT_MAX 11u
  35. #elif defined(GPIOJ)
  36. #define __STM32_PORT_MAX 10u
  37. #elif defined(GPIOI)
  38. #define __STM32_PORT_MAX 9u
  39. #elif defined(GPIOH)
  40. #define __STM32_PORT_MAX 8u
  41. #elif defined(GPIOG)
  42. #define __STM32_PORT_MAX 7u
  43. #elif defined(GPIOF)
  44. #define __STM32_PORT_MAX 6u
  45. #elif defined(GPIOE)
  46. #define __STM32_PORT_MAX 5u
  47. #elif defined(GPIOD)
  48. #define __STM32_PORT_MAX 4u
  49. #elif defined(GPIOC)
  50. #define __STM32_PORT_MAX 3u
  51. #elif defined(GPIOB)
  52. #define __STM32_PORT_MAX 2u
  53. #elif defined(GPIOA)
  54. #define __STM32_PORT_MAX 1u
  55. #else
  56. #define __STM32_PORT_MAX 0u
  57. #error Unsupported STM32 GPIO peripheral.
  58. #endif
  59. #define PIN_STPORT_MAX __STM32_PORT_MAX
  60. static const struct pin_irq_map pin_irq_map[] =
  61. {
  62. #if defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32L0) || defined(SOC_SERIES_STM32G0)
  63. {GPIO_PIN_0, EXTI0_1_IRQn},
  64. {GPIO_PIN_1, EXTI0_1_IRQn},
  65. {GPIO_PIN_2, EXTI2_3_IRQn},
  66. {GPIO_PIN_3, EXTI2_3_IRQn},
  67. {GPIO_PIN_4, EXTI4_15_IRQn},
  68. {GPIO_PIN_5, EXTI4_15_IRQn},
  69. {GPIO_PIN_6, EXTI4_15_IRQn},
  70. {GPIO_PIN_7, EXTI4_15_IRQn},
  71. {GPIO_PIN_8, EXTI4_15_IRQn},
  72. {GPIO_PIN_9, EXTI4_15_IRQn},
  73. {GPIO_PIN_10, EXTI4_15_IRQn},
  74. {GPIO_PIN_11, EXTI4_15_IRQn},
  75. {GPIO_PIN_12, EXTI4_15_IRQn},
  76. {GPIO_PIN_13, EXTI4_15_IRQn},
  77. {GPIO_PIN_14, EXTI4_15_IRQn},
  78. {GPIO_PIN_15, EXTI4_15_IRQn},
  79. #elif defined(SOC_SERIES_STM32MP1)
  80. {GPIO_PIN_0, EXTI0_IRQn},
  81. {GPIO_PIN_1, EXTI1_IRQn},
  82. {GPIO_PIN_2, EXTI2_IRQn},
  83. {GPIO_PIN_3, EXTI3_IRQn},
  84. {GPIO_PIN_4, EXTI4_IRQn},
  85. {GPIO_PIN_5, EXTI5_IRQn},
  86. {GPIO_PIN_6, EXTI6_IRQn},
  87. {GPIO_PIN_7, EXTI7_IRQn},
  88. {GPIO_PIN_8, EXTI8_IRQn},
  89. {GPIO_PIN_9, EXTI9_IRQn},
  90. {GPIO_PIN_10, EXTI10_IRQn},
  91. {GPIO_PIN_11, EXTI11_IRQn},
  92. {GPIO_PIN_12, EXTI12_IRQn},
  93. {GPIO_PIN_13, EXTI13_IRQn},
  94. {GPIO_PIN_14, EXTI14_IRQn},
  95. {GPIO_PIN_15, EXTI15_IRQn},
  96. #else
  97. {GPIO_PIN_0, EXTI0_IRQn},
  98. {GPIO_PIN_1, EXTI1_IRQn},
  99. {GPIO_PIN_2, EXTI2_IRQn},
  100. {GPIO_PIN_3, EXTI3_IRQn},
  101. {GPIO_PIN_4, EXTI4_IRQn},
  102. {GPIO_PIN_5, EXTI9_5_IRQn},
  103. {GPIO_PIN_6, EXTI9_5_IRQn},
  104. {GPIO_PIN_7, EXTI9_5_IRQn},
  105. {GPIO_PIN_8, EXTI9_5_IRQn},
  106. {GPIO_PIN_9, EXTI9_5_IRQn},
  107. {GPIO_PIN_10, EXTI15_10_IRQn},
  108. {GPIO_PIN_11, EXTI15_10_IRQn},
  109. {GPIO_PIN_12, EXTI15_10_IRQn},
  110. {GPIO_PIN_13, EXTI15_10_IRQn},
  111. {GPIO_PIN_14, EXTI15_10_IRQn},
  112. {GPIO_PIN_15, EXTI15_10_IRQn},
  113. #endif
  114. };
  115. static struct rt_pin_irq_hdr pin_irq_hdr_tab[] =
  116. {
  117. {-1, 0, RT_NULL, RT_NULL},
  118. {-1, 0, RT_NULL, RT_NULL},
  119. {-1, 0, RT_NULL, RT_NULL},
  120. {-1, 0, RT_NULL, RT_NULL},
  121. {-1, 0, RT_NULL, RT_NULL},
  122. {-1, 0, RT_NULL, RT_NULL},
  123. {-1, 0, RT_NULL, RT_NULL},
  124. {-1, 0, RT_NULL, RT_NULL},
  125. {-1, 0, RT_NULL, RT_NULL},
  126. {-1, 0, RT_NULL, RT_NULL},
  127. {-1, 0, RT_NULL, RT_NULL},
  128. {-1, 0, RT_NULL, RT_NULL},
  129. {-1, 0, RT_NULL, RT_NULL},
  130. {-1, 0, RT_NULL, RT_NULL},
  131. {-1, 0, RT_NULL, RT_NULL},
  132. {-1, 0, RT_NULL, RT_NULL},
  133. };
  134. static uint32_t pin_irq_enable_mask = 0;
  135. #define ITEM_NUM(items) sizeof(items) / sizeof(items[0])
  136. static rt_base_t stm32_pin_get(const char *name)
  137. {
  138. rt_base_t pin = 0;
  139. int hw_port_num, hw_pin_num = 0;
  140. int i, name_len;
  141. name_len = rt_strlen(name);
  142. if ((name_len < 4) || (name_len >= 6))
  143. {
  144. return -RT_EINVAL;
  145. }
  146. if ((name[0] != 'P') || (name[2] != '.'))
  147. {
  148. return -RT_EINVAL;
  149. }
  150. if ((name[1] >= 'A') && (name[1] <= 'Z'))
  151. {
  152. hw_port_num = (int)(name[1] - 'A');
  153. }
  154. else
  155. {
  156. return -RT_EINVAL;
  157. }
  158. for (i = 3; i < name_len; i++)
  159. {
  160. hw_pin_num *= 10;
  161. hw_pin_num += name[i] - '0';
  162. }
  163. pin = PIN_NUM(hw_port_num, hw_pin_num);
  164. return pin;
  165. }
  166. static void stm32_pin_write(rt_device_t dev, rt_base_t pin, rt_base_t value)
  167. {
  168. GPIO_TypeDef *gpio_port;
  169. uint16_t gpio_pin;
  170. if (PIN_PORT(pin) < PIN_STPORT_MAX)
  171. {
  172. gpio_port = PIN_STPORT(pin);
  173. gpio_pin = PIN_STPIN(pin);
  174. HAL_GPIO_WritePin(gpio_port, gpio_pin, (GPIO_PinState)value);
  175. }
  176. }
  177. static int stm32_pin_read(rt_device_t dev, rt_base_t pin)
  178. {
  179. GPIO_TypeDef *gpio_port;
  180. uint16_t gpio_pin;
  181. int value = PIN_LOW;
  182. if (PIN_PORT(pin) < PIN_STPORT_MAX)
  183. {
  184. gpio_port = PIN_STPORT(pin);
  185. gpio_pin = PIN_STPIN(pin);
  186. value = HAL_GPIO_ReadPin(gpio_port, gpio_pin);
  187. }
  188. return value;
  189. }
  190. static void stm32_pin_mode(rt_device_t dev, rt_base_t pin, rt_base_t mode)
  191. {
  192. GPIO_InitTypeDef GPIO_InitStruct;
  193. if (PIN_PORT(pin) >= PIN_STPORT_MAX)
  194. {
  195. return;
  196. }
  197. /* Configure GPIO_InitStructure */
  198. GPIO_InitStruct.Pin = PIN_STPIN(pin);
  199. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  200. GPIO_InitStruct.Pull = GPIO_NOPULL;
  201. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  202. if (mode == PIN_MODE_OUTPUT)
  203. {
  204. /* output setting */
  205. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  206. GPIO_InitStruct.Pull = GPIO_NOPULL;
  207. }
  208. else if (mode == PIN_MODE_INPUT)
  209. {
  210. /* input setting: not pull. */
  211. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  212. GPIO_InitStruct.Pull = GPIO_NOPULL;
  213. }
  214. else if (mode == PIN_MODE_INPUT_PULLUP)
  215. {
  216. /* input setting: pull up. */
  217. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  218. GPIO_InitStruct.Pull = GPIO_PULLUP;
  219. }
  220. else if (mode == PIN_MODE_INPUT_PULLDOWN)
  221. {
  222. /* input setting: pull down. */
  223. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  224. GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  225. }
  226. else if (mode == PIN_MODE_OUTPUT_OD)
  227. {
  228. /* output setting: od. */
  229. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
  230. GPIO_InitStruct.Pull = GPIO_NOPULL;
  231. }
  232. HAL_GPIO_Init(PIN_STPORT(pin), &GPIO_InitStruct);
  233. }
  234. rt_inline rt_int32_t bit2bitno(rt_uint32_t bit)
  235. {
  236. int i;
  237. for (i = 0; i < 32; i++)
  238. {
  239. if ((0x01 << i) == bit)
  240. {
  241. return i;
  242. }
  243. }
  244. return -1;
  245. }
  246. rt_inline const struct pin_irq_map *get_pin_irq_map(uint32_t pinbit)
  247. {
  248. rt_int32_t mapindex = bit2bitno(pinbit);
  249. if (mapindex < 0 || mapindex >= ITEM_NUM(pin_irq_map))
  250. {
  251. return RT_NULL;
  252. }
  253. return &pin_irq_map[mapindex];
  254. };
  255. static rt_err_t stm32_pin_attach_irq(struct rt_device *device, rt_int32_t pin,
  256. rt_uint32_t mode, void (*hdr)(void *args), void *args)
  257. {
  258. rt_base_t level;
  259. rt_int32_t irqindex = -1;
  260. if (PIN_PORT(pin) >= PIN_STPORT_MAX)
  261. {
  262. return -RT_ENOSYS;
  263. }
  264. irqindex = bit2bitno(PIN_STPIN(pin));
  265. if (irqindex < 0 || irqindex >= ITEM_NUM(pin_irq_map))
  266. {
  267. return RT_ENOSYS;
  268. }
  269. level = rt_hw_interrupt_disable();
  270. if (pin_irq_hdr_tab[irqindex].pin == pin &&
  271. pin_irq_hdr_tab[irqindex].hdr == hdr &&
  272. pin_irq_hdr_tab[irqindex].mode == mode &&
  273. pin_irq_hdr_tab[irqindex].args == args)
  274. {
  275. rt_hw_interrupt_enable(level);
  276. return RT_EOK;
  277. }
  278. if (pin_irq_hdr_tab[irqindex].pin != -1)
  279. {
  280. rt_hw_interrupt_enable(level);
  281. return RT_EBUSY;
  282. }
  283. pin_irq_hdr_tab[irqindex].pin = pin;
  284. pin_irq_hdr_tab[irqindex].hdr = hdr;
  285. pin_irq_hdr_tab[irqindex].mode = mode;
  286. pin_irq_hdr_tab[irqindex].args = args;
  287. rt_hw_interrupt_enable(level);
  288. return RT_EOK;
  289. }
  290. static rt_err_t stm32_pin_dettach_irq(struct rt_device *device, rt_int32_t pin)
  291. {
  292. rt_base_t level;
  293. rt_int32_t irqindex = -1;
  294. if (PIN_PORT(pin) >= PIN_STPORT_MAX)
  295. {
  296. return -RT_ENOSYS;
  297. }
  298. irqindex = bit2bitno(PIN_STPIN(pin));
  299. if (irqindex < 0 || irqindex >= ITEM_NUM(pin_irq_map))
  300. {
  301. return RT_ENOSYS;
  302. }
  303. level = rt_hw_interrupt_disable();
  304. if (pin_irq_hdr_tab[irqindex].pin == -1)
  305. {
  306. rt_hw_interrupt_enable(level);
  307. return RT_EOK;
  308. }
  309. pin_irq_hdr_tab[irqindex].pin = -1;
  310. pin_irq_hdr_tab[irqindex].hdr = RT_NULL;
  311. pin_irq_hdr_tab[irqindex].mode = 0;
  312. pin_irq_hdr_tab[irqindex].args = RT_NULL;
  313. rt_hw_interrupt_enable(level);
  314. return RT_EOK;
  315. }
  316. static rt_err_t stm32_pin_irq_enable(struct rt_device *device, rt_base_t pin,
  317. rt_uint32_t enabled)
  318. {
  319. const struct pin_irq_map *irqmap;
  320. rt_base_t level;
  321. rt_int32_t irqindex = -1;
  322. GPIO_InitTypeDef GPIO_InitStruct;
  323. if (PIN_PORT(pin) >= PIN_STPORT_MAX)
  324. {
  325. return -RT_ENOSYS;
  326. }
  327. if (enabled == PIN_IRQ_ENABLE)
  328. {
  329. irqindex = bit2bitno(PIN_STPIN(pin));
  330. if (irqindex < 0 || irqindex >= ITEM_NUM(pin_irq_map))
  331. {
  332. return RT_ENOSYS;
  333. }
  334. level = rt_hw_interrupt_disable();
  335. if (pin_irq_hdr_tab[irqindex].pin == -1)
  336. {
  337. rt_hw_interrupt_enable(level);
  338. return RT_ENOSYS;
  339. }
  340. irqmap = &pin_irq_map[irqindex];
  341. /* Configure GPIO_InitStructure */
  342. GPIO_InitStruct.Pin = PIN_STPIN(pin);
  343. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  344. switch (pin_irq_hdr_tab[irqindex].mode)
  345. {
  346. case PIN_IRQ_MODE_RISING:
  347. GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  348. GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  349. break;
  350. case PIN_IRQ_MODE_FALLING:
  351. GPIO_InitStruct.Pull = GPIO_PULLUP;
  352. GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  353. break;
  354. case PIN_IRQ_MODE_RISING_FALLING:
  355. GPIO_InitStruct.Pull = GPIO_NOPULL;
  356. GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
  357. break;
  358. }
  359. HAL_GPIO_Init(PIN_STPORT(pin), &GPIO_InitStruct);
  360. HAL_NVIC_SetPriority(irqmap->irqno, 5, 0);
  361. HAL_NVIC_EnableIRQ(irqmap->irqno);
  362. pin_irq_enable_mask |= irqmap->pinbit;
  363. rt_hw_interrupt_enable(level);
  364. }
  365. else if (enabled == PIN_IRQ_DISABLE)
  366. {
  367. irqmap = get_pin_irq_map(PIN_STPIN(pin));
  368. if (irqmap == RT_NULL)
  369. {
  370. return RT_ENOSYS;
  371. }
  372. level = rt_hw_interrupt_disable();
  373. HAL_GPIO_DeInit(PIN_STPORT(pin), PIN_STPIN(pin));
  374. pin_irq_enable_mask &= ~irqmap->pinbit;
  375. #if defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32G0)
  376. if ((irqmap->pinbit >= GPIO_PIN_0) && (irqmap->pinbit <= GPIO_PIN_1))
  377. {
  378. if (!(pin_irq_enable_mask & (GPIO_PIN_0 | GPIO_PIN_1)))
  379. {
  380. HAL_NVIC_DisableIRQ(irqmap->irqno);
  381. }
  382. }
  383. else if ((irqmap->pinbit >= GPIO_PIN_2) && (irqmap->pinbit <= GPIO_PIN_3))
  384. {
  385. if (!(pin_irq_enable_mask & (GPIO_PIN_2 | GPIO_PIN_3)))
  386. {
  387. HAL_NVIC_DisableIRQ(irqmap->irqno);
  388. }
  389. }
  390. else if ((irqmap->pinbit >= GPIO_PIN_4) && (irqmap->pinbit <= GPIO_PIN_15))
  391. {
  392. if (!(pin_irq_enable_mask & (GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 |
  393. GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15)))
  394. {
  395. HAL_NVIC_DisableIRQ(irqmap->irqno);
  396. }
  397. }
  398. else
  399. {
  400. HAL_NVIC_DisableIRQ(irqmap->irqno);
  401. }
  402. #else
  403. if ((irqmap->pinbit >= GPIO_PIN_5) && (irqmap->pinbit <= GPIO_PIN_9))
  404. {
  405. if (!(pin_irq_enable_mask & (GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9)))
  406. {
  407. HAL_NVIC_DisableIRQ(irqmap->irqno);
  408. }
  409. }
  410. else if ((irqmap->pinbit >= GPIO_PIN_10) && (irqmap->pinbit <= GPIO_PIN_15))
  411. {
  412. if (!(pin_irq_enable_mask & (GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15)))
  413. {
  414. HAL_NVIC_DisableIRQ(irqmap->irqno);
  415. }
  416. }
  417. else
  418. {
  419. HAL_NVIC_DisableIRQ(irqmap->irqno);
  420. }
  421. #endif
  422. rt_hw_interrupt_enable(level);
  423. }
  424. else
  425. {
  426. return -RT_ENOSYS;
  427. }
  428. return RT_EOK;
  429. }
  430. const static struct rt_pin_ops _stm32_pin_ops =
  431. {
  432. stm32_pin_mode,
  433. stm32_pin_write,
  434. stm32_pin_read,
  435. stm32_pin_attach_irq,
  436. stm32_pin_dettach_irq,
  437. stm32_pin_irq_enable,
  438. stm32_pin_get,
  439. };
  440. rt_inline void pin_irq_hdr(int irqno)
  441. {
  442. if (pin_irq_hdr_tab[irqno].hdr)
  443. {
  444. pin_irq_hdr_tab[irqno].hdr(pin_irq_hdr_tab[irqno].args);
  445. }
  446. }
  447. #if defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32MP1)
  448. void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
  449. {
  450. pin_irq_hdr(bit2bitno(GPIO_Pin));
  451. }
  452. void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
  453. {
  454. pin_irq_hdr(bit2bitno(GPIO_Pin));
  455. }
  456. #else
  457. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  458. {
  459. pin_irq_hdr(bit2bitno(GPIO_Pin));
  460. }
  461. #endif
  462. #if defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32L0)
  463. void EXTI0_1_IRQHandler(void)
  464. {
  465. rt_interrupt_enter();
  466. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
  467. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1);
  468. rt_interrupt_leave();
  469. }
  470. void EXTI2_3_IRQHandler(void)
  471. {
  472. rt_interrupt_enter();
  473. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);
  474. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
  475. rt_interrupt_leave();
  476. }
  477. void EXTI4_15_IRQHandler(void)
  478. {
  479. rt_interrupt_enter();
  480. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
  481. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);
  482. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_6);
  483. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_7);
  484. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_8);
  485. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_9);
  486. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_10);
  487. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_11);
  488. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);
  489. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
  490. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14);
  491. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_15);
  492. rt_interrupt_leave();
  493. }
  494. #elif defined(SOC_STM32MP157A)
  495. void EXTI0_IRQHandler(void)
  496. {
  497. rt_interrupt_enter();
  498. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
  499. rt_interrupt_leave();
  500. }
  501. void EXTI1_IRQHandler(void)
  502. {
  503. rt_interrupt_enter();
  504. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1);
  505. rt_interrupt_leave();
  506. }
  507. void EXTI2_IRQHandler(void)
  508. {
  509. rt_interrupt_enter();
  510. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);
  511. rt_interrupt_leave();
  512. }
  513. void EXTI3_IRQHandler(void)
  514. {
  515. rt_interrupt_enter();
  516. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
  517. rt_interrupt_leave();
  518. }
  519. void EXTI4_IRQHandler(void)
  520. {
  521. rt_interrupt_enter();
  522. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
  523. rt_interrupt_leave();
  524. }
  525. void EXTI5_IRQHandler(void)
  526. {
  527. rt_interrupt_enter();
  528. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);
  529. rt_interrupt_leave();
  530. }
  531. void EXTI6_IRQHandler(void)
  532. {
  533. rt_interrupt_enter();
  534. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_6);
  535. rt_interrupt_leave();
  536. }
  537. void EXTI7_IRQHandler(void)
  538. {
  539. rt_interrupt_enter();
  540. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_7);
  541. rt_interrupt_leave();
  542. }
  543. void EXTI8_IRQHandler(void)
  544. {
  545. rt_interrupt_enter();
  546. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_8);
  547. rt_interrupt_leave();
  548. }
  549. void EXTI9_IRQHandler(void)
  550. {
  551. rt_interrupt_enter();
  552. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_9);
  553. rt_interrupt_leave();
  554. }
  555. void EXTI10_IRQHandler(void)
  556. {
  557. rt_interrupt_enter();
  558. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_10);
  559. rt_interrupt_leave();
  560. }
  561. void EXTI11_IRQHandler(void)
  562. {
  563. rt_interrupt_enter();
  564. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_11);
  565. rt_interrupt_leave();
  566. }
  567. void EXTI12_IRQHandler(void)
  568. {
  569. rt_interrupt_enter();
  570. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);
  571. rt_interrupt_leave();
  572. }
  573. void EXTI13_IRQHandler(void)
  574. {
  575. rt_interrupt_enter();
  576. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
  577. rt_interrupt_leave();
  578. }
  579. void EXTI14_IRQHandler(void)
  580. {
  581. rt_interrupt_enter();
  582. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14);
  583. rt_interrupt_leave();
  584. }
  585. void EXTI15_IRQHandler(void)
  586. {
  587. rt_interrupt_enter();
  588. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_15);
  589. rt_interrupt_leave();
  590. }
  591. #else
  592. void EXTI0_IRQHandler(void)
  593. {
  594. rt_interrupt_enter();
  595. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
  596. rt_interrupt_leave();
  597. }
  598. void EXTI1_IRQHandler(void)
  599. {
  600. rt_interrupt_enter();
  601. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1);
  602. rt_interrupt_leave();
  603. }
  604. void EXTI2_IRQHandler(void)
  605. {
  606. rt_interrupt_enter();
  607. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);
  608. rt_interrupt_leave();
  609. }
  610. void EXTI3_IRQHandler(void)
  611. {
  612. rt_interrupt_enter();
  613. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
  614. rt_interrupt_leave();
  615. }
  616. void EXTI4_IRQHandler(void)
  617. {
  618. rt_interrupt_enter();
  619. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
  620. rt_interrupt_leave();
  621. }
  622. void EXTI9_5_IRQHandler(void)
  623. {
  624. rt_interrupt_enter();
  625. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);
  626. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_6);
  627. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_7);
  628. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_8);
  629. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_9);
  630. rt_interrupt_leave();
  631. }
  632. void EXTI15_10_IRQHandler(void)
  633. {
  634. rt_interrupt_enter();
  635. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_10);
  636. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_11);
  637. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);
  638. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
  639. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14);
  640. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_15);
  641. rt_interrupt_leave();
  642. }
  643. #endif
  644. int rt_hw_pin_init(void)
  645. {
  646. #if defined(__HAL_RCC_GPIOA_CLK_ENABLE)
  647. __HAL_RCC_GPIOA_CLK_ENABLE();
  648. #endif
  649. #if defined(__HAL_RCC_GPIOB_CLK_ENABLE)
  650. __HAL_RCC_GPIOB_CLK_ENABLE();
  651. #endif
  652. #if defined(__HAL_RCC_GPIOC_CLK_ENABLE)
  653. __HAL_RCC_GPIOC_CLK_ENABLE();
  654. #endif
  655. #if defined(__HAL_RCC_GPIOD_CLK_ENABLE)
  656. __HAL_RCC_GPIOD_CLK_ENABLE();
  657. #endif
  658. #if defined(__HAL_RCC_GPIOE_CLK_ENABLE)
  659. __HAL_RCC_GPIOE_CLK_ENABLE();
  660. #endif
  661. #if defined(__HAL_RCC_GPIOF_CLK_ENABLE)
  662. __HAL_RCC_GPIOF_CLK_ENABLE();
  663. #endif
  664. #if defined(__HAL_RCC_GPIOG_CLK_ENABLE)
  665. #ifdef SOC_SERIES_STM32L4
  666. HAL_PWREx_EnableVddIO2();
  667. #endif
  668. __HAL_RCC_GPIOG_CLK_ENABLE();
  669. #endif
  670. #if defined(__HAL_RCC_GPIOH_CLK_ENABLE)
  671. __HAL_RCC_GPIOH_CLK_ENABLE();
  672. #endif
  673. #if defined(__HAL_RCC_GPIOI_CLK_ENABLE)
  674. __HAL_RCC_GPIOI_CLK_ENABLE();
  675. #endif
  676. #if defined(__HAL_RCC_GPIOJ_CLK_ENABLE)
  677. __HAL_RCC_GPIOJ_CLK_ENABLE();
  678. #endif
  679. #if defined(__HAL_RCC_GPIOK_CLK_ENABLE)
  680. __HAL_RCC_GPIOK_CLK_ENABLE();
  681. #endif
  682. return rt_device_pin_register("pin", &_stm32_pin_ops, RT_NULL);
  683. }
  684. #endif /* RT_USING_PIN */