中断就类似于一个人在吃饭的时候,来了个快递(快递就是中断源)他取了快递(执行中断的任务)后,回到吃饭这个当前任务。
一.中断源
顾名思义中断产生的源头。
1.内部中断源:
cup内产生
由CPU得运行结果产生:如除数为0、结果溢出、单步执行等。
执行中断指令INT:INT3
非法操作或指令引起异常处理。
2.外部中断源:
I/O设备:如显示器、键盘、打印机等。
数据通道:软盘、硬盘、光盘等。
实时时钟:如外部的定时电路等。
用户故障源:如掉电、奇偶校验错误等
二.中断线 STM32的EXTI控制器支持19 个外部中断/ 事件请求。
STM32的19个外部中断对应着19路中断线,分别是EXTI_Line0-EXTI_Line18:
线0~15:对应外部 IO口的输入中断。
线16:连接到 PVD 输出。
线17:连接到 RTC 闹钟事件。
线18:连接到 USB 唤醒事件。
触发方式:通过边沿触发(上升沿触发、下降沿触发、双边沿触发)
如图可以看出GPIO引脚的映射关系,16个引脚为一组对应一个中断线这里要说明同一个组中上不能同时有两个引脚申请中断,不同的组可以。
外部中断的配置
1、开启IO口时钟,初始化IO口为输入。调用函数:GPIO_Init();
2、开启IO口复用时钟。调用函数:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
3、设置IO口与中断线的映射关系。调用函数:GPIO_EXTILineConfig();
4、初始化线上中断,设置触发条件等。调用函数:EXTI_Init();
5、配置中断分组(NVIC),并使能中断。调用函数:NVIC_Init();
6、编写中断服务函数。调用函数:EXTIx_IRQHandler();其中这个x是对应着那一个中断标志(0到4:x为0、1、2、3、4从5到9:共用一个中断服务函数x为9_5从10到15共用一个中断服务函数x为15_10)
7、清除中断标志位。调用函数:EXTI_ClearITPendingBit()。使用此函数清除标志位后程序能回到主程序,如果不调用程序会一直执行中断程序。