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.
 
 
 
 

682 lines
16 KiB

  1. #include <string.h>
  2. #include "./GPIO.h"
  3. /* GPIO私有数据类型 */
  4. typedef struct {
  5. GPIO_TypeDef *GPIOx;
  6. GPIOMode_TypeDef GPIO_Mode;
  7. GPIOOType_TypeDef GPIO_OType;
  8. GPIOPuPd_TypeDef GPIO_PuPd;
  9. uint32_t RCC_AHB1Periph_GPIOx;
  10. } gpio_priv_obj_t;
  11. /* GPIO相关操作函数声明 */
  12. static int gpio_init(gpio_obj_t *pDev, uint16_t gpio_pin, char *gpio_mode, char *gpio_pupd);
  13. static void gpio_deinit(gpio_obj_t *pDev);
  14. static void gpio_set_output(gpio_obj_t *pDev, uint16_t gpio_pin, uint8_t voltage);
  15. static uint16_t gpio_read_output(gpio_obj_t *pDev);
  16. static uint16_t gpio_read_input(gpio_obj_t *pDev);
  17. static void gpio_open_irq(gpio_obj_t *pDev,
  18. uint8_t GPIO_PinSource,
  19. uint8_t EXTI_Trigger,
  20. uint8_t Priority,
  21. CallBack irq_handle);
  22. static void gpio_close_irq(gpio_obj_t *pDev, uint8_t GPIO_PinSource);
  23. /* GPIOA私有数据 */
  24. static gpio_priv_obj_t g_stm32f103_gpio_a_priv = {
  25. GPIOA,
  26. GPIO_Mode_IN,
  27. (GPIOOType_TypeDef)0,
  28. (GPIOPuPd_TypeDef)0,
  29. RCC_AHB1Periph_GPIOA
  30. };
  31. /* GPIOA结构体对象 */
  32. static gpio_obj_t g_stm32f103_gpio_a = {
  33. "gpio_a",
  34. 0,
  35. "gpio_mode",
  36. gpio_init,
  37. gpio_deinit,
  38. gpio_set_output,
  39. gpio_read_output,
  40. gpio_read_input,
  41. gpio_open_irq,
  42. gpio_close_irq,
  43. &g_stm32f103_gpio_a_priv
  44. };
  45. /* GPIOB私有数据 */
  46. static gpio_priv_obj_t g_stm32f103_gpio_b_priv = {
  47. GPIOB,
  48. GPIO_Mode_IN,
  49. (GPIOOType_TypeDef)0,
  50. (GPIOPuPd_TypeDef)0,
  51. RCC_AHB1Periph_GPIOB
  52. };
  53. /* GPIOB结构体对象 */
  54. static gpio_obj_t g_stm32f103_gpio_b = {
  55. "gpio_b",
  56. 0,
  57. "gpio_mode",
  58. gpio_init,
  59. gpio_deinit,
  60. gpio_set_output,
  61. gpio_read_output,
  62. gpio_read_input,
  63. gpio_open_irq,
  64. gpio_close_irq,
  65. &g_stm32f103_gpio_b_priv
  66. };
  67. /* GPIOC私有数据 */
  68. static gpio_priv_obj_t g_stm32f103_gpio_c_priv = {
  69. GPIOC,
  70. GPIO_Mode_IN,
  71. (GPIOOType_TypeDef)0,
  72. (GPIOPuPd_TypeDef)0,
  73. RCC_AHB1Periph_GPIOC
  74. };
  75. /* GPIOC结构体对象 */
  76. static gpio_obj_t g_stm32f103_gpio_c = {
  77. "gpio_c",
  78. 0,
  79. "gpio_mode",
  80. gpio_init,
  81. gpio_deinit,
  82. gpio_set_output,
  83. gpio_read_output,
  84. gpio_read_input,
  85. gpio_open_irq,
  86. gpio_close_irq,
  87. &g_stm32f103_gpio_c_priv
  88. };
  89. /* GPIOD私有数据 */
  90. static gpio_priv_obj_t g_stm32f103_gpio_d_priv = {
  91. GPIOD,
  92. GPIO_Mode_IN,
  93. (GPIOOType_TypeDef)0,
  94. (GPIOPuPd_TypeDef)0,
  95. RCC_AHB1Periph_GPIOD
  96. };
  97. /* GPIOD结构体对象 */
  98. static gpio_obj_t g_stm32f103_gpio_d = {
  99. "gpio_d",
  100. 0,
  101. "gpio_mode",
  102. gpio_init,
  103. gpio_deinit,
  104. gpio_set_output,
  105. gpio_read_output,
  106. gpio_read_input,
  107. gpio_open_irq,
  108. gpio_close_irq,
  109. &g_stm32f103_gpio_d_priv
  110. };
  111. /* GPIOE私有数据 */
  112. static gpio_priv_obj_t g_stm32f103_gpio_e_priv = {
  113. GPIOE,
  114. GPIO_Mode_IN,
  115. (GPIOOType_TypeDef)0,
  116. (GPIOPuPd_TypeDef)0,
  117. RCC_AHB1Periph_GPIOE
  118. };
  119. /* GPIOE结构体对象 */
  120. static gpio_obj_t g_stm32f103_gpio_e = {
  121. "gpio_e",
  122. 0,
  123. "gpio_mode",
  124. gpio_init,
  125. gpio_deinit,
  126. gpio_set_output,
  127. gpio_read_output,
  128. gpio_read_input,
  129. gpio_open_irq,
  130. gpio_close_irq,
  131. &g_stm32f103_gpio_e_priv
  132. };
  133. /* GPIOF私有数据 */
  134. static gpio_priv_obj_t g_stm32f103_gpio_f_priv = {
  135. GPIOF,
  136. GPIO_Mode_IN,
  137. (GPIOOType_TypeDef)0,
  138. (GPIOPuPd_TypeDef)0,
  139. RCC_AHB1Periph_GPIOF
  140. };
  141. /* GPIOF结构体对象 */
  142. static gpio_obj_t g_stm32f103_gpio_f = {
  143. "gpio_f",
  144. 0,
  145. "gpio_mode",
  146. gpio_init,
  147. gpio_deinit,
  148. gpio_set_output,
  149. gpio_read_output,
  150. gpio_read_input,
  151. gpio_open_irq,
  152. gpio_close_irq,
  153. &g_stm32f103_gpio_f_priv
  154. };
  155. /* GPIOG私有数据 */
  156. static gpio_priv_obj_t g_stm32f103_gpio_g_priv = {
  157. GPIOG,
  158. GPIO_Mode_IN,
  159. (GPIOOType_TypeDef)0,
  160. (GPIOPuPd_TypeDef)0,
  161. RCC_AHB1Periph_GPIOG
  162. };
  163. /* GPIOG结构体对象 */
  164. static gpio_obj_t g_stm32f103_gpio_g = {
  165. "gpio_g",
  166. 0,
  167. "gpio_mode",
  168. gpio_init,
  169. gpio_deinit,
  170. gpio_set_output,
  171. gpio_read_output,
  172. gpio_read_input,
  173. gpio_open_irq,
  174. gpio_close_irq,
  175. &g_stm32f103_gpio_g_priv
  176. };
  177. /* GPIOH私有数据 */
  178. static gpio_priv_obj_t g_stm32f103_gpio_h_priv = {
  179. GPIOH,
  180. GPIO_Mode_IN,
  181. (GPIOOType_TypeDef)0,
  182. (GPIOPuPd_TypeDef)0,
  183. RCC_AHB1Periph_GPIOH
  184. };
  185. /* GPIOH结构体对象 */
  186. static gpio_obj_t g_stm32f103_gpio_h = {
  187. "gpio_h",
  188. 0,
  189. "gpio_mode",
  190. gpio_init,
  191. gpio_deinit,
  192. gpio_set_output,
  193. gpio_read_output,
  194. gpio_read_input,
  195. gpio_open_irq,
  196. gpio_close_irq,
  197. &g_stm32f103_gpio_h_priv
  198. };
  199. /* GPIO外设列表 */
  200. static gpio_obj_t *g_gpio_devs[] = {
  201. &g_stm32f103_gpio_a,
  202. &g_stm32f103_gpio_b,
  203. &g_stm32f103_gpio_c,
  204. &g_stm32f103_gpio_d,
  205. &g_stm32f103_gpio_e,
  206. &g_stm32f103_gpio_f,
  207. &g_stm32f103_gpio_g,
  208. &g_stm32f103_gpio_h
  209. };
  210. /* GPIO模式私有数据列表 */
  211. static GPIOMode_TypeDef g_gpio_mode_priv_list[] = {
  212. GPIO_Mode_AN,
  213. GPIO_Mode_IN,
  214. GPIO_Mode_AF,
  215. GPIO_Mode_OUT
  216. };
  217. /* GPIO模式列表 */
  218. static char *g_gpio_mode_list[] = {
  219. "AN",
  220. "IN",
  221. "AF_PP",
  222. "AF_OD",
  223. "OUT_PP",
  224. "OUT_OD"
  225. };
  226. /* GPIO输出模式私有数据列表 */
  227. static GPIOOType_TypeDef g_gpio_out_mode_priv_list[] = {
  228. GPIO_OType_PP,
  229. GPIO_OType_OD
  230. };
  231. /* GPIO上下拉模式私有数据列表 */
  232. static GPIOPuPd_TypeDef g_gpio_pupd_priv_list[] = {
  233. GPIO_PuPd_NOPULL,
  234. GPIO_PuPd_UP,
  235. GPIO_PuPd_DOWN
  236. };
  237. /* GPIO上下拉输出模式列表 */
  238. static char *g_gpio_pupd_list[] = {
  239. "NONE",
  240. "UP",
  241. "DOWN"
  242. };
  243. /* GPIO中断注册函数列表 */
  244. /* gpio_irq_handle_list[x] --> EXTI_Line_x */
  245. CallBack g_gpio_irq_handle_list[16] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
  246. NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
  247. /*
  248. *@函数名:gpio_init
  249. *@函数功能:初始化指定GPIO端口
  250. *@参数:
  251. * @pDev:指定GPIO端口句柄
  252. * @gpio_pin:GPIO端口引脚
  253. * value:gpio_pin_0 ~ gpio_pin_15,支持位或同时初始化相同端口的多个引脚
  254. * @gpio_mode:GPIO模式
  255. * value:"IN"、 "AF_PP"、 "AF_OD"、 "AN"、 "OUT_PP"、 "OUT_OD"
  256. *@返回值
  257. * 0:GPIO初始化成功
  258. * -1:GPIO初始化失败
  259. */
  260. static int gpio_init(gpio_obj_t *pDev, uint16_t gpio_pin, char *gpio_mode, char *gpio_pupd)
  261. {
  262. gpio_priv_obj_t *gpio_priv_obj = pDev->gpio_priv_data;
  263. uint8_t gpio_mode_flag = 0;
  264. uint8_t gpio_pupd_flag = 0;
  265. uint8_t gpio_mode_num = sizeof(g_gpio_mode_list) / sizeof(g_gpio_mode_list[0]);
  266. uint8_t gpio_pupd_num = sizeof(g_gpio_pupd_list) / sizeof(g_gpio_pupd_list[0]);
  267. for(uint8_t i = 0; i < gpio_mode_num; i++)
  268. {
  269. if(0 == strcmp(gpio_mode, g_gpio_mode_list[i]))
  270. {
  271. pDev->gpio_mode = g_gpio_mode_list[i];
  272. gpio_mode_flag = 1;
  273. if(0 == strcmp(gpio_mode, "OUT_PP"))
  274. {
  275. gpio_priv_obj->GPIO_Mode = g_gpio_mode_priv_list[3];
  276. gpio_priv_obj->GPIO_OType = g_gpio_out_mode_priv_list[0]; //设置输出模式为推挽输出
  277. }
  278. else if(0 == strcmp(gpio_mode, "OUT_OD"))
  279. {
  280. gpio_priv_obj->GPIO_Mode = g_gpio_mode_priv_list[3];
  281. gpio_priv_obj->GPIO_OType = g_gpio_out_mode_priv_list[1]; //设置输出模式为开漏输出
  282. }
  283. else if(0 == strcmp(gpio_mode, "AF_PP"))
  284. {
  285. gpio_priv_obj->GPIO_Mode = g_gpio_mode_priv_list[2];
  286. gpio_priv_obj->GPIO_OType = g_gpio_out_mode_priv_list[0]; //设置复用输出模式为推挽输出
  287. }
  288. else if(0 == strcmp(gpio_mode, "AF_OD"))
  289. {
  290. gpio_priv_obj->GPIO_Mode = g_gpio_mode_priv_list[2];
  291. gpio_priv_obj->GPIO_OType = g_gpio_out_mode_priv_list[1]; //设置输出模式为开漏输出
  292. }
  293. else
  294. {
  295. gpio_priv_obj->GPIO_Mode = g_gpio_mode_priv_list[i];
  296. }
  297. break;
  298. }
  299. }
  300. for(uint8_t i = 0; i < gpio_pupd_num; i++)
  301. {
  302. if(0 == strcmp(gpio_pupd, g_gpio_pupd_list[i]))
  303. {
  304. gpio_priv_obj->GPIO_PuPd = g_gpio_pupd_priv_list[i];
  305. gpio_pupd_flag = 1;
  306. break;
  307. }
  308. }
  309. if((0 == gpio_mode_flag) || (0 == gpio_pupd_flag))
  310. {
  311. return -1;
  312. }
  313. pDev->gpio_pin = gpio_pin;
  314. RCC_AHB1PeriphClockCmd(gpio_priv_obj->RCC_AHB1Periph_GPIOx, ENABLE);
  315. GPIO_InitTypeDef GPIO_InitStructure;
  316. GPIO_InitStructure.GPIO_Pin = pDev->gpio_pin;
  317. GPIO_InitStructure.GPIO_Mode = gpio_priv_obj->GPIO_Mode;
  318. GPIO_InitStructure.GPIO_OType = gpio_priv_obj->GPIO_OType;
  319. GPIO_InitStructure.GPIO_PuPd = gpio_priv_obj->GPIO_PuPd;
  320. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  321. GPIO_Init(gpio_priv_obj->GPIOx, &GPIO_InitStructure);
  322. return 0;
  323. }
  324. /*
  325. *@函数名:gpio_deinit
  326. *@函数功能:复位指定GPIO端口
  327. *@参数:
  328. * @pDev:指定GPIO端口句柄
  329. *@返回值:无
  330. */
  331. static void gpio_deinit(gpio_obj_t *pDev)
  332. {
  333. gpio_priv_obj_t *gpio_priv_obj = pDev->gpio_priv_data;
  334. GPIO_DeInit(gpio_priv_obj->GPIOx);
  335. }
  336. /*
  337. *@函数名:gpio_set_output
  338. *@函数功能:设置GPIO端口指定引脚电平
  339. *@参数:
  340. * @pDev:指定GPIO端口句柄
  341. * @gpio_pin:GPIO端口引脚
  342. * value:gpio_pin_0 ~ gpio_pin_15,支持位或同时初始化相同端口的多个引脚
  343. * @voltage:输出引脚电平
  344. * value:0:低电平、 1:高电平
  345. *@返回值:无
  346. */
  347. static void gpio_set_output(gpio_obj_t *pDev, uint16_t gpio_pin, uint8_t voltage)
  348. {
  349. gpio_priv_obj_t *gpio_priv_obj = pDev->gpio_priv_data;
  350. GPIO_WriteBit(gpio_priv_obj->GPIOx, gpio_pin, (BitAction)voltage);
  351. }
  352. /*
  353. *@函数名:gpio_read_output
  354. *@函数功能:读取GPIO端口输出的电平
  355. *@参数:
  356. * @pDev:指定GPIO端口句柄
  357. *@返回值:一组GPIO电平
  358. */
  359. static uint16_t gpio_read_output(gpio_obj_t *pDev)
  360. {
  361. gpio_priv_obj_t *gpio_priv_obj = pDev->gpio_priv_data;
  362. return GPIO_ReadOutputData(gpio_priv_obj->GPIOx);
  363. }
  364. /*
  365. *@函数名:gpio_read_input
  366. *@函数功能:读取GPIO端口输入的电平
  367. *@参数:
  368. * @pDev:指定GPIO端口句柄
  369. *@返回值:一组GPIO电平
  370. */
  371. static uint16_t gpio_read_input(gpio_obj_t *pDev)
  372. {
  373. gpio_priv_obj_t *gpio_priv_obj = pDev->gpio_priv_data;
  374. return GPIO_ReadInputData(gpio_priv_obj->GPIOx);
  375. }
  376. /*
  377. *@函数名:gpio_open_irq
  378. *@函数功能:开启GPIO引脚中断
  379. *@参数:
  380. * @pDev:指定GPIO端口句柄
  381. * @GPIO_PinSource:中断引脚号:0 ~ 15
  382. * @EXTI_Trigger:中断触发方式
  383. * value:0:上升沿触发、 1:下降沿触发、 2:上升沿和下降沿都触发
  384. * @Priority:中断抢占式优先级
  385. *@返回值:无
  386. */
  387. static void gpio_open_irq(gpio_obj_t *pDev,
  388. uint8_t GPIO_PinSource,
  389. uint8_t EXTI_Trigger,
  390. uint8_t Priority,
  391. CallBack irq_handle)
  392. {
  393. gpio_priv_obj_t *gpio_priv_obj = pDev->gpio_priv_data;
  394. g_gpio_irq_handle_list[GPIO_PinSource] = irq_handle;
  395. NVIC_InitTypeDef NVIC_InitStructure;
  396. EXTI_InitTypeDef EXTI_InitStructure;
  397. RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
  398. /* 将GPIOx对应到GPIO_PortSourcex */
  399. uint8_t GPIO_PortSource = (uint8_t)((uint16_t)((uint32_t)gpio_priv_obj->GPIOx & 0x0000ffff) / 0x0400);
  400. SYSCFG_EXTILineConfig(GPIO_PortSource, GPIO_PinSource);
  401. switch(EXTI_Trigger)
  402. {
  403. case 0:EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; break;
  404. case 1:EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; break;
  405. case 2:EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; break;
  406. default:break;
  407. }
  408. EXTI_InitStructure.EXTI_Line = (1 << GPIO_PinSource);
  409. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  410. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  411. EXTI_Init(&EXTI_InitStructure);
  412. if(GPIO_PinSource < 5)
  413. {
  414. NVIC_InitStructure.NVIC_IRQChannel = (GPIO_PinSource + 6);
  415. }
  416. else if((4 < GPIO_PinSource) && (10 > GPIO_PinSource))
  417. {
  418. NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
  419. }
  420. else
  421. {
  422. NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
  423. }
  424. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = Priority;
  425. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  426. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  427. NVIC_Init(&NVIC_InitStructure);
  428. }
  429. /*
  430. *@函数名:gpio_close_irq
  431. *@函数功能:关闭GPIO引脚中断
  432. *@参数:
  433. * @pDev:指定GPIO端口句柄
  434. * @GPIO_PinSource:中断引脚号:0 ~ 15
  435. *@返回值:无
  436. */
  437. static void gpio_close_irq(gpio_obj_t *pDev, uint8_t GPIO_PinSource)
  438. {
  439. NVIC_InitTypeDef NVIC_InitStructure;
  440. EXTI_InitTypeDef EXTI_InitStructure;
  441. EXTI_InitStructure.EXTI_Line = (1 << GPIO_PinSource);
  442. EXTI_InitStructure.EXTI_LineCmd = DISABLE;
  443. EXTI_Init(&EXTI_InitStructure);
  444. if(GPIO_PinSource < 5)
  445. {
  446. NVIC_InitStructure.NVIC_IRQChannel = (GPIO_PinSource + 6);
  447. }
  448. else if((4 < GPIO_PinSource) && (10 > GPIO_PinSource))
  449. {
  450. NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
  451. }
  452. else if((9 < GPIO_PinSource) && (16 > GPIO_PinSource))
  453. {
  454. NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
  455. }
  456. else
  457. {
  458. }
  459. NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
  460. NVIC_Init(&NVIC_InitStructure);
  461. }
  462. /*
  463. *@函数名:EXTI0_IRQHandler
  464. *@函数功能:GPIO中断处理
  465. *@参数:无
  466. *@返回值:无
  467. */
  468. void EXTI0_IRQHandler(void)
  469. {
  470. if(SET == EXTI_GetITStatus(EXTI_Line0))
  471. {
  472. (g_gpio_irq_handle_list[0])();
  473. }
  474. EXTI_ClearITPendingBit(EXTI_Line0);
  475. }
  476. /*
  477. *@函数名:EXTI1_IRQHandler
  478. *@函数功能:GPIO中断处理
  479. *@参数:无
  480. *@返回值:无
  481. */
  482. void EXTI1_IRQHandler(void)
  483. {
  484. if(SET == EXTI_GetITStatus(EXTI_Line1))
  485. {
  486. (g_gpio_irq_handle_list[1])();
  487. }
  488. EXTI_ClearITPendingBit(EXTI_Line1);
  489. }
  490. /*
  491. *@函数名:EXTI2_IRQHandler
  492. *@函数功能:GPIO中断处理
  493. *@参数:无
  494. *@返回值:无
  495. */
  496. void EXTI2_IRQHandler(void)
  497. {
  498. if(SET == EXTI_GetITStatus(EXTI_Line2))
  499. {
  500. (g_gpio_irq_handle_list[2])();
  501. }
  502. EXTI_ClearITPendingBit(EXTI_Line2);
  503. }
  504. /*
  505. *@函数名:EXTI3_IRQHandler
  506. *@函数功能:GPIO中断处理
  507. *@参数:无
  508. *@返回值:无
  509. */
  510. void EXTI3_IRQHandler(void)
  511. {
  512. if(SET == EXTI_GetITStatus(EXTI_Line3))
  513. {
  514. (g_gpio_irq_handle_list[3])();
  515. }
  516. EXTI_ClearITPendingBit(EXTI_Line3);
  517. }
  518. /*
  519. *@函数名:EXTI4_IRQHandler
  520. *@函数功能:GPIO中断处理
  521. *@参数:无
  522. *@返回值:无
  523. */
  524. void EXTI4_IRQHandler(void)
  525. {
  526. if(SET == EXTI_GetITStatus(EXTI_Line4))
  527. {
  528. (g_gpio_irq_handle_list[4])();
  529. }
  530. EXTI_ClearITPendingBit(EXTI_Line4);
  531. }
  532. /*
  533. *@函数名:EXTI9_5_IRQHandler
  534. *@函数功能:GPIO中断处理
  535. *@参数:无
  536. *@返回值:无
  537. */
  538. void EXTI9_5_IRQHandler(void)
  539. {
  540. if(SET == EXTI_GetITStatus(EXTI_Line5))
  541. {
  542. (g_gpio_irq_handle_list[5])();
  543. EXTI_ClearITPendingBit(EXTI_Line5);
  544. }
  545. else if(SET == EXTI_GetITStatus(EXTI_Line6))
  546. {
  547. (g_gpio_irq_handle_list[6])();
  548. EXTI_ClearITPendingBit(EXTI_Line6);
  549. }
  550. else if(SET == EXTI_GetITStatus(EXTI_Line7))
  551. {
  552. (g_gpio_irq_handle_list[7])();
  553. EXTI_ClearITPendingBit(EXTI_Line7);
  554. }
  555. else if(SET == EXTI_GetITStatus(EXTI_Line8))
  556. {
  557. (g_gpio_irq_handle_list[8])();
  558. EXTI_ClearITPendingBit(EXTI_Line8);
  559. }
  560. else
  561. {
  562. (g_gpio_irq_handle_list[9])();
  563. EXTI_ClearITPendingBit(EXTI_Line9);
  564. }
  565. }
  566. /*
  567. *@函数名:EXTI15_10_IRQHandler
  568. *@函数功能:GPIO中断处理
  569. *@参数:无
  570. *@返回值:无
  571. */
  572. void EXTI15_10_IRQHandler(void)
  573. {
  574. if(SET == EXTI_GetITStatus(EXTI_Line10))
  575. {
  576. (g_gpio_irq_handle_list[10])();
  577. EXTI_ClearITPendingBit(EXTI_Line10);
  578. }
  579. else if(SET == EXTI_GetITStatus(EXTI_Line11))
  580. {
  581. (g_gpio_irq_handle_list[11])();
  582. EXTI_ClearITPendingBit(EXTI_Line11);
  583. }
  584. else if(SET == EXTI_GetITStatus(EXTI_Line12))
  585. {
  586. (g_gpio_irq_handle_list[12])();
  587. EXTI_ClearITPendingBit(EXTI_Line12);
  588. }
  589. else if(SET == EXTI_GetITStatus(EXTI_Line13))
  590. {
  591. (g_gpio_irq_handle_list[13])();
  592. EXTI_ClearITPendingBit(EXTI_Line13);
  593. }
  594. else if(SET == EXTI_GetITStatus(EXTI_Line14))
  595. {
  596. (g_gpio_irq_handle_list[14])();
  597. EXTI_ClearITPendingBit(EXTI_Line14);
  598. }
  599. else
  600. {
  601. (g_gpio_irq_handle_list[15])();
  602. EXTI_ClearITPendingBit(EXTI_Line15);
  603. }
  604. }
  605. /*
  606. *@函数名:Get_GPIO_Handle
  607. *@函数功能:获取GPIO句柄
  608. *@参数:
  609. * @name:指定GPIO端口
  610. * value:gpio_x x可以是a ~ g
  611. *@返回值:GPIO端口句柄
  612. */
  613. gpio_obj_t *get_gpio_obj(char *name)
  614. {
  615. gpio_obj_t *gpio_return_handle= NULL;
  616. uint8_t gpio_dev_num = sizeof(g_gpio_devs) / sizeof(g_gpio_devs[0]);
  617. for(uint8_t i = 0; i < gpio_dev_num; i++)
  618. {
  619. if(0 == strcmp(name, g_gpio_devs[i]->name))
  620. {
  621. gpio_return_handle = g_gpio_devs[i];
  622. return gpio_return_handle;
  623. }
  624. }
  625. return gpio_return_handle;
  626. }