IO 口作为外部中断输入

外部中断

  • [1. NVIC](#1. NVIC)
  • [2. EXTI](#2. EXTI)

1. NVIC

NVIC即嵌套向量中断控制器,它是内核的器件,M3/M4/M7 内核都是支持 256 个中断,其中包含了 16 个系统中断和 240 个外部中断,并且具有 256 级的可编程中断设置。然而芯片厂商一般不会把内核的这些资源全部用完,如 STM32F407 的系统中断有 10 个(NVIC),外部中断有82 个(EXTI)

c 复制代码
//NVIC 寄存器
typedef struct
{
     _IOM uint32_t ISER[8U]; /* 中断使能寄存器 */
     uint32_t RESERVED0[24U];
     __IOM uint32_t ICER[8U]; /* 中断清除使能寄存器 */
     uint32_t RSERVED1[24U];
     __IOM uint32_t ISPR[8U]; /* 中断使能挂起寄存器 */
     uint32_t RESERVED2[24U];
     __IOM uint32_t ICPR[8U]; /* 中断解挂寄存器 */
     uint32_t RESERVED3[24U];
     __IOM uint32_t IABR[8U]; /* 中断有效位寄存器 */
     uint32_t RESERVED4[56U];
     __IOM uint8_t IP[240U]; /* 中断优先级寄存器(8Bit 位宽) */
     uint32_t RESERVED5[644U];
     __OM uint32_t STIR; /* 中断触发中断寄存器 */
} NVIC_Type;
  • ISER[8]:中断使能寄存器组。用 8 个 32 位寄存器来控制,每个位控制一个中断。STM32F407 的可屏蔽中断最多只有 82 个,ISER[0]的 bit0~31 分别对应中断0~31;ISER[1]的 bit0~31 对应中断 32~63; ISER[2]的 bit0~16 对应中断 64~81。设置相应的 ISER 位为 1,使该中断被使能。

  • ICER[8]:中断除能寄存器组。用来清除某个中断的使能的,对应位的功能和 ISER 一样。写 1 有效的,写 0 是无效的。

  • ISPR[8]:中断使能挂起控制寄存器组。将正在进行的中断挂起,去执行同级或更高级别的中断,对应位的功能和 ISER 一样。写 1 有效的,写 0 是无效的。

  • ICPR[8]:中断解挂控制寄存器组。其作用与 ISPR 相反,将挂起的中断解挂。对应位的功能和 ISER 一样。写 1 有效的,写 0 是无效的。

  • IABR[8]:中断激活标志位寄存器组。这是一个只读寄存器,通过它可以知道当前在执行的中断是哪一个。对应位的功能和 ISER 一样,置 1,则表示该位所对应的中断正在被执行。在中断执行完了由硬件自动清零。

  • IP [240]:中断优先级控制的寄存器组。IP 寄存器组由 240 个 8bit 的寄存器组成,每个可屏蔽中断占用 8bit,总共可以表示 240 个可屏蔽中断。而 STM32F407N只用到了其中的 82 个。IP[81] ~ IP[0] 分别对应中断 81~0。而每个可屏蔽中断占用的 8bit 并没有全部使用,而是只用了高四位[7:4],低四位取零,致使最多只有 16 级中断嵌套。这 4 位,又分为抢占优先级和子优先级。抢占优先级在前,子优先级在后。这两个优先级各占几个位由SCB->AIRCR中的中断分组设置决定。
    抢占优先级: 抢占优先级高的中断可以打断正在执行的抢占优先级低的中断。
    响应优先级: 抢占优先级相同,响应优先级高的中断不能打断响应优先级低的中断。
    抢占式优先级和响应优先级相同时,则遵循自然优先级,看中断向量表的中断排序,数值越小,优先级越高。

  • STIR:只写属性,允许开发者通过向该寄存器写入目标中断的中断号(IRQn),直接触发对应的中断服务程序。一般使用场景为:
    调试与测试:模拟硬件中断事件,验证中断处理逻辑的正确性;
    系统调度:在实时操作系统中,通过软件中断实现任务切换(例如触发PendSV中断)

2. EXTI

EXTI 即是外部中断和事件控制器,它是由 20 个产生事件/中断请求的边沿检测器组成。每一条输入线都可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以独立地被屏蔽。挂起寄存器保持着状态线的中断请求。
STM32F407 的中断控制器支持 22 个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。

EXTI 线 0~15 对应外部 IO 口的输入中断
EXTI 线 16 连接到 PVD 输出
EXTI 线 17 连接到 RTC 闹钟事件
EXTI 线 18 连接到 USB OTG FS 唤醒事件
EXTI 线 19 连接到以太网唤醒事件
EXTI 线 20 连接到 USB OTG HS(在 FS 中配置)唤醒事件
EXTI 线 21 连接到 RTC 入侵和时间戳事件
EXTI 线 22 连接到 RTC 唤醒事件

STM32F4 供 IO 口使用的中断线只有 16 个,但是 STM32F4 的 IO 口却远远不止 16 个,于是将 GPIO 的管脚 GPIOx.0~GPIOx.15(x=A,B,C,D,E,F,G,H,I)分别对应中断线 0~15。这样每个中断线对应了最多 9 个 IO 口,以线 0 为例:它对应了 GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0、GPIOH.0、GPIOI.0。而中断线每次只能连接到 1 个 IO 口上,这样就需要通过配置来决定对应的中断线配置到哪个 GPIO 上了。


EXTI 有两大部分功能,一条是由输入线到 NVIC 中断控制器(产生中断),一条是由输入线到脉冲发生器(产生事件),两者从硬件上就存在不同。

产生中断:最终信号流入 NVIC 控制器中,输入线可通过配置寄存器设置为任何一个 GPIO 口,或一些外设的事件。输入线一般都是存在电平变化的信号。

  • 标号① 是一个边沿检测电路,包括上升沿触发选择寄存器(EXTI_RTSR)和下降沿触发选择寄存器(EXTI_FTSR)。边沿检测电路以输入线作为信号输入端,如果检测到有边沿跳变就输出有效信号'1',否则输出无效信号'0'。边沿跳变的标准在于开始的时候对于上升沿触发选择寄存器或下降沿触发选择寄存器对应位的设置。

  • 标号② 是一个或门电路,它的两个信号输入端分别是软件中断事件寄存器(EXTI_SWIER)和边沿检测电路的输出信号。或门电路只要输入端有信号'1',就会输出'1',即通过对软件中断事件寄存器的读写操作就可以启动中断/事件线。

  • 标号③ 是一个与门电路,它的两个信号输入端分别是中断屏蔽寄存器(EXTI_IMR)和标号②电路输出信号。与门电路要求输入都为'1'才输出'1',如果中断屏蔽寄存器(EXTI_IMR)设置为'0'时,不管从标号②电路输出的信号特性如何,最终标号③电路输出的信号都是'0';假如中断屏蔽寄存器(EXTI_IMR)设置为'1'时,最终标号③电路输出的信号才由标号②电路输出信号决定,标号③电路输出'1'就会把请求挂起寄存器(EXTI_PR)对应位置'1',这样子就可以简单控制 EXTI_IMR 来实现中断的目的。最后,请求挂起寄存器(EXTI_PR)的内容就输出到 NVIC 内,实现系统中断事件的控制。

产生事件:最终信号流入 NVIC 控制器中,输入线可通过配置寄存器设置为任何一个 GPIO 口,或一些外设的事件。输入线一般都是存在电平变化的信号。

  • 标号④ 是一个与门,它的两个信号输入端分别是事件屏蔽寄存器(EXTI_EMR)和标号②电路输出信号。如果 EXTI_EMR 寄存器设置为 0,那不管标号② 电路输出的信号是'0'还是'1',最终标号④输出的都是'0';如果 EXTI_EMR 寄存器设置为 1,最终标号④电路输出信号就由标号②电路输出的信号决定,这样子就可以简单的控制 EXTI_EMR 来实现是否产生事件。标号④电路输出有效信号'1'就会使脉冲发生器电路产生一个脉冲,而无效信号'0'就不会使其产生脉冲信号。脉冲信号产生可以给其他外设电路使用,例如定时器,模拟数字转换器等,这样的脉冲信号一般用来触发 TIM 或者 ADC 开始转换。
相关推荐
无畏jh7 分钟前
TLE5012B磁阻芯片解读
嵌入式硬件·汽车嵌入式·磁阻芯片
培林将军15 分钟前
Altium Designer 22的安装与汉化
嵌入式硬件·ad工具安装
idcardwang17 分钟前
xl9555-IO拓展芯片
stm32·单片机·嵌入式硬件
Y1rong20 分钟前
STM32之EXTI
stm32·单片机·嵌入式硬件
兆龙电子单片机设计25 分钟前
【STM32项目开源】STM32单片机智能语音家居控制系统
stm32·单片机·嵌入式硬件·物联网·开源·自动化
TaidL1 小时前
茂捷M1020电感式编码器芯片赋能工业智能升级,适用于工业及机器人等领域的各种应用场景
单片机·嵌入式硬件
意法半导体STM321 小时前
【官方原创】SAU对NSC分区的影响 LAT1578
stm32·单片机·嵌入式硬件·mcu·信息安全·trustzone·stm32开发
SmartRadio1 小时前
MK8000(UWB射频芯片)与DW1000的协议适配
c语言·开发语言·stm32·单片机·嵌入式硬件·物联网·dw1000
LDR0061 小时前
芯片电路的引脚标识代表什么?
stm32·单片机·嵌入式硬件
恒锐丰小吕2 小时前
屹晶微 EG3116 600V高压、2A/2.5A驱动、双高有效输入逻辑的半桥栅极驱动芯片技术解析
嵌入式硬件·硬件工程