外部中断
使用IO口外部中断的一般步骤:
1、初始化IO口为输入
2、开启AFIO时钟
3、设置IO口与中断线的映射关系
4、初始化线上中断,设置触发条件等
5、配置中断分组(NVIC),并使能中断
6、编写中断服务函数

1 #include "exti.h" 2 #include "key1.h" 3 #include "delay.h" 4 #include "beep.h" 5 #include "led.h" 6 7 /* 8 使用IO口外部中断的一般步骤: 9 1、初始化IO口为输入 10 2、开启AFIO时钟 11 3、设置IO口与中断线的映射关系 12 4、初始化线上中断,设置触发条件等 13 5、配置中断分组(NVIC),并使能中断 14 6、编写中断服务函数 15 */ 16 17 void EXTIX_Init(void) 18 { 19 EXTI_InitTypeDef EXTI_InitStructure; 20 NVIC_InitTypeDef NVIC_InitStructure; 21 22 key_init();//1、初始化IO口为输入 23 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//2、开启AFIO时钟 24 25 GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource8);//key0 3、设置IO口与中断线的映射关系 26 EXTI_InitStructure.EXTI_Line=EXTI_Line8; 27 EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; 28 EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling; 29 EXTI_InitStructure.EXTI_LineCmd=ENABLE; 30 EXTI_Init(&EXTI_InitStructure);//4、初始化线上中断,设置触发条件等 31 32 GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource9);//key1 33 EXTI_InitStructure.EXTI_Line=EXTI_Line9; 34 EXTI_Init(&EXTI_InitStructure); 35 36 GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource2);//key2 37 EXTI_InitStructure.EXTI_Line=EXTI_Line2; 38 EXTI_Init(&EXTI_InitStructure); 39 40 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//key_up 41 EXTI_InitStructure.EXTI_Line=EXTI_Line0; 42 EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising; 43 EXTI_Init(&EXTI_InitStructure); 44 45 NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn; 46 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02; 47 NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x01; 48 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; 49 NVIC_Init(&NVIC_InitStructure);//5、配置中断分组(NVIC),并使能中断 50 51 52 53 NVIC_InitStructure.NVIC_IRQChannel=EXTI2_IRQn; 54 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02; 55 NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02; 56 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; 57 NVIC_Init(&NVIC_InitStructure); 58 59 60 61 NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn; 62 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02; 63 NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; 64 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; 65 NVIC_Init(&NVIC_InitStructure); 66 67 } 68 69 void EXTI9_5_IRQHandler(void)//6、编写中断服务函数 70 { 71 delay_ms(10); 72 if(KEY0==0) 73 { 74 LED0=!LED0; 75 EXTI_ClearITPendingBit(EXTI_Line8); 76 } 77 if(KEY1==0) 78 { 79 LED1=!LED1; 80 EXTI_ClearITPendingBit(EXTI_Line9); 81 } 82 } 83 84 void EXTI0_IRQHandler(void) 85 { 86 delay_ms(10); 87 if(WK_UP==1) 88 { 89 LED1=!LED1; 90 // EXTI_ClearITPendingBit(EXTI_Line0); 91 } 92 EXTI_ClearITPendingBit(EXTI_Line0); 93 94 } 95 96 void EXTI2_IRQHandler(void) 97 { 98 delay_ms(10); 99 if(KEY2==0) 100 { 101 LED5=!LED5; 102 } 103 EXTI_ClearITPendingBit(EXTI_Line2); 104 105 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现