1 数据传输方式(处理器和外部设备)
(1)无条件传输:处理器不必了解外部设备状态,直接进行数据传输,用于指示灯和按键等简单设备
(2)查询方式:传输前,一方先查询另一方的状态,若已经准备好就传输,否则就继续查询
(3)中断方式:一方通过申请中断的方式与另一方进行数据传输,收发双方可以并行工作
(4)直接存储器访问:处理器内部建立片内外设和内存之间的数据传输通道,传输过程不需要处理器参与
2.中断基本概念
2.1中断过程
(1)中断发生:当CPU在处理某一事件A时,发生了另一事件B,请求CPU迅速去处理
(2)中断处理:CPU暂停当前的工作,转去处理事件B
(3)中断返回:当CPU将事件B处理完毕后,再回到事件A中被暂停的地方继续处理事件A
2.2 中断的作用
(1)高速匹配
可以解决快速的CPU与慢速的外部设备之间传送数据的矛盾
(2)分时操作
CPU可以分时为多个外部设备服务,提高计算机的利用率
(3)实时响应
CPU能够及时处理应用系统的随机事件,增强系统的实时性
(4)可靠性强
CPU可以处理设备故障及掉电等突发事件,提高系统可靠性
2.3 中断优先级
处理器根据不同中断的重要程序设置不同的优先等级。不同优先级中断的处理原则是:高级中断可以打断低级中断;低级中断不能打断高级中断
2.4中断向量类
(1)中断服务程序
在响应一个特定中断的时候,处理器会执行一个函数,该函数一般称为中断处理程序或者中断服务程序
(2)中断向量
中断服务程序在内存中的入口地址称为中断向量
(3)中断向量表
把系统中所有的中断向量集中起来放到存储器的某一区域内,这个存放中断向量的存储区就叫中断向量表(编号越小优先级越高)
2.5 查找中断向量的过程
(1)编号:计算机系统对每一个中断源进行编号这个号码称为中断类型号
(2)查表:根据中断类型号,到中断向量表中找到对应的表项
(3)执行:取出表项内容,即该中断源对应的中断服务程序地址,进入该程序执行相应操作
2.6 中断响应过程
3.STM32微控制器中断系统
3.1 基本概念
3.1.1 中断与异常
(1)中断
中断是由内核外部产生的,一般由硬件引起,比如外设中断和外部中断等
(2)异常—软件运行报错
异常通常是内核自身产生的,大多是软件引起的,比如除法出错异常、预取值失败等
3.1.2嵌套向量中断控制器(NVIC)
NVIC属于cortex-M内核的组件,管理所有的中断和异常,为中断源分配中断通道(外部中断一般为GPIO)
3.1.3 中断通道(通道有限)
微控制器片内集成了很多外设,对于单个外设而言,它通常具备若干个可以引起中断的中断源,而该外设的所有中断源只能通过指定的中断通道向内核申请中断。
Eg:STM32F411芯片为例,它支持68个中断通道,已经固定分配给相应的片内外设。由于中断源数量较多,而中断通道有限,会出现多个中断源共享同-个中断通道的情况。
3.1.4 中断优先级
NVIC中有一个8位中断优先级寄存器NVIC IPR,理论上可以配置0~255共256级中断.STM32只使用了其中的高4位(16个),并分成抢占优先级和子优先级两组。
多个中断同时提出中断申请时:先比较抢占优先级,抢占优先级高的中断先执行。如果抢占优先级相同,则比较子优先级。二者都相同时,比较中断编号。编号越小,优先级越高(中断编号位于芯片头文件中)。
3.1.5 优先级分组
HAL库初始化函数HAL Init将优先级分组设置为第4组,即有0~15,共16级抢占优先级,没有子优先级。编号越小的优先级越高:0号为最高,15号为最低。
3.2 外部中断控制器(EXIT)
(1)管理23个外部中断线(EXTLLine)
(2)0~15号外部中断线用于由GPIO引脚触发的外部中断,16~22号外部中断线用于RTC闹钟事件、以太网唤醒事件和USB唤醒事件等
(3)当对应GPIO引脚与外部中断线连接后,GPIO引脚才具备外部中断的功能,可以设置外部中断的触发方式
GPIO引脚的外部中断触发方式:上升沿,下降沿,双边沿
3.2.1 引脚分组&中断通道
尾号相同的引脚一组,接入1个外部中断线,同组引脚只能有一个设置为外部中断功能
EXTI0~EXIT4分别具有独立的中断通道;
EXTI5~EXIT9共享同一个中断通道;
EXTI10~EXIT15共享同一个中断通道;
4.中断编程步骤
中断程序的编程步骤:{1-3在STM32CubeMx中完成;4-5在HAL库的接口函数完成}
(1)设置中断触发条件
(2)设置中断优先等级
(3)使能外设中断
(4)清除中断标志
(5)编写中断服务程序
4.1 HAL库对中断的封装处理
(1)统一规定处理各个外设的中断服务程序HAL_PPP_IRQ_Handler (PPP代表外设名称,GPIO)
(2)在中断服务程序HAL PPP IRQHandler完成了中断标志的判断和清除
(3)将中断中需要执行的操作以回调函数的形式提供给用户(由外设初始化、中断、处理完成/出错触发的函数)
4.2 启动文件&中断文件(由CubeMX生成的MDK工程中与中断相关的编程文件)
启动文件(startup_stm32fxxx.s):
(1)该文件存放在MDK-ARM组中。在该文件中,预先为每个中断编写了-个中断服务程序,只是这些中断服务程序都是死循环,目的只是初始化中断向量表;
(2)中断服务程序的属性定义为“weak”。weak属性的函数表示:如果该函数没有在其他文件中定义,则使用该函数;如果用户在其他地方定义了该函数,则使用用户定义的函数。
中断文件(stm32fxxx_it.c):
(1)该文件存放在User组中,用于存放各个中断的中断服务程序
(2)在使用CubeMX软件进行初始化配置时,如果使能了某一个外设的中断功能,那么在生成代码时,相对应的外设中断服务程序,HAL PPP IRQHandler就会自动添加到该文件中,用户只需要在该函数中添加相应的中断处理代码即可
5. 外部中断处理流程
(1)中断跳转跳转到该中断所对应的中断服务程序
(2)执行中断服务程序执行在stm32f4xx it.c中对应的中断服务程序
(3)外部中断通用处理函数判断中断标志井清除,调用外部中断回调函数
(4)执行用户编写的回调函数完成具体的中断任务处理
任务模拟:假设微控制器芯片为STM32F411,设置引脚PC0和PC13为外部中断功能;当引脚PCO或PC13出现脉冲边沿时,将触发外部中断。
外部中断所对应的中断服务程序:
(1)中断跳转跳转到该中断所对应的中断服务程序
(2)执行中断服务程序执行在stm32f4xx it.c中对应的中断服务程序
(3)外部中断通用处理函数判断中断标志井清除,调用外部中断回调函数
(4)执行用户编写的回调函数完成具体的中断任务处理
所有的外部中断服务程序都会调用该回调函数。如果系统中存在多个外部中断时,需要判断是哪一个GPIO引脚触发的本次外部中断。
另外如果用户没有设置回调函数,会跳进系统自带回调函数,没有任何功能只是为了保证程序完整性:
总结流程图:
本文由基础理论到 STM32 实践,覆盖中断的概念、机制、硬件架构及编程流程,重点阐述了 STM32 中断系统的特性与外部中断的处理逻辑
评论前必须登录!
注册