drv_gpio.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654
  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 change to new framework
  9. */
  10. #include <board.h>
  11. #include "drv_gpio.h"
  12. #ifdef RT_USING_PIN
  13. static const struct pin_index pins[] =
  14. {
  15. #ifdef GPIOA
  16. __STM32_PIN(0 , A, 0 ),
  17. __STM32_PIN(1 , A, 1 ),
  18. __STM32_PIN(2 , A, 2 ),
  19. __STM32_PIN(3 , A, 3 ),
  20. __STM32_PIN(4 , A, 4 ),
  21. __STM32_PIN(5 , A, 5 ),
  22. __STM32_PIN(6 , A, 6 ),
  23. __STM32_PIN(7 , A, 7 ),
  24. __STM32_PIN(8 , A, 8 ),
  25. __STM32_PIN(9 , A, 9 ),
  26. __STM32_PIN(10, A, 10),
  27. __STM32_PIN(11, A, 11),
  28. __STM32_PIN(12, A, 12),
  29. __STM32_PIN(13, A, 13),
  30. __STM32_PIN(14, A, 14),
  31. __STM32_PIN(15, A, 15),
  32. #endif
  33. #ifdef GPIOB
  34. __STM32_PIN(16, B, 0),
  35. __STM32_PIN(17, B, 1),
  36. __STM32_PIN(18, B, 2),
  37. __STM32_PIN(19, B, 3),
  38. __STM32_PIN(20, B, 4),
  39. __STM32_PIN(21, B, 5),
  40. __STM32_PIN(22, B, 6),
  41. __STM32_PIN(23, B, 7),
  42. __STM32_PIN(24, B, 8),
  43. __STM32_PIN(25, B, 9),
  44. __STM32_PIN(26, B, 10),
  45. __STM32_PIN(27, B, 11),
  46. __STM32_PIN(28, B, 12),
  47. __STM32_PIN(29, B, 13),
  48. __STM32_PIN(30, B, 14),
  49. __STM32_PIN(31, B, 15),
  50. #endif
  51. #ifdef GPIOC
  52. __STM32_PIN(32, C, 0),
  53. __STM32_PIN(33, C, 1),
  54. __STM32_PIN(34, C, 2),
  55. __STM32_PIN(35, C, 3),
  56. __STM32_PIN(36, C, 4),
  57. __STM32_PIN(37, C, 5),
  58. __STM32_PIN(38, C, 6),
  59. __STM32_PIN(39, C, 7),
  60. __STM32_PIN(40, C, 8),
  61. __STM32_PIN(41, C, 9),
  62. __STM32_PIN(42, C, 10),
  63. __STM32_PIN(43, C, 11),
  64. __STM32_PIN(44, C, 12),
  65. __STM32_PIN(45, C, 13),
  66. __STM32_PIN(46, C, 14),
  67. __STM32_PIN(47, C, 15),
  68. #endif
  69. #ifdef GPIOD
  70. __STM32_PIN(48, D, 0),
  71. __STM32_PIN(49, D, 1),
  72. __STM32_PIN(50, D, 2),
  73. __STM32_PIN(51, D, 3),
  74. __STM32_PIN(52, D, 4),
  75. __STM32_PIN(53, D, 5),
  76. __STM32_PIN(54, D, 6),
  77. __STM32_PIN(55, D, 7),
  78. __STM32_PIN(56, D, 8),
  79. __STM32_PIN(57, D, 9),
  80. __STM32_PIN(58, D, 10),
  81. __STM32_PIN(59, D, 11),
  82. __STM32_PIN(60, D, 12),
  83. __STM32_PIN(61, D, 13),
  84. __STM32_PIN(62, D, 14),
  85. __STM32_PIN(63, D, 15),
  86. #endif
  87. #ifdef GPIOE
  88. __STM32_PIN(64, E, 0),
  89. __STM32_PIN(65, E, 1),
  90. __STM32_PIN(66, E, 2),
  91. __STM32_PIN(67, E, 3),
  92. __STM32_PIN(68, E, 4),
  93. __STM32_PIN(69, E, 5),
  94. __STM32_PIN(70, E, 6),
  95. __STM32_PIN(71, E, 7),
  96. __STM32_PIN(72, E, 8),
  97. __STM32_PIN(73, E, 9),
  98. __STM32_PIN(74, E, 10),
  99. __STM32_PIN(75, E, 11),
  100. __STM32_PIN(76, E, 12),
  101. __STM32_PIN(77, E, 13),
  102. __STM32_PIN(78, E, 14),
  103. __STM32_PIN(79, E, 15),
  104. #endif
  105. #ifdef GPIOF
  106. __STM32_PIN(80, F, 0),
  107. __STM32_PIN(81, F, 1),
  108. __STM32_PIN(82, F, 2),
  109. __STM32_PIN(83, F, 3),
  110. __STM32_PIN(84, F, 4),
  111. __STM32_PIN(85, F, 5),
  112. __STM32_PIN(86, F, 6),
  113. __STM32_PIN(87, F, 7),
  114. __STM32_PIN(88, F, 8),
  115. __STM32_PIN(89, F, 9),
  116. __STM32_PIN(90, F, 10),
  117. __STM32_PIN(91, F, 11),
  118. __STM32_PIN(92, F, 12),
  119. __STM32_PIN(93, F, 13),
  120. __STM32_PIN(94, F, 14),
  121. __STM32_PIN(95, F, 15),
  122. #endif
  123. #ifdef GPIOG
  124. __STM32_PIN(96, G, 0),
  125. __STM32_PIN(97, G, 1),
  126. __STM32_PIN(98, G, 2),
  127. __STM32_PIN(99, G, 3),
  128. __STM32_PIN(100, G, 4),
  129. __STM32_PIN(101, G, 5),
  130. __STM32_PIN(102, G, 6),
  131. __STM32_PIN(103, G, 7),
  132. __STM32_PIN(104, G, 8),
  133. __STM32_PIN(105, G, 9),
  134. __STM32_PIN(106, G, 10),
  135. __STM32_PIN(107, G, 11),
  136. __STM32_PIN(108, G, 12),
  137. __STM32_PIN(109, G, 13),
  138. __STM32_PIN(110, G, 14),
  139. __STM32_PIN(111, G, 15),
  140. #endif
  141. #ifdef GPIOH
  142. __STM32_PIN(112, H, 0),
  143. __STM32_PIN(113, H, 1),
  144. __STM32_PIN(114, H, 2),
  145. __STM32_PIN(115, H, 3),
  146. __STM32_PIN(116, H, 4),
  147. __STM32_PIN(117, H, 5),
  148. __STM32_PIN(118, H, 6),
  149. __STM32_PIN(119, H, 7),
  150. __STM32_PIN(120, H, 8),
  151. __STM32_PIN(121, H, 9),
  152. __STM32_PIN(122, H, 10),
  153. __STM32_PIN(124, H, 11),
  154. __STM32_PIN(125, H, 12),
  155. __STM32_PIN(126, H, 13),
  156. __STM32_PIN(127, H, 14),
  157. __STM32_PIN(128, H, 15),
  158. #endif
  159. #ifdef GPIOI
  160. __STM32_PIN(129, I, 0),
  161. __STM32_PIN(130, I, 1),
  162. __STM32_PIN(131, I, 2),
  163. __STM32_PIN(132, I, 3),
  164. __STM32_PIN(133, I, 4),
  165. __STM32_PIN(134, I, 5),
  166. __STM32_PIN(135, I, 6),
  167. __STM32_PIN(136, I, 7),
  168. __STM32_PIN(137, I, 8),
  169. __STM32_PIN(138, I, 9),
  170. __STM32_PIN(139, I, 10),
  171. __STM32_PIN(140, I, 11),
  172. __STM32_PIN(141, I, 12),
  173. __STM32_PIN(142, I, 13),
  174. __STM32_PIN(143, I, 14),
  175. __STM32_PIN(144, I, 15),
  176. #endif
  177. #ifdef GPIOJ
  178. __STM32_PIN(145, J, 0),
  179. __STM32_PIN(146, J, 1),
  180. __STM32_PIN(147, J, 2),
  181. __STM32_PIN(148, J, 3),
  182. __STM32_PIN(149, J, 4),
  183. __STM32_PIN(150, J, 5),
  184. __STM32_PIN(151, J, 6),
  185. __STM32_PIN(152, J, 7),
  186. __STM32_PIN(153, J, 8),
  187. __STM32_PIN(154, J, 9),
  188. __STM32_PIN(155, J, 10),
  189. __STM32_PIN(156, J, 11),
  190. __STM32_PIN(157, J, 12),
  191. __STM32_PIN(158, J, 13),
  192. __STM32_PIN(159, J, 14),
  193. __STM32_PIN(160, J, 15),
  194. #endif
  195. #ifdef GPIOK
  196. __STM32_PIN(161, K, 0),
  197. __STM32_PIN(162, K, 1),
  198. __STM32_PIN(163, K, 2),
  199. __STM32_PIN(164, K, 3),
  200. __STM32_PIN(165, K, 4),
  201. __STM32_PIN(166, K, 5),
  202. __STM32_PIN(167, K, 6),
  203. __STM32_PIN(168, K, 7),
  204. __STM32_PIN(169, K, 8),
  205. __STM32_PIN(170, K, 9),
  206. __STM32_PIN(171, K, 10),
  207. __STM32_PIN(172, K, 11),
  208. __STM32_PIN(173, K, 12),
  209. __STM32_PIN(174, K, 13),
  210. __STM32_PIN(175, K, 14),
  211. __STM32_PIN(176, K, 15),
  212. #endif
  213. };
  214. static const struct pin_irq_map pin_irq_map[] =
  215. {
  216. {GPIO_PIN_0, EXTI0_IRQn},
  217. {GPIO_PIN_1, EXTI1_IRQn},
  218. {GPIO_PIN_2, EXTI2_IRQn},
  219. {GPIO_PIN_3, EXTI3_IRQn},
  220. {GPIO_PIN_4, EXTI4_IRQn},
  221. {GPIO_PIN_5, EXTI9_5_IRQn},
  222. {GPIO_PIN_6, EXTI9_5_IRQn},
  223. {GPIO_PIN_7, EXTI9_5_IRQn},
  224. {GPIO_PIN_8, EXTI9_5_IRQn},
  225. {GPIO_PIN_9, EXTI9_5_IRQn},
  226. {GPIO_PIN_10, EXTI15_10_IRQn},
  227. {GPIO_PIN_11, EXTI15_10_IRQn},
  228. {GPIO_PIN_12, EXTI15_10_IRQn},
  229. {GPIO_PIN_13, EXTI15_10_IRQn},
  230. {GPIO_PIN_14, EXTI15_10_IRQn},
  231. {GPIO_PIN_15, EXTI15_10_IRQn},
  232. };
  233. static struct rt_pin_irq_hdr pin_irq_hdr_tab[] =
  234. {
  235. {-1, 0, RT_NULL, RT_NULL},
  236. {-1, 0, RT_NULL, RT_NULL},
  237. {-1, 0, RT_NULL, RT_NULL},
  238. {-1, 0, RT_NULL, RT_NULL},
  239. {-1, 0, RT_NULL, RT_NULL},
  240. {-1, 0, RT_NULL, RT_NULL},
  241. {-1, 0, RT_NULL, RT_NULL},
  242. {-1, 0, RT_NULL, RT_NULL},
  243. {-1, 0, RT_NULL, RT_NULL},
  244. {-1, 0, RT_NULL, RT_NULL},
  245. {-1, 0, RT_NULL, RT_NULL},
  246. {-1, 0, RT_NULL, RT_NULL},
  247. {-1, 0, RT_NULL, RT_NULL},
  248. {-1, 0, RT_NULL, RT_NULL},
  249. {-1, 0, RT_NULL, RT_NULL},
  250. {-1, 0, RT_NULL, RT_NULL},
  251. };
  252. #define ITEM_NUM(items) sizeof(items) / sizeof(items[0])
  253. static const struct pin_index *get_pin(uint8_t pin)
  254. {
  255. const struct pin_index *index;
  256. if (pin < ITEM_NUM(pins))
  257. {
  258. index = &pins[pin];
  259. if (index->index == -1)
  260. index = RT_NULL;
  261. }
  262. else
  263. {
  264. index = RT_NULL;
  265. }
  266. return index;
  267. };
  268. static void stm32_pin_write(rt_device_t dev, rt_base_t pin, rt_base_t value)
  269. {
  270. const struct pin_index *index;
  271. index = get_pin(pin);
  272. if (index == RT_NULL)
  273. {
  274. return;
  275. }
  276. HAL_GPIO_WritePin(index->gpio, index->pin, (GPIO_PinState)value);
  277. }
  278. static int stm32_pin_read(rt_device_t dev, rt_base_t pin)
  279. {
  280. int value;
  281. const struct pin_index *index;
  282. value = PIN_LOW;
  283. index = get_pin(pin);
  284. if (index == RT_NULL)
  285. {
  286. return value;
  287. }
  288. value = HAL_GPIO_ReadPin(index->gpio, index->pin);
  289. return value;
  290. }
  291. static void stm32_pin_mode(rt_device_t dev, rt_base_t pin, rt_base_t mode)
  292. {
  293. const struct pin_index *index;
  294. GPIO_InitTypeDef GPIO_InitStruct;
  295. index = get_pin(pin);
  296. if (index == RT_NULL)
  297. {
  298. return;
  299. }
  300. /* Configure GPIO_InitStructure */
  301. GPIO_InitStruct.Pin = index->pin;
  302. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  303. GPIO_InitStruct.Pull = GPIO_NOPULL;
  304. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  305. if (mode == PIN_MODE_OUTPUT)
  306. {
  307. /* output setting */
  308. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  309. GPIO_InitStruct.Pull = GPIO_NOPULL;
  310. }
  311. else if (mode == PIN_MODE_INPUT)
  312. {
  313. /* input setting: not pull. */
  314. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  315. GPIO_InitStruct.Pull = GPIO_NOPULL;
  316. }
  317. else if (mode == PIN_MODE_INPUT_PULLUP)
  318. {
  319. /* input setting: pull up. */
  320. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  321. GPIO_InitStruct.Pull = GPIO_PULLUP;
  322. }
  323. else if (mode == PIN_MODE_INPUT_PULLDOWN)
  324. {
  325. /* input setting: pull down. */
  326. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  327. GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  328. }
  329. else if (mode == PIN_MODE_OUTPUT_OD)
  330. {
  331. /* output setting: od. */
  332. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
  333. GPIO_InitStruct.Pull = GPIO_NOPULL;
  334. }
  335. HAL_GPIO_Init(index->gpio, &GPIO_InitStruct);
  336. }
  337. rt_inline rt_int32_t bit2bitno(rt_uint32_t bit)
  338. {
  339. int i;
  340. for (i = 0; i < 32; i++)
  341. {
  342. if ((0x01 << i) == bit)
  343. {
  344. return i;
  345. }
  346. }
  347. return -1;
  348. }
  349. rt_inline const struct pin_irq_map *get_pin_irq_map(uint32_t pinbit)
  350. {
  351. rt_int32_t mapindex = bit2bitno(pinbit);
  352. if (mapindex < 0 || mapindex >= ITEM_NUM(pin_irq_map))
  353. {
  354. return RT_NULL;
  355. }
  356. return &pin_irq_map[mapindex];
  357. };
  358. static rt_err_t stm32_pin_attach_irq(struct rt_device *device, rt_int32_t pin,
  359. rt_uint32_t mode, void (*hdr)(void *args), void *args)
  360. {
  361. const struct pin_index *index;
  362. rt_base_t level;
  363. rt_int32_t irqindex = -1;
  364. index = get_pin(pin);
  365. if (index == RT_NULL)
  366. {
  367. return RT_ENOSYS;
  368. }
  369. irqindex = bit2bitno(index->pin);
  370. if (irqindex < 0 || irqindex >= ITEM_NUM(pin_irq_map))
  371. {
  372. return RT_ENOSYS;
  373. }
  374. level = rt_hw_interrupt_disable();
  375. if (pin_irq_hdr_tab[irqindex].pin == pin &&
  376. pin_irq_hdr_tab[irqindex].hdr == hdr &&
  377. pin_irq_hdr_tab[irqindex].mode == mode &&
  378. pin_irq_hdr_tab[irqindex].args == args)
  379. {
  380. rt_hw_interrupt_enable(level);
  381. return RT_EOK;
  382. }
  383. if (pin_irq_hdr_tab[irqindex].pin != -1)
  384. {
  385. rt_hw_interrupt_enable(level);
  386. return RT_EBUSY;
  387. }
  388. pin_irq_hdr_tab[irqindex].pin = pin;
  389. pin_irq_hdr_tab[irqindex].hdr = hdr;
  390. pin_irq_hdr_tab[irqindex].mode = mode;
  391. pin_irq_hdr_tab[irqindex].args = args;
  392. rt_hw_interrupt_enable(level);
  393. return RT_EOK;
  394. }
  395. static rt_err_t stm32_pin_dettach_irq(struct rt_device *device, rt_int32_t pin)
  396. {
  397. const struct pin_index *index;
  398. rt_base_t level;
  399. rt_int32_t irqindex = -1;
  400. index = get_pin(pin);
  401. if (index == RT_NULL)
  402. {
  403. return RT_ENOSYS;
  404. }
  405. irqindex = bit2bitno(index->pin);
  406. if (irqindex < 0 || irqindex >= ITEM_NUM(pin_irq_map))
  407. {
  408. return RT_ENOSYS;
  409. }
  410. level = rt_hw_interrupt_disable();
  411. if (pin_irq_hdr_tab[irqindex].pin == -1)
  412. {
  413. rt_hw_interrupt_enable(level);
  414. return RT_EOK;
  415. }
  416. pin_irq_hdr_tab[irqindex].pin = -1;
  417. pin_irq_hdr_tab[irqindex].hdr = RT_NULL;
  418. pin_irq_hdr_tab[irqindex].mode = 0;
  419. pin_irq_hdr_tab[irqindex].args = RT_NULL;
  420. rt_hw_interrupt_enable(level);
  421. return RT_EOK;
  422. }
  423. static rt_err_t stm32_pin_irq_enable(struct rt_device *device, rt_base_t pin,
  424. rt_uint32_t enabled)
  425. {
  426. const struct pin_index *index;
  427. const struct pin_irq_map *irqmap;
  428. rt_base_t level;
  429. rt_int32_t irqindex = -1;
  430. GPIO_InitTypeDef GPIO_InitStruct;
  431. index = get_pin(pin);
  432. if (index == RT_NULL)
  433. {
  434. return RT_ENOSYS;
  435. }
  436. if (enabled == PIN_IRQ_ENABLE)
  437. {
  438. irqindex = bit2bitno(index->pin);
  439. if (irqindex < 0 || irqindex >= ITEM_NUM(pin_irq_map))
  440. {
  441. return RT_ENOSYS;
  442. }
  443. level = rt_hw_interrupt_disable();
  444. if (pin_irq_hdr_tab[irqindex].pin == -1)
  445. {
  446. rt_hw_interrupt_enable(level);
  447. return RT_ENOSYS;
  448. }
  449. irqmap = &pin_irq_map[irqindex];
  450. /* Configure GPIO_InitStructure */
  451. GPIO_InitStruct.Pin = index->pin;
  452. GPIO_InitStruct.Pull = GPIO_NOPULL;
  453. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  454. switch (pin_irq_hdr_tab[irqindex].mode)
  455. {
  456. case PIN_IRQ_MODE_RISING:
  457. GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  458. break;
  459. case PIN_IRQ_MODE_FALLING:
  460. GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  461. break;
  462. case PIN_IRQ_MODE_RISING_FALLING:
  463. GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
  464. break;
  465. }
  466. HAL_GPIO_Init(index->gpio, &GPIO_InitStruct);
  467. HAL_NVIC_SetPriority(irqmap->irqno, 5, 0);
  468. HAL_NVIC_EnableIRQ(irqmap->irqno);
  469. rt_hw_interrupt_enable(level);
  470. }
  471. else if (enabled == PIN_IRQ_DISABLE)
  472. {
  473. irqmap = get_pin_irq_map(index->pin);
  474. if (irqmap == RT_NULL)
  475. {
  476. return RT_ENOSYS;
  477. }
  478. HAL_NVIC_DisableIRQ(irqmap->irqno);
  479. }
  480. else
  481. {
  482. return RT_ENOSYS;
  483. }
  484. return RT_EOK;
  485. }
  486. const static struct rt_pin_ops _stm32_pin_ops =
  487. {
  488. stm32_pin_mode,
  489. stm32_pin_write,
  490. stm32_pin_read,
  491. stm32_pin_attach_irq,
  492. stm32_pin_dettach_irq,
  493. stm32_pin_irq_enable,
  494. };
  495. rt_inline void pin_irq_hdr(int irqno)
  496. {
  497. if (pin_irq_hdr_tab[irqno].hdr)
  498. {
  499. pin_irq_hdr_tab[irqno].hdr(pin_irq_hdr_tab[irqno].args);
  500. }
  501. }
  502. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  503. {
  504. pin_irq_hdr(bit2bitno(GPIO_Pin));
  505. }
  506. void EXTI0_IRQHandler(void)
  507. {
  508. rt_interrupt_enter();
  509. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
  510. rt_interrupt_leave();
  511. }
  512. void EXTI1_IRQHandler(void)
  513. {
  514. rt_interrupt_enter();
  515. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1);
  516. rt_interrupt_leave();
  517. }
  518. void EXTI2_IRQHandler(void)
  519. {
  520. rt_interrupt_enter();
  521. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);
  522. rt_interrupt_leave();
  523. }
  524. void EXTI3_IRQHandler(void)
  525. {
  526. rt_interrupt_enter();
  527. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
  528. rt_interrupt_leave();
  529. }
  530. void EXTI4_IRQHandler(void)
  531. {
  532. rt_interrupt_enter();
  533. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
  534. rt_interrupt_leave();
  535. }
  536. void EXTI9_5_IRQHandler(void)
  537. {
  538. rt_interrupt_enter();
  539. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);
  540. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_6);
  541. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_7);
  542. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_8);
  543. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_9);
  544. rt_interrupt_leave();
  545. }
  546. void EXTI15_10_IRQHandler(void)
  547. {
  548. rt_interrupt_enter();
  549. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_10);
  550. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_11);
  551. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);
  552. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
  553. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14);
  554. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_15);
  555. rt_interrupt_leave();
  556. }
  557. int rt_hw_pin_init(void)
  558. {
  559. #if defined(__HAL_RCC_GPIOA_CLK_ENABLE)
  560. __HAL_RCC_GPIOA_CLK_ENABLE();
  561. #endif
  562. #if defined(__HAL_RCC_GPIOB_CLK_ENABLE)
  563. __HAL_RCC_GPIOB_CLK_ENABLE();
  564. #endif
  565. #if defined(__HAL_RCC_GPIOC_CLK_ENABLE)
  566. __HAL_RCC_GPIOC_CLK_ENABLE();
  567. #endif
  568. #if defined(__HAL_RCC_GPIOD_CLK_ENABLE)
  569. __HAL_RCC_GPIOD_CLK_ENABLE();
  570. #endif
  571. #if defined(__HAL_RCC_GPIOE_CLK_ENABLE)
  572. __HAL_RCC_GPIOE_CLK_ENABLE();
  573. #endif
  574. #if defined(__HAL_RCC_GPIOF_CLK_ENABLE)
  575. __HAL_RCC_GPIOF_CLK_ENABLE();
  576. #endif
  577. #if defined(__HAL_RCC_GPIOG_CLK_ENABLE)
  578. __HAL_RCC_GPIOG_CLK_ENABLE();
  579. #endif
  580. #if defined(__HAL_RCC_GPIOH_CLK_ENABLE)
  581. __HAL_RCC_GPIOH_CLK_ENABLE();
  582. #endif
  583. #if defined(__HAL_RCC_GPIOI_CLK_ENABLE)
  584. __HAL_RCC_GPIOI_CLK_ENABLE();
  585. #endif
  586. #if defined(__HAL_RCC_GPIOJ_CLK_ENABLE)
  587. __HAL_RCC_GPIOJ_CLK_ENABLE();
  588. #endif
  589. return rt_device_pin_register("pin", &_stm32_pin_ops, RT_NULL);
  590. }
  591. #endif /* RT_USING_PIN */