STM32单片机中断详解

目录

1 中断相关概念

1.1 什么是中断?

1.2 中断的意义

1.3 中断优先级

1.4 中断嵌套

1.5 中断执行流程

2 STM32中断

2.1 中断数量(以SMT32F103C8T6为例)

2.2 中断向量表

2.3 SMT32中断框图

3 NVIC(嵌套向量中断控制器)

3.1 NVIC(嵌套向量中断控制器)

3.2 NVIC工作原理

3.3 中断优先级基本概念

3.4 NVIC寄存器

3.5 NVIC相关函数介绍

4 EXTI(外部中断)

4.1 EXTI简介

4.2 中断/事件

4.3 EXTI基本结构

4.4 EXTI基本框图

4.5 EXTI寄存器(结合EXTI基本框图进行理解)

4.6 EXTI相关函数

5 AFIO(复用功能IO)

5.1 AFIO简介

5.2 AFIO与IO对应关系

5.3 AFIO寄存器

5.4 EXTI配置流程


1 中断相关概念

1.1 什么是中断?

  • 中断是单片机正在执行程序时,由于内部或外部事件的触发,打断当前程序,转而去处理这一事件,当处理完成后再回到原来被打断的地方继续执行原程序的过程。

  • 在ARM体系结构中,中断通常由外设或外部输入产生,有时也可以由软件触发。中断是单片机系统处理紧急或突发事件的重要方式,如定时器溢出、按键输入、串口数据到达等。

1.2 中断的意义

  • 中断的主要意义在于提高CPU的效率,而不会一直占用CPU,实现对突发事件的实时处理,以及实现程序的并行化和嵌入式系统进程之间的切换。
  • 相较于轮询方式(即按照一定的频率和周期不断地检测某些事件的发生),中断在处理一些偶然发生的事情时效率更高。

1.3 中断优先级

STM32的Cortex-M3内核中有16个内部中断、240个外部中断和可编程的256级优先级设置。

目前支持84(16内部+68外部)个,和16级可编程中断优先级设置

优先级冲突处理

  • STM32中中断通道可配置为响应优先级和抢占优先级
  • 具有高抢占式优先级的中断 可以在具有低抢占式优先级的中断处理过程中被响应。 (即中断的嵌套)(或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断)
  • 当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系。当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。
  • 如果上述两个中断**同时到达,**并且抢占优先级相同 则中断控制器会根据它们的响应优先级的高低来决定先处理哪一个; 如果它们的抢占式优先级和响应式优先级都相等,则根据它们在中断表中的排位顺序决定先处理哪一个。

数字越小优先级越高。

1.4 中断嵌套

如果一个高优先级的中断发生,它会立即打断当前正在处理的中断(如果其优先级较低),并首先处理这个 高优先级的中断,这就是所谓的中断嵌套。

1.5 中断执行流程

当中断发生时,STM32的执行流程如下:首先,由外设发出中断请求;然后,处理器暂停当前执行的任务,保护现场(如将当前位置的PC地址压栈);接着,程序跳转到对应的中断服务程序(ISR)并执行;中断服务程序执行完毕后,恢复现场(如将栈顶的值送回PC);最后,处理器返回到被中断的位置,继续执行下一个指令。

2 STM32中断

2.1 中断数量(以SMT32F103C8T6为例)

SMT32F103C8T6支持的中断共有70个,其中包括10个内核中断和60个外部中断。其中外部中断包含EXTI、TIM、ADC、I2C、SPI等等。

2.2 中断向量表

  • STM32的中断向量表是一个存储中断处理函数地址的数组,位于Flash区的起始位置。每个数组元素对应一个中断源,其地址指向相应的中断服务程序。 当中断发生时,处理器会根据中断号查找向量表,然后跳转到对应的中断服务程序执行。
  • 中断向量表的主要作用是解决中断函数地址不固定与中断必须跳转到固定地方执行程序之间的矛盾。由于编译器每次编译都会为中断函数随机分配地址,但硬件要求中断必须跳转到固定的位置,因此,**中断向量表就作为这样一个固定的地址列表,其中包含了中断函数的地址以及跳转到这些地址的程序。**当中断发生时,处理器会跳转到这个固定的中断向量表,然后根据其中的信息跳转到相应的中断处理函数从而执行中断。

2.3 SMT32中断框图

3 NVIC(嵌套向量中断控制器)

3.1 NVIC(嵌套向量中断控制器)

  • NVIC,即Nested Vectored Interrupt Controller(嵌套向量中断控制器),是STM32中的中断控制器。它负责管理和协调处理器的中断请求,是STM32中处理异步事件的重要机制。
  • NVIC提供了灵活、高效、可扩展的中断处理机制,支持多级优先级、多向中断、嵌套向量中断等特性。
  • 当一个中断请求到达时,NVIC会确定其优先级并决定是否应该中断当前执行的程序,以便及时响应和处理该中断请求。这种设计有助于提高系统的响应速度和可靠性,特别是在需要处理大量中断请求的实时应用程序中。
  • NVIC 支持:256个中断(16内核+240外部),支持:256个优先级,允许裁剪。

3.2 NVIC工作原理

3.3 中断优先级基本概念

  • NVIC可以管理多个中断请求,并按优先级处理它们。

  • 在STM32中,中断优先级被划分为抢占式优先级和响应 优先级,可以根据具体的应用需求进行配置。不同的优先级分组方式会影响中断的响应和处理顺序。

  • 抢占优先级 如果一个中断的抢占优先级高于当前正在执行的中断,那么它可以打断当前中断,优先得到执行。数值越小,优先级越高。

  • 应优先级 如果两个中断同时到达,且它们的抢占优先级相同,那么响应优先级高的中断将首先得到响应。数值越小,优先级越高。

  • 自然优先级 自然优先级是由硬件固定并预先设定的,用户无法更改。当抢占优先级和响应优先级都相同时,自然优先级将决定哪个中断先得到处理。

  • 优先级执行顺序 当多个中断同时发生时,执行顺序首先由抢占优先级决定。如果抢占优先级相同,则进一步由响应优先级决。如果响应优先级也相同,则最终由自然优先级决定。

  • 在中断嵌套的情况下, 高抢占优先级的中断可以打断低抢占优先级的中断, 但高响应优先级的中断不能打断低响应优先级的中断(当它们具有相同的抢占优先时)。

  • 优先级分组 优先级寄存器 IPR 有 8 位,但实际只使用到高 4 位,用于决定抢占优先级、响应优先级的等级。 具体这 4 位如何切割?由又由 AIRCR 寄存器控制。

3.4 NVIC寄存器

3.5 NVIC相关函数介绍

  • 在contex.c中可以查看到以下函数:

  • 其中,只有DisableIRQ(中断失能函数)、EnableIRQ(中断使能函数)、GetPriority(中断优先级函数)、GetPriorityGrouping(中断优先级分组函数)经常使用。

4 EXTI(外部中断)

4.1 EXTI简介

  • EXTI 是 External Interrupt 的缩写,表示外部中断事件控制器。
  • EXTI 可以监测指定 GPIO 口的电平信号变化,并在检测到指定条件时,向内核的中断控制器 NVIC 发出中断申请。
  • NVIC 在裁决后,如果满足条件,会中断CPU的主程序,使 CPU 转而执行EXTI 对应的中断服务程序。
  • EXTI 支持的触发方式:上升沿、下降沿、双边沿或软件触发。
  • EXTI 支持所有的 GPIO 口,但需要注意的是,**相同的 Pin 不能同时触发中断。**例如,PA0 和 PB0 不能同时被配置为中断源。
  • EXTI 提供了 16 个 GPIO_Pin 的中断线,以及额外的中断线如 PVD 输出、RTC 闹钟、USB 唤醒和以太网唤醒。
  • 通过适当的配置,EXTI可以实现丰富多样的功能,如响应按键的按下、传感器的状态变化等外部事件。

4.2 中断/事件

  • 中断会打断CPU当前正在执行的程序,转而去执行中断服务程序,待中断服务程序执行完毕后,CPU会返回到原来的程序执行点继续执行。
  • 而事件只是简单地表示某个动作或状态的变化,而不会打断CPU当前正在执行的程序。当事件发生时,它会根据配置来决定是否触发相应的中断。如果开放了对应的中断屏蔽位,事件就可以触发相应的中断,否则事件只会作为一个信号存在,不会被CPU处理。

4.3 EXTI基本结构

4.4 EXTI基本框图

4.5 EXTI寄存器(结合EXTI基本框图进行理解)

  • 中断屏蔽寄存器(EXTI_IMR)结合EXTI基本框图进行理解

  • 事件屏蔽寄存器(EXTI_EMR)

  • 上升沿触发选择寄存器(EXTI_RTSR)

  • 下降沿触发选择寄存器(EXTI_FTSR)

  • 软件中断事件寄存器(EXTI_SWIER)

  • 挂起寄存器(EXTI_PR)

4.6 EXTI相关函数

这两个函数在gpio.c文件中,Callback函数是回调函数,IRQHandler函数是中断处理函数。

5 AFIO(复用功能IO)

5.1 AFIO简介

  • AFIO 是 Alternate Function Input/Output 的缩写,表示复用功能 IO,主要用于实现 I/O 端口的复用功能以及外部中断的控制。
  • STM32上有很多 I/ O口以及内置外设(如I2C、ADC、ISP、USART等)。 为了节省引出管脚的数量,这些内置外设通常与 I/O 口共用管脚,即 I/O 管脚具有复用功能。 例如,一个 GPIO 管脚除了可以作为普通的 I/O端口外,还可以被复用为某个内置外设的功能引脚。
  • 然而,为了优化64脚或100脚封装的外设数量,有时需要将一些复用功能重新映射到其他引脚上。这时,就可以使用AFIO的复用重映射功能。通过设置复用重映射和调试I/O配置寄存器(AFIO_MAPR),可以实现引脚的重新映射,使得复用功能不再映射到它们的原始分配上。
  • 此外,AFIO 还用于控制外部中断,用来配置 EXTI 中断线 0~15 对应哪个具体 IO 口。
  • 当需要使能外部中断线或进行外部中断线的映射时,通常需要开启AFIO的时钟。

5.2 AFIO与IO对应关系

5.3 AFIO寄存器

外部中断配置寄存器(AFIO_EXTICR)

5.4 EXTI配置流程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值