历史上的今天
返回首页

历史上的今天

今天是:2024年12月29日(星期日)

2020年12月29日 | STM32 中断详解

2020-12-29 来源:eefocus

中断,在单片机中占有非常重要的地位。代码默认地从上向下执行,遇到条件或者其他语句,会按照指定的地方跳转。而在单片机执行代码的过程中,难免会有一些突发的情况需要处理,这样就会打断当前的代码,待处理完突发情况之后,程序会回到被打断的地方继续执行。

1 EXTI控制器

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

外部信号进入经过1的边沿检测电路,检测是否符合(有2和3的上升沿和下降沿选择寄存器决定),产生信号,然后和4软件中断事件寄存器或值,(在这里也就说可以写入软件中断事件寄存器模拟中断和事件),之后产生信号一分为二,看5中断屏蔽寄存器和7事件屏蔽寄存器,如果中断和事件都没有屏蔽,首先会产生事件,进入脉冲发生器。其次,会进入6挂起寄存器,然后进入NVIC。

 

注意:

1、上面说,我们可以使用寄存器4软件模拟中断事件寄存器模式符合条件的信号进入,为什么不能用6寄存器呢?因为

寄存器是可读可清除的寄存器,通过写1清除。写0无效。所以不能使用

2、关于挂起寄存器,挂起就是,证明有了中断,会在触发中断。但是不会硬件清除。

只能软件清除,或者修改边沿极性的时候清除。如下

先说EXTI吧, 

EXTI 控制器的主要特性:

  • 每个中断/事件线上都具有独立的触发和屏蔽

  • 每个中断线都具有专用的状态位

  • 支持多达23个软件事件/中断请求

  • 检测脉冲宽度低于APB2 时钟宽度的外部信号

下图是ST207的框架图

下图为翻译版

从图中看出和外部中断有关的寄存器有:上升沿触发选择、下降沿触发选择、软件中断事件寄存器、中断屏蔽寄存器、挂起请求寄存器、事件屏蔽寄存器和NVIC中断控制寄存器等。此外就是对输入线的理解了。

另外七根 EXTI 线连接方式如下

也就是说对于一个外部中断线可以和多个GPIO相连,当你要使用哪一个IO的时候只要对SYSCFG_EXTICR对应的位设置就好了,在中断屏蔽寄存器或事件屏蔽寄存器对应位可以设置使用哪一个中断线

注:ST的使用SYSCFG_EXTICR来配置,GD的采用AFIO寄存器(在GPIO寄存器中)

EXTI是外部中断吧,上面的主要是针对的这22条中断线的说明,我们还知道还是有很多中断的,比如定时器中断,串口中断等等,他们不属于这22条中断线。

我们可以在中断向量表中看到

其他的中断配置都在各个模块的寄存器中了

 

2 NVIC控制器

在上面的EXTI寄存器都设置好后就可以设置NVIC了,关于NVIC的芯片编程手册上描述较少,但是说了

所以我们就参考一下M3手册吧

找到AIRCR寄存器,其中8到10位为优先级分组

我们在代码中使用的库函数是

void NVIC_PRIGroup_Enable(uint32_t NVIC_PRIGroup)

{

    /*Set the priority grouping value */

    SCB->AIRCR =AIRCR_VECTKEY_MASK | NVIC_PRIGroup;

}

其中我们查到

1、SCB->AIRCR在库函数的地址是0XE000ED0C,不懂的如何查询的,请自行百度

2、查到SCB的结构体定义

我们看到SCB是SystemControl Block的简写

下面我们说一下分组的取值

在misc.c中有


*   ==========================================================================================================================

 *      NVIC_PriorityGroup   | NVIC_IRQChannelPreemptionPriority |NVIC_IRQChannelSubPriority  |       Description

  *   ==========================================================================================================================

 *     NVIC_PriorityGroup_0  |                0                  |           0-15             | 0 bits for pre-emption priority

  *                          |                                   |                            | 4 bits for subpriority

  *   --------------------------------------------------------------------------------------------------------------------------

 *     NVIC_PriorityGroup_1  |                0-1                |           0-7              | 1 bits for pre-emption priority

  *                          |                                   |                            | 3 bits for subpriority

  *   --------------------------------------------------------------------------------------------------------------------------  

  *     NVIC_PriorityGroup_2  |                0-3               |            0-3              | 2 bits for pre-emption priority

 *                           |                                   |                            | 2 bits for subpriority

  *   --------------------------------------------------------------------------------------------------------------------------  

  *     NVIC_PriorityGroup_3  |                0-7               |            0-1              | 3 bits for pre-emption priority

 *                           |                                   |                            | 1 bits for subpriority

  *   --------------------------------------------------------------------------------------------------------------------------  

  *     NVIC_PriorityGroup_4  |                0-15              |            0                | 4 bits for pre-emption priority

 *                           |                                   |                            | 0 bits for subpriority                      

  *   ==========================================================================================================================

抢占优先级& 响应优先级区别


高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。

抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。

抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。

如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行。

例子:


假定设置中断优先级组为2,然后设置


中断3(RTC中断)的抢占优先级为2,响应优先级为1。


中断6(外部中断0)的抢占优先级为3,响应优先级为0


中断7(外部中断1)的抢占优先级为2,响应优先级为0。


那么这3个中断的优先级顺序为:中断7>中断3>中断6


 


表现在代码中


NVIC_InitPara NVIC_InitStructure;

NVIC_InitStructure.NVIC_IRQ = IRQn;

NVIC_InitStructure.NVIC_IRQPreemptPriority =pri;

NVIC_InitStructure.NVIC_IRQSubPriority = pri1;

NVIC_InitStructure.NVIC_IRQEnable = ENABLE;

NVIC_Init(&NVIC_InitStructure);

分组0,那么pri的取值范围0~0,pri1的取值范围0~16


分组2,那么pri的取值范围0~4,pri1的取值范围0~4


分组4,那么pri的取值范围0~16,pri1的取值范围0~0


下面我们讲解一下NVIC寄存器

__IO uint8_t  IP[240]; //中断优先级控制的寄存器组


__IO uint32_t ISER[8]; //中断使能寄存器组


__IO uint32_t ICER[8]; //中断失能寄存器组


__IO uint32_t ISPR[8]; //中断挂起寄存器组


__IO uint32_t ICPR[8]; //中断解挂寄存器组


__IO uint32_t IABR[8]; //中断激活标志位寄存器组


 


中断优先级控制的寄存器组:IP[240]


全称是:InterruptPriority Registers


240个8位寄存器,每个中断使用一个寄存器来确定优先级。


比如:STM32F10x系列一共60个可屏蔽中断,使用IP[59]~IP[0]。


每个IP寄存器的高4位用来设置抢占和响应优先级(根据分组),低4位没有用到。


void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

 


中断使能寄存器组:ISER[8]


作用:用来使能中断


32位寄存器,每个位控制一个中断的使能。STM32F10x只有60个可屏蔽中断,所以只使用了其中的ISER[0]和ISER[1]。


ISER[0]的bit0~bit31分别对应中断0~31。ISER[1]的bit0~27对应中断32~59;


void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

 


中断失能寄存器组:ICER[8]


作用:用来失能中断


32位寄存器,每个位控制一个中断的失能。STM32F10x只有60个可屏蔽中断,所以只使用了其中的ICER[0]和ICER[1]。


ICER[0]的bit0~bit31分别对应中断0~31。ICER[1]的bit0~27对应中断32~59;


配置方法跟ISER一样。


void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

 


中断挂起控制寄存器组:ISPR[8]


作用:用来挂起中断


中断解挂控制寄存器组:ICPR[8]


作用:用来解挂中断


static __INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn);

static __INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn);

static __INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn);

 


中断激活标志位寄存器组:IABR[8]


作用:只读,通过它可以知道当前在执行的中断是哪一个


如果对应位为1,说明该中断正在执行。


static __INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn)

3 code

 


一定要使能系统时钟


因为配置GPIO和中断线的映射关系需要SYSCFG


SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource11);

只要用到外部中断,就一定要打开SYSCFG时钟

推荐阅读

史海拾趣

Appointech Inc公司的发展小趣事

随着技术的不断进步,Appointech Inc公司意识到只有不断创新才能在竞争激烈的市场中立足。因此,公司加大了对研发的投入,不断引进新的技术和设备。经过团队的不懈努力,公司成功开发出了一款具有颠覆性的电子产品,该产品不仅性能卓越,而且具有高度的集成性和便利性,为公司在行业中树立了新的标杆。

Corsair Memory Inc公司的发展小趣事

随着公司的发展,Corsair Memory Inc不仅局限于内存产品的生产,还积极扩大业务范围。其中,收购SCUF Gaming是Corsair在扩展业务版图上的重要一步。这一收购使Corsair得以进入游戏外设市场,进一步丰富了其产品线,也为其带来了更多的增长机会。

Gould Ami公司的发展小趣事
包括电路板损坏、元件老化、接触不良等问题,可能导致脉冲信号异常或无法发出。
ABL Aluminum Components公司的发展小趣事

随着业务规模的不断扩大,ABL公司开始面临供应链管理的挑战。为了应对这一挑战,公司引入了先进的供应链管理系统,实现了从原材料采购、生产制造到产品销售的全程监控。同时,ABL公司还与供应商建立了长期稳定的合作关系,确保了原材料的稳定供应和成本控制。通过优化供应链管理,ABL公司提高了生产效率和市场响应速度,进一步巩固了市场地位。

Gold Peak Group公司的发展小趣事
对操作人员进行必要的培训,使其了解控制电路的工作原理、操作方法和安全注意事项。
FCT electronic公司的发展小趣事

随着技术的不断成熟和市场需求的增长,FCT electronic公司开始寻求市场扩张和多元化发展。公司决定将产品线拓展至刚挠结合板和挠性加热器领域,以满足不同客户的需求。同时,FCT electronic公司还积极开拓国际市场,通过参加国际展览、与海外企业合作等方式,逐渐在全球电子行业中树立了品牌形象。

问答坊 | AI 解惑

D类放大器原理详解及应用设计指南(完整版)

D类放大器首次提出于1958年,近些年已逐渐流行起来。那么,什么是D类放大器?它们与其它类型的放大器相比如何? 为什么D类放大器对于音频应用很有意义?设计一个“优质”D类音频放大器需要考虑哪些因素? 美国模拟器件公司(简称ADI公司)D类放大器产品 ...…

查看全部问答>

硬件设计工程师招聘信息

本公司根据产品的需要,高薪诚聘有经验的硬件设计工程师/产品设计经理 公司名称:北京天宇威视科技有限公司 岗位职责: 1、根据新产品目标,提出新产品功能要求及硬件结构设计可行性方案; 2、综合考虑功能、成本、稳定性、工艺性等因素,提出 ...…

查看全部问答>

为什么我从这里找的DDK的开发工具装不起呢?

   我刚才从下载区找了一个DDK的压缩文件,可是好像根本就装不起!谁知道哪里有可以用的XP系统的DDDK呢?谢谢各位大侠了!…

查看全部问答>

电脑上的开关电源问题

问:哪位高手知道电脑开关电源上的绿线和地线能长时间间端接吗?…

查看全部问答>

有没有一种像太阳能电池板似的光感应板

有没有一种像太阳能电池板似的光感应板?或者,太阳能电池板能当传感器使用么?哪位大侠帮忙解答下!不尽感谢!…

查看全部问答>

Linux与windows之比较

和Linux 一样,Windows系列是完全的多任务操作系统。它们支持同样的用户接口 、网络和安全性。但是Linux和Windows的真正区别在于,Linux 事实上是Unix的一种版本,而且来自Unix的贡献非常巨大。是什么使得Unix如此重要?不仅在 于对多用户机器来说 ...…

查看全部问答>

LM358电路分析

请各位大侠帮小弟分析分析上图两个LM358的输出为什么不同。谢谢师傅赐教…

查看全部问答>

DIY数控电源外观实拍

DIY数控电源外壳和面板组装完成。机内没有装主板。主板部分dontium等还在开发中。 这个并不是最终版本,组装过程中发现了一些问题,好在问题不大。这些问题会在下一版图纸中解决。 发这个贴子只是让各位关注这个DIY项目的坛友得到一些项目进展情 ...…

查看全部问答>

FPGA IO 电平标准 不同时,FPGA IO 的差别

1,FPGA IO 电平标准选择不同时,IO内部的区别是什么?比如设置成3.3V的IO和1.8的IO,FPGA内部的不同是什么?, 2,FPGA内部改变了什么,使FPGA IO 可以设置成不同的电平标准?3,我在配置管脚时,配置的电平的标准是3.3V;但实际的电路是1.8V的(i ...…

查看全部问答>

齐纳二极管调整器设计

齐纳二极管调整器设计 作者:Ron Mancini -- EDNIC参考很受电路设计者的欢迎,因为它们不仅精确而且飘移很小。在我今后的一些专栏文章中,将陆续讨论三种IC参考:埋入式齐纳二极管、带隙及XFET。当您用齐纳二极管进行参考设计时,由于齐纳二极管 ...…

查看全部问答>