什么是中断
中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行
断点:主程序暂停,执行中断;中断执行完,回到主程序的位置
形象来讲:我在上课,学校开始消防演练,课堂被打断,我们都去消防演练,演练结束继续回来上课
中断嵌套
当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回
stm32中断
中断源:68个可屏蔽中断通道,包含EXTI、TIM、ADC、USART、SPI、I2C、RTC等多个外设 //中断通道就是中断源
注意:1.68个可屏蔽中断通道,是F1系列单片机最大通道数,不是所有STM32都拥有所有中断通道
2.使用NVIC统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级和响应优先级
NVIC基本结构
NVIC:中断向量控制器
作用:同一分配中断优先级和管理中断 //相当于CPU处理中断助手
NVIC是一个内核外设
原理:NVIC通过终端优先级决定执行那个终端,并通过一个输出口告诉CPU该执行那个中断
中断优先级
当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源
NVIC中断分组
NVIC的中断优先级由优先级寄存器的4位(0~15)决定,这4位可以进行切分,分为高n位的抢占优先级和低4-n位的响应优先级
抢占优先级高的可以中断嵌套,抢占属性由NVIC_IRQChannelPreemptionPriority 的参数配置。 //插队
响应优先级高的可以优先排队,响应属性由NVIC_IRQChannelSubPriority 参数配置。
抢占优先级和响应优先级均相同的按中断号排队
中断号:
中断系统表中的中断号
注意:
在库函数中,先占就是抢占(pre-emption),从站就是响应(subpriority)
分组方式 | 抢占优先级 | 响应优先级 |
---|---|---|
分组0 | 0位,取值为0 | 4位,取值为0~15 |
分组1 | 1位,取值为0~1 | 3位,取值为0~7 |
分组2 | 2位,取值为0~3 | 2位,取值为0~3 |
分组3 | 3位,取值为0~7 | 1位,取值为0~1 |
分组4 | 4位,取值为0~15 | 0位,取值为0 |
外部中断
端口电平变化而产生的中断请求
EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序
优点:中断系统可以提高程序的运行效率
中断源:
外部中断:引脚电平跳变、定时的时间到、串口通信接收到数据
基本信息
外部中断功能:
从低功耗模式的停止模式下唤醒STM32
支持的触发方式:
上升沿:边沿检测电路检测到上升沿
下降沿:边沿检测电路检测到下降沿
双边沿:边沿检测电路检测到上升沿和下降沿
软件触发:软件中断事件寄存器输出1
支持的GPIO口:
所有GPIO口,但相同的Pin不能同时触发中断
通道数:
16个GPIO_Pin,外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒
//16个GPIO_Pin是外部中断的主要功能
//对于PVD电源电压监测,当从电压从电压过低恢复时,PVD需要借助外部中断退出停止模式
//对于RTC时钟,为了省电,RTC定一个闹钟后STM32会进入停止模式,等到闹钟响的时候再唤醒,需要借助外部中断
//USB唤醒和以太网唤醒类似
触发响应方式:
中断响应:申请中断,让CPU执行中断函数
事件响应:外部中断检测到引脚电平发生变化时,可以选择除法中断,也可以选择除法一个事件,除法事件,中断信号不会通向CPU,直接通向其他外设,让其他外设工作
exit基本结构
AFIO:
数据选择器,GPIO外设由16个引脚,若每个引脚占用一个通道,那EXIT的16个通道不够;AFIO中断引脚选择的电路模块,在GPIO的16个引脚里选择其中一个连接到后面的EXIT通道
注意:
EXIT9_5(5~10)和EXIT15_10(10~15)分配在同一个通道里,会触发同一个中断函数,需要根据标志位区分是那个中断进来
AFIO
AFIO:复用IO口
AFIO主要用于引脚复用功能的选择和重定义
AFIO作用:
复用功能引脚重映射
中断引脚选择
梯形符号:数据选择器,多个输入,一个输出,侧面由选择控制端,通过控制端数据,从输入选择一个接到输出
exit内部框图
输入线20根,连接在EXIT右边
边沿检测电路可以检测上升沿还是下降沿,通过触发选择寄存器除法中断
输出:
NVIC触发中断,选置一个挂起寄存器,相当于一个中断标志位
20触发事件,
中断编程
步骤
1.配置RCC,把涉及的外设的时钟都打开
2.配置GPIO,选择端口的输入模式
3.配置AFIO,选择使用的GPIO //AFIO也是APB2的外设
RCC_APB2PeriphClockCmd(AFIO,ENABLE);
4.配置EXIT,选择边沿触发方式和响应方式
5.配置NVIC,选择合适优先级
通过NVIC外部中断信号就能进入CPU //内核外设,不用开启时钟
注意:
EXIT和NVIC时钟一直打开的,不需要再开启时钟
RCC只能处理内核外的外设,RCC管不到内核外设
编写中断函数
注意:
1.中断函数名字固定,每个中断通道对应一个中断函数 //在start的startup文件里以IRQHandler为后缀的字符串就是中断函数名
2.中断函数固定无参无返回值中断函数内部:
1.对中断标志位进行判断,确保想要的中断源触发函数
2.编写中断函数内容
3.清除中断标志位
中断建议
1.尽量不要再中断中使用太长延时的函数
2.尽量不要在中断函数和主函数中调用相同的函数或操作同一个硬件
3.建议在中断中操作变量或标志位
注意:
中断保护现场和恢复现场只对CPU有效,对外部硬件没有现场保护
学习资源:
哔哩哔哩江科大自化协STM32视频资料