IO 口作为外部中断输入
外部中断
1. NVIC
NVIC即嵌套向量中断控制器,它是内核的器件,M3/M4/M7 内核都是支持 256 个中断,其中包含了 16 个系统中断和 240 个外部中断,并且具有 256 级的可编程中断设置。然而芯片厂商一般不会把内核的这些资源全部用完,如 STM32F407 的系统中断有 10 个(NVIC),外部中断有82 个(EXTI)。//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 个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。
23表示在控制器内部类似的信号线路有 23 个,这与 EXTI 总共有 23 个中断/事件线是吻合的。EXTI 有两大部分功能,一条是由输入线到 NVIC 中断控制器
(产生中断),一条是由输入线到脉冲发生器(产生事件),两者从硬件上就存在不同。
产生中断:
编号 1 是输入线,EXTI 控制器有 23 个中断/事件输入线,这些输入线可以通过寄存器设置为任意一个 GPIO,也可以是一些外设的事件,输入线一般是存在电平变化的信号。
编号 2 是一个边沿检测电路,包括上升沿触发选择寄存器
(EXTI_RTSR)和下降沿触发选择寄存器(EXTI_FTSR)。边沿检测电路以输入线作为信号输入端,如果检测到有边沿跳变就输出有效信号‘1’,否则输出无效信号‘0’。而EXTI_RTSR和EXTI_FTSR两个寄存器可以控制器需要检测哪些类型的电平跳变过程,可以是只有上升沿触发、只有下降沿触发或者上升沿和下降沿都触发。编号 3 是一个或门电路,它的两个信号输入端分别是软件中断事件寄存器
(EXTI_SWIER)和边沿检测电路的输出信号。或门电路只要输入端有信号‘1’,就会输出‘1’,即通过对软件中断事件寄存器的读写操作就可以启动中断/事件线。编号 4 是一个与门电路,它的两个信号输入端分别是中断屏蔽寄存器
(EXTI_IMR)和 编号 3电路输出信号。与门电路要求输入都为‘1’才输出‘1’,如果中断屏蔽寄存器(EXTI_IMR)设置为‘0’时,不管从 编号 3电路输出的信号特性如何,最终 编号 4电路输出的信号都是‘0’;假如中断屏蔽寄存器(EXTI_IMR)设置为‘1’时,最终 编号 4电路输出的信号才由 编号 3电路输出信号决定,这样我们可以简单的控制 EXTI_IMR 来实现是否产生中断的目的。 编号 4 电路输出的信号会被保存到挂起寄存器(EXTI_PR)内,如果确定 编号 4电路输出为 1 就会把EXTI_PR对应位置 1。编号 5 是将挂起寄存器
(EXTI_PR)内容输出到 NVIC 内,从而实现系统中断事件控制。
产生事件:
编号 6 是一个与门,它的两个信号输入端分别是事件屏蔽寄存器
(EXTI_EMR)和 编号 3电路输出信号。如果EXTI_EMR寄存器设置为 0,那不管 编号 3电路输出的信号是‘0’还是‘1’,最终输出的都是‘0’;如果EXTI_EMR寄存器设置为 1,最终电路输出信号就由 编号 3电路输出的信号决定,这样子就可以简单的控制EXTI_EMR来实现是否产生事件。编号 7是一个脉冲发生器电路,当它的输入端 (编号 6电路的输出端),是一个有效信号 1 时就会产生一个脉冲;如果输入端是无效信号就不会输出脉冲。
编号 8是一个脉冲信号,就是产生事件的线路最终的产物,这个脉冲信号可以给其他外设电路使用,比如定时器 TIM、模拟数字转换器 ADC 等等,这样的脉冲信号一般用来触发 TIM 或者 ADC开始转换。
3. 配置外部中断的步骤
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐







所有评论(0)