exti.c 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #include "exti.h"
  2. #include "delay.h"
  3. void exti_Init(void)
  4. {
  5. EXTI_InitTypeDef EXTI_InitStruct;
  6. NVIC_InitTypeDef NVIC_InitStruct;
  7. GPIO_InitTypeDef GPIO_InitStructure;
  8. // KEY_Init();//IO初始化
  9. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//配置外部中断时钟
  10. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能GPIOB时钟
  11. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_9;//
  12. //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //
  13. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  14. GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB7
  15. //io口与中断线映射
  16. GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource7);//链接到中断线7 GPIO7只能映射到中断线4上面
  17. EXTI_InitStruct.EXTI_Line=EXTI_Line7;//确定中断线
  18. EXTI_InitStruct.EXTI_LineCmd=ENABLE;//使能
  19. EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;//中断模式
  20. EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;//xia降沿触发
  21. EXTI_Init(&EXTI_InitStruct);//初始化
  22. //io口与中断线映射
  23. GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource9);//链接到中断线9
  24. EXTI_InitStruct.EXTI_Line=EXTI_Line9;//确定中断线
  25. EXTI_InitStruct.EXTI_LineCmd=ENABLE;//使能
  26. EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;//中断模式
  27. EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;//xia降沿触发
  28. EXTI_Init(&EXTI_InitStruct);//初始化
  29. NVIC_InitStruct.NVIC_IRQChannel=EXTI9_5_IRQn;
  30. /*
  31. 需要明确的是,PxN管脚共用外部中断线EXTIN和外部中断向量EXTIN_IRQn
  32. 和中断服务程序入口EXTIN_IRQHandler,但是需要注意的是[9...5]
  33. 共用EXTI9_5_IRQn和EXTI9_5_IRQHandler、[15...10]共用EXTI15_10_IRQn和EXTI15_10_IRQHandler
  34. */
  35. NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;//使能
  36. NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;//中断抢优先级
  37. NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;
  38. NVIC_Init(&NVIC_InitStruct);//初始化
  39. }
  40. void EXTI9_5_IRQHandler(void)
  41. {
  42. if(EXTI_GetITStatus(EXTI_Line7)!=RESET) //PB7外部中断
  43. {
  44. EXTI_ClearITPendingBit(EXTI_Line7);//清除中断 标志
  45. }else if(EXTI_GetITStatus(EXTI_Line9)!=RESET)
  46. {
  47. }
  48. EXTI_ClearITPendingBit(EXTI_Line9);//清除中断 标志
  49. }