STM32通关之路——中断

目录

什么是中断?

一、NVIC简介

 1. NVIC寄存器简介

2. 优先级定义

 3. 中断编程

二、EXTI——外部中断/事件控制器

1. 产生中断线路介绍(红色虚线):

2. 产生事件线路(绿色虚线):

三、外部中断控制实验


什么是中断?

        CPU在正常执行程序的过程中,由于内部/外部事件的触发或程序的预先安排引起CPU暂时中断当前正在运行的程序,而转去执行中断服务子程序,待中断服务子程序执行完毕后,CPU继续执行原来的程序,这一过程称为中断;

中断处理的过程:

        第一步:保护现场,将当前位置的PC地址压栈;

        第二步:跳转到中断服务程序,执行中断服务程序;

        第三步:恢复现场,将栈顶的值回送给PC;

        第四步:跳转到被中断的位置开始执行下一个指令

中断响应时间:

        收到中断信号到操作系统做出响应,并完成切换转入到中断服务程序的时间。

一、NVIC简介

NVIC是嵌套向量中断控制器,控制整个芯片中断相关的功能,他跟内核紧密耦合,是内核里面的一个外设。

 1. NVIC寄存器简介

NVIC结构体定义

        在配置中断的时候我们一般只用ISER、ICER和IP这三个寄存器,ISER用来使能中断,ICER用来失能中断,IP用来配置中断优先级。 

2. 优先级定义

        在NVIC有一个专门的寄存器:中断优先级寄存器NVIC——IPRx,用来配置外部中断的优先级,IPR宽度为8bit,原则上每个外部终端可配置的优先级为0-255,数值越小,优先级越高。

        多数CM3芯片都会精简设计,以致实际上支持的优先级数减少,在F103中,只使用高4bit。

        用于表达优先级的这 4bit,又被分组成抢占优先级和子优先级。如果有多个中断同时响应,抢占优先级高的就会抢占抢占优先级低的优先得到执行,如果抢占优先级相同,就比较子优先级。如 果抢占优先级和子优先级都相同的话,就比较他们的硬件中断编号,编号越小,优先级越高。

 3. 中断编程

在配置中断的时候有3个编程要点:

  1. 使能外设某个中断,具体由每个外设的相关中断使能位控制;
  2. 初始化MVIC_InitTypeDef结构体,配置中断优先级分组,设置抢占优先级和子优先级,使能中断请求;
  3. 编写中断服务函数:为了初始化中断向量表,在启动文件中预先为每个中断都写了一个空的中断服务函数。实际的中断服务函数需要重新编写(中断服务函数的函数名必须跟启动文件里面预先设置的一样)。

二、EXTI——外部中断/事件控制器

EXTI(External interrupt/event controller)——外部中断/事件控制器,管理了控制器的20个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升/下降沿的检测。EXTI可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。

EXTI功能框图

 EXTI可分为两大部分功能,一个是产生中断,另一个是产生事件。

产生中断线路目的是把输入信号输入到 NVIC,进一步会运行中断服务函数实现功能是软件级的。产生事件线路目的就是传输一个脉冲信号给其他外设使用,并且是电路级别的信号传输,属于硬件级的。

1. 产生中断线路介绍(红色虚线):

  • 编号1是输入线,EXTI控制器有19个中断/时间输入线,这些输入先可以通过寄存器设置为任意GPIO,也可以是一些外设的事件。输入线一般是存在电平变化的信号。
  • 编号2 是一个边沿检测电路,它会根据上升沿触发选择寄存器 (EXTI_RTSR) 和下降沿触发选择寄存器 (EXTI_FTSR) 对应位的设置来控制信号触发。如果有边沿跳变就输出有效信号1给编号3 电路;
  • 编号3电路 是一个或门电路,输入分别来自编号2电路和软件中断事件寄存器(EXTI_SWIER)。EXTI_SWIER允许我们通过程序控制就可以启动中断/事件线。两个输入随便一个有效就可以输出1给编号4 和 编号6 电路;
  • 编号4 电路是一个与门电路,输入分别来自编号3电路和中断屏蔽寄存器(EXTI_IMR)。可以通过控制EXTI_IMR来实现是否产生中断的目的。如果确定编号4 电路输出为1就会把EXTI_PR对应位置置1;
  • 编号5 是将EXTI_PR寄存器内容输出到NVIC内,从而实现系统中断事件控制。

2. 产生事件线路(绿色虚线):

  • 编号1是输入线,EXTI控制器有19个中断/时间输入线,这些输入先可以通过寄存器设置为任意GPIO,也可以是一些外设的事件。输入线一般是存在电平变化的信号。
  • 编号2 是一个边沿检测电路,它会根据上升沿触发选择寄存器 (EXTI_RTSR) 和下降沿触发选择寄存器 (EXTI_FTSR) 对应位的设置来控制信号触发。如果有边沿跳变就输出有效信号1给编号3 电路;
  • 编号3电路 是一个或门电路,输入分别来自编号2电路和软件中断事件寄存器(EXTI_SWIER)。EXTI_SWIER允许我们通过程序控制就可以启动中断/事件线。
  • 编号6电路 是一个与门电路,输入分别来自于编号3电路 和 事件屏蔽寄存器(EXTI_EMR)。可以简单的控制EXTI_EMR来实现是否产生事件的目的。
  • 编号7 是一个脉冲发生器电路,当编号6输出有效信号1时就会产生一个脉冲。
  • 编号8是一个脉冲信号,这个脉冲信号可以给其他外设电路使 用,比如定时器 TIM、模拟数字转换器 ADC 等等,这样的脉冲信号一般用来触发 TIM 或者 ADC 开始转换。

三、外部中断控制实验

实验流程:

  1. 初始化用来产生中断的GPIO;
  2. 初始化EXTI;
  3. 配置NVIC;
  4. 编写中断服务函数;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值