有效使用单片机外设功能:(4)中断功能

cathy的头像

我们已经介绍了应用单片机的外设功能的结构和使用方法。本期我们介绍更有效地应用单片机而必须的外设功能——“中断功能”。

提高作业效率的“中断功能”指的是什么?

我们回顾一下本系列第二期的“定时器”篇中简单介绍过的“中断功能”概念。任何人都有过这样的经验,就是“将鸡蛋放进沸腾的热水中,直到鸡蛋煮熟的10分钟内要确认好几次时钟”的经历。在单片机的世界中也同样,在等待某种状态达成时,具有对对象进行定期检查的方法。例如,在等待向GPIO(通用I/O端口)的输入从0变为1时,程序可以一定的间隔来检查GPIO的状态。这种处理被称为“轮询”。

轮询虽然是一种了解状态变化的简单方法,但是如果检查的频度低(间隔长)就会错过变化,如果频度过高(间隔短),即使查也查不到变化“空耗”。由于轮询通过简单的程序便能完成处理,所以在掌握对象的变化频度时是有效的。但是,进行多次检查也会给单片机带来负荷,对功耗不利。

因此就要用到本期介绍的“中断功能”。产生中断时,CPU会暂时停止正在执行的任务,转而进行别的任务。也就是有别的任务“穿插”进来的意思(图1) 。当中途穿插进来的任务结束后,CPU再返回处理原来的任务。

【技术干货】单片机入门:中断

cathy的头像

本连载讲解作为嵌入式系统开发技术人员所必需具备的单片机的基础知识。本期为最后一期,将为大家介绍在单片机控制系统中不可缺少的 处理方式--“中断”的基础知识。

“中断”与“轮询”

本期是单片机入门连载的最后一期。第1期我们学习了“单片机的基本构成”,第2期学习了“单片机的外围功能电路”,第3期学习了“单片机的编程语言和开发环境”,第4期学习了“单片机的外部外围功能电路控制”的基础知识。本期我们将说明在单片机编程过程中一定会遇到的、也是单片机控制中不可缺少的一种处理方式---“中断”。

“中断”处理并非单片机控制系统所特有的现象,在我们的日常生活中“中断”的例子也随处可见。让我们来看看身边的例子吧。比如尽管您知道今天有快递送到,但却不知道快递送来的具体时间,在这种情况下,也许您会选择坐在客厅里边看书,边等快递送来。在您看书其间,门铃响的时候就表明快递到了(有事件发生)。这就是“中断”的例子。

单片机中断源

一般而言,MCS-51单片机有5个中断源,分别是:外部中断0、外部中断1、定时/计数器0中断、定时/计数器1中断、串行口发送或接受中断。

用到外部中断

EX0=1;//中断允许开关

IT0=0;//下降沿触发方式

EA=1;//总开关

用到定时/计数器中断

ET0=1;//启动计数器中断开关

EA=1;//总开关

//定时器的核心在这下面这段代码

TMOD=0x09;

TH0=0x0D8;

TL0=0x0F0;

TR0=1;//启动定时器

用到串口中断

EX1=1;//外部中断1分开关

IT1=1;//触发方式:下降沿

PX1=1;//设置为高优先级

//波特率配置,由定时器1的益处率决定

TMOD=0x20;

//00100000=0x20,定时器1设置为工作方式2,8位自动装载的定时器

TH1=0xF4;//初值

TL1=0xF4;//波特率4800

ET1=1;//定时器1允许分开关

TR1=1;//启动定时

//设置串口工作方式

SCON=0x50;//等同于TMOD,方式一,允许接收01010000

//PCON=0x00;

//TI =0;发送中断标志位

//RI =0;接收中断标志位

ES=1;//IE寄存器第四位,串口中断允许位

EA=1;//外部中断总开关

单片机寄存器

1、中断允许寄存器IE

按位寻址,地址位A8H。

“”

EX0:中断0中断允许位。1为允许,0否则相反。

EX1:中断1中断允许位。1为允许,0否则相反。

ET0:定时器/计数器0中断允许位。1为允许,0否则相反。

ET1:定时器/计数器1中断允许位。1为允许,0否则相反。

ES:串口中断允许位。

ET2:定时/计数器2中断允许位(8052用)。

EA:总开关。

如果定时器工作在中断方式下,则当定时器的当前值计满溢出时,就会触发定时器溢出中断。

2、定时控制寄存器TCON

按位寻址,地址位88H。

IT0:外部中断0触发方式。1为低电平,0为下降沿信号。

IT1:外部中断1触发方式。1为低电平,0为下降沿信号。

IE0:外部中断0请求标志位。IE0=1,有中断请求,0则没有。

IE1:外部中断1请求标志位。IE0=1,有中断请求,0则没有。

TR0:定时器/计数器0启动停止。1为启动,0为停止。

TR1:定时器/计数器1启动停止。1为启动,0为停止。

TF0:定时器/计数器标志位。1为溢出,0则没有溢出。

TF1:定时器/计数器标志位。1为溢出,0则没有溢出。

3、中断优先级寄存器IP

中断优先级寄存器不常用,简单介绍一下。按位寻址,地址位B8H。

PX0:外部中断0。

PX1:外部中断1。

PT0:定时器/计数器0中断。

PT1:定时器/计数器1中断。

PS:串口中断。

4、定时器方式寄存器TMOD

不按位寻址,地址位89H。

“”

GATE:定时操作开关控制位。GATE=1时,INT1或INT0引脚为高电平,同时TCON中的TR0或TR1控制位为1时,定时/计数器0或1才开始工作。GAYTE=0时,则只要将TR0或TR1控制位设为1,定时/计数器0或1就开始工作。

C/T:定时器或计数器功能的选择位。C/T=1为计数器,通过外部引脚T0或T1输入计数脉冲。C/T=1时为定时器,由内部系统时钟提供计时工作脉冲。

M1:模式选择高位。

M0:模式选择低位。

5、串口控制寄存器SCON

特殊功能寄存器,按位寻址,地址位98H。

“”

SM2:多机通信使能位。

REN:串口数据接收允许位 1允许,0禁止。该位有软件置位或清0。

TB8:在方式2和方式3中,这位发送的是第9位,就是校验位。

RB8:在方式2和方式3中,这位发送的是第9位,就是校验位。

TI:发送中断标志位 ,用完时要用软件清0。

RI:接受中断标志位,用完时要用软件清0。

本文转载自:电子产品世界
声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有,如涉及侵权,请联系小编邮箱:
cathy@eetrend.com 进行处理。

点击这里,获取更多关于应用和技术的有关信息
点击这里,获取更多工程师博客的有关信息

围观 9

如果想要实现利用中断复位,我所知道的有两种方式:看门狗中断和无中断服务程序的中断。

“”

一、利用看门狗中断实现复位

单片机中看门狗的作用在这里就不详细说了,看门狗中断的功能之一是,防止单片机程序陷入预料之外的死循环或者单片机程序跑飞。

如何实现看门狗中断复位呢?

首先我们要预估一段程序的最长运行时间,估算出来后,再加上一些时间余量,把这个时间作为看门狗的“喂狗”时间,在这个时间即将达到时,要及时“喂狗”(也就是把看门狗时间配置寄存器的值重新设置),这样看门狗会重新计时,程序继续正常运行。一旦程序跑飞或者进入一个预料之外的死循环,那么因为程序一直在这里运行,不会再运行到“喂狗”程序中,所以当看门狗寄存器的值达到预定值后,就产生了中断,这个中断让单片机复位。

“”

二、利用没有中断服务程序的中断复位

这个功能我在MSP430单片机上试验过,没有再别的单片机上实验,所以不确定别的单片机是否也会这样。

具体实现过程是,在程序中使能某个中断,例如端口中断,串口中断等,但是不写这个中断的服务程序,这样,当满足这个中断的条件出现时,由于找不到中断服务程序,单片机就会复位。

本文转载自:畅学电子网
声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有,如涉及侵权,请联系小编邮箱:cathy@eetrend.com 进行处理。

点击这里,获取更多关于应用和技术的有关信息

围观 17

一:综述

STM32 目前支持的中断共为 84 个(16 个内核+68 个外部), 16 级可编程中断优先级 的设置(仅使用中断优先级设置 8bit 中的高 4 位)和16个抢占优先级(因为抢占优先级最多可以有四位数)。

二:优先级判断

STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作‘亚优先级’或‘副优先级’,每个中断源都需要被指定这两种优先级。

具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。

当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。

三:优先级分组

既然每个中断源都需要被指定这两种优先级,就需要有相应的寄存器位记录每个中断的优先级;在Cortex-M3中定义了8个比特位用于设置中断源的优先级,这8个比特位在NVIC应用中断与复位控制寄丛器(AIRCR)的中断优先级分组域中,可以有8种分配方式,如下:

所有8位用于指定响应优先级

最高1位用于指定抢占式优先级,最低7位用于指定响应优先级

最高2位用于指定抢占式优先级,最低6位用于指定响应优先级

最高3位用于指定抢占式优先级,最低5位用于指定响应优先级

最高4位用于指定抢占式优先级,最低4位用于指定响应优先级

最高5位用于指定抢占式优先级,最低3位用于指定响应优先级

最高6位用于指定抢占式优先级,最低2位用于指定响应优先级

最高7位用于指定抢占式优先级,最低1位用于指定响应优先级

这就是优先级分组的概念。

Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位(AIRCR高四位),这4个寄存器位的分组方式如下:

第0组:所有4位用于指定响应优先级

第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级

第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级

第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级

第4组:所有4位用于指定抢占式优先级

可以通过调用STM32的固件库中的函数NVIC_PriorityGroupConfig()选择使用哪种优先级分组方式,这个函数的参数有下列5种:

NVIC_PriorityGroup_0 => 选择第0组

NVIC_PriorityGroup_1 => 选择第1组

NVIC_PriorityGroup_2 => 选择第2组

NVIC_PriorityGroup_3 => 选择第3组

NVIC_PriorityGroup_4 => 选择第4组

中断优先级分组是为了给抢占式优先级和响应优先级在中断优先级寄丛器的高四位分配各个优先级数字所占的位数。在一个程序中只能设定一次。

四:中断源的优先级

接下来就是指定中断源的优先级,中断源优先级是在中断优先级寄存器中设置的,只能设置及高四位,必须根据中断优先级分组中设置好的位数来在该寄存器中设置相应的数值。假如你选择中断优先级分组的第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级,那么抢占式优先级就有000-111共八种数据选择,也就是有八个中断嵌套,而响应优先级中有0和1两种,总共有8*2=16种优先级。

中断源优先级具体的设置了该中断源的优先级别

在一个程序中可以设定多个(最多16个)优先级,每个中断源只能设定的一个。

每写一个关于中断优先级的程序必须包含下列两个函数:

(1)void NVIC_PriorityGroupConfig(u32 NVIC_PriorityGroup)中断分组设置

(2)void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)中断优先级设置

具体设置:

可以通过调用STM32的固件库中的函数NVIC_PriorityGroupConfig()选择使用哪种优先级分组方式,这个函数的参数有下列5种:

NVIC_PriorityGroup_0 => 选择第0组

NVIC_PriorityGroup_1 => 选择第1组

NVIC_PriorityGroup_2 => 选择第2组

NVIC_PriorityGroup_3 => 选择第3组

NVIC_PriorityGroup_4 => 选择第4组

五:举例

接下来就是指定中断源的优先级,下面以一个简单的例子说明如何指定中断源的抢占式优先级和响应优先级:

// 选择使用优先级分组第1组

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

// 使能EXTI0中断

NVIC_InitStructure.NVIC_IRQChannel =EXTI0_IRQChannel;

NVIC_InitStructure.NVIC_IRQChannelPreempTIonPriority = 1; //指定抢占式优先级别1

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //指定响应优先级别0

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

// 使能EXTI9_5中断

NVIC_InitStructure.NVIC_IRQChannel =EXTI9_5_IRQChannel;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //指定抢占式优先级别0

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //指定响应优先级别1

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

六:注意事项

1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;

2)抢占式优先级别相同的中断源之间没有嵌套关系;

3)如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。

七:开关总中断

在STM32/Cortex-M3中是通过改变CPU的当前优先级来允许或禁止中断。

PRIMASK位:只允许NMI和hardfault异常,其他中断/异常都被屏蔽(当前CPU优先级=0)。

FAULTMASK位:只允许NMI,其他所有中断/异常都被屏蔽(当前CPU优先级=-1)。

在STM32固件库中(stm32f10x_nvic.c和stm32f10x_nvic.h)定义了四个函数操作PRIMASK位和FAULTMASK位,改变CPU的当前优先级,从而达到控制所有中断的目的。

下面两个函数等效于关闭总中断:

void NVIC_SETPRIMASK(void);

void NVIC_SETFAULTMASK(void);

下面两个函数等效于开放总中断:

void NVIC_RESETPRIMASK(void);

void NVIC_RESETFAULTMASK(void);

上面两组函数要成对使用,不能交叉使用。

例如:

第一种方法:

NVIC_SETPRIMASK(); //关闭总中断

NVIC_RESETPRIMASK(); //开放总中断

第二种方法:

NVIC_SETFAULTMASK(); //关闭总中断

NVIC_RESETFAULTMASK(); //开放总中断

常常使用

NVIC_SETPRIMASK(); // Disable Interrupts

NVIC_RESETPRIMASK(); // EnableInterrupts

补充 可以用

#define CLI() __set_PRIMASK(1)

#define SEI() __set_PRIMASK(0)

stm32优先级

1.优先级等级:

STM32用户能分配的优先级有16级,也就是用优先级寄存器NVIC->IP[x]的高四位来表示莫个中断的优先级。

2.优先级组:

在STM32中将一个中断的优先级分为:抢占优先级和子优先级。

在进行优先级判断的时候先是比较抢占优先级然后比较子优先级。

在固件库中用变量分别表示抢占优先级和子优先级:

NVIC_InitTypeDef.NVIC_IRQChannelPreemptionPriority;(抢占优先级)

NVIC_InitTypeDef.NVIC_IRQChannelSubPriority;(子优先级)

优先级组就是对抢占优先级和子优先级进行的分界:

例如设置优先级组为0x05,那么表示的是莫个中断的优先级从第5位开始为界限,高两位[6:7]是抢占优先

级。第两位是[5:4]表示的是子优先级。

举例说明:

//调用优先级组设置函数,设置优先级是0x05.

.....

NVIC_SetPriorityGrouping(5);

.....

//这里说明了一个优先级寄存器的(NVIC->IP[x])的7,6位表示的是抢占优先级。5,4表示的是优先级。

......

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

.......

//这里进行优先级的设置:通过上面的设置可以知道抢占优先级和子优先级的范围都是3~0;

//那么这样就设置好了一个中断的优先级

//====================================================

//

STM32 中断与嵌套NVIC 快速入门。

// netjob 2008-8-1

//====================================================

我也是靠看这本书才弄懂的:

Cortex-M3 权威指南

Joseph Yiu 著

宋岩 译

其实很简单。

//CM3 有 最多240个中断(通常外部中断写作IRQs),就是 软件上说的IRQ_CHANAELx(中断通道号x)

每个中断有自己的可编程的中断优先级【 有唯一对应的 中断优先级寄存器 】。

由于CM3支持 硬件中断嵌套,所以可以有 256 级的可编程优先级和 256级中断嵌套【书上称:抢占(preempt)优先级】

所以大家可以设:

IRQ CHANAEL 0 通道 = 2 中断优先级

WWDG 窗口定时器中断

IRQ CHANAEL 1 通道 = 0 中断优先级

PVD

联到EXTI的电源电压检测(PVD)中断

IRQ CHANAEL 3 通道 = 255 中断优先级

RTC 实时时钟(RTC)全局中断

IRQ CHANAEL 6 通道 = 10 中断优先级

EXTI0 EXTI线0中断.....

IRQ CHANAEL 239 通道 = (0

这个实在是太恐怖了! 是的,其实CM3 并没有这样做。

实在的芯片例如STM32等就只有设计来可用才64级可编程优先级和8级中断嵌套。

对 64级中断就是说:( INT0 到INT63)这个大家比较好理解,其它的64···239就不用了。

IRQ CHANAEL 0 。。。 IRQ CHANAEL 63

而8级中断嵌套这又是何解呢? 是这样的,上面说 一个 【中断】对应一个【中断优先级寄存器】,而这个寄存器是 8 位的。 当然就是256级了。而现在就用了 它其中的 BIT7,IT6,BIT5

三位来表示,而且是MSB对齐的。 用了3 个位来表达优先级(MSB 对齐的我们能够使用的8个优先级为:0x00(最高),0x20,0x40,0x60,0x80,0xA0,0xC0以及0xE0。)

这样我们在【中断优先级寄存器】就不能按理论的填0到255之间的数了,而只能填0x00(最高),0x20,0x40,0x60,0x80,0xA0,0xC0以及0xE0。)

所以大家可以设:

IRQ CHANAEL 0 通道 = 0x20 中断优先级

WWDG 窗口定时器中断

IRQ CHANAEL 1 通道 = 0x40 中断优先级

PVD

联到EXTI的电源电压检测(PVD)中断

IRQ CHANAEL 3 通道 = 0x20 中断优先级

RTC 实时时钟(RTC)全局中断

IRQ CHANAEL 6 通道 = 0xA0 中断优先级

EXTI0 EXTI线0中断

.....

IRQ CHANAEL 63 通道 =【0x00(最高),0x20,0x40,0x60,0x80,0xA0,0xC0

以及0xE0。)】

大家注意到了,上面通道0和通道3 的优先级都是0X20, 这怎么办?

//

如果优先级完全相同的多个异常同时悬起,则先响应异常编号最小的那一个。如IRQ#0会比IRQ #3先得到响应,而且文中还讲了【优先级分组】,这又是什么回事?其实我回头看来,这个【优先级分组】和【抢占优先级】【亚优先级】都毫无意义的。

如果当时用 256级即是把【中断优先级寄存器】的8位都全用上,就没这个必要了。还什么优先级分组呢!

就是因为厂家现在【偷工减料】,才搞出这个明堂来的。

是这样的,在应用程序中断及复位控制寄存器(AIRCR) 中的10:8位【3位】是表示【优先级分组】它作用主要是用于对【中断优先级寄存器】『我们现在中用了BIT7,BIT6,BIT5三位』的功能的说明。

有一个表,在《Cortex-M3 权威指南》的110页,例如我们把AIRCR的10:8位设为【5】,查表可得【抢占优先级】=【7:6】,【亚优先级】=【5:0】,对于【中断优先级寄存器】只用了BIT7,6,5,因此我们可以看作是【7:6】,【5】。那4-0 可以不管。

现在我们的 IRQ0=0X20, IRQ3=0X20, 也就是 【0 0 1 0】『bit7=0,bit6=0,bit5=1,bit4=0』因为大家(IRQ0/IRQ3)的【抢占优先级】=【7:6】都是0,说明它们的中断相应级别是一样的。再继续判断它们哪个更优先的责任就要看【5】,结果连【5】都是一样的!

那就按默认:

// 如果优先级完全相同的多个异常同时悬起,则先响应异常编号最小的那一个。如IRQ#0会比IRQ #3先得到响应,由于CM3没有进中断【关全局中断相应】这事,只要是中断通道打开了,就会存在通道间的嵌套,即是会发生【抢占】的情况了。

上面就简短的说明,如果要详细理解,可以看《Cortex-M3权威指南》。有任何理解不当,请各位多多指教!

补充注意:

“2)抢占式优先级别相同的中断源之间没有嵌套关系;”

所以大家可以设:

IRQ CHANAEL 0 通道 = 0x20 中断优先级 WWDG 窗口定时器中断

IRQ CHANAEL 1 通道 = 0x40 中断优先级 PVD

联到EXTI的电源电压检测(PVD)中断

IRQ CHANAEL 3 通道 = 0x20 中断优先级 RTC 实时时钟(RTC)全局中断

IRQ CHANAEL 6 通道 = 0xA0 中断优先级 EXTI0EXTI线0中断

这样 0 通道和3 通道就不会有嵌套情况,而是0 通道按默认比3 通道优先高些。而0 通道与1通道就会有嵌套情况。

芯片复位后,默认的优先级分组 是 0, 就是 【7:1】表示抢占式优先级,【0】表示亚优先级, 这样对于MSB对齐的 8个优先级为:0x00(最高),0x20,0x40,0x60,0x80,0xA0,0xC0以及0xE0。)

使用就很方便了,建议大家就用默认的默认的优先级分组是0,也就是复位后的值,哈哈!

例如下面的两个按键,都使用外中断方式,使用了PD.3,和PD.4两个引脚。这两个中断的优先级都是0X20,按默认的优先级分组,它们之间不会发生中断嵌套。

STM32_Nvic_Regs->Priority[9].all=0x20; // 中断的优先级是0X20

STM32_Nvic_Regs->Enable[0].bit.INT9=1; // 开INT9 中断IRQ9

STM32_Nvic_Regs->Priority[10].all=0x20; // 中断的优先级是0X20

STM32_Nvic_Regs->Enable[0].bit.INT10=1; // 开INT10 中断IRQ10

本文转载自:jesliebest的博客
转载地址:http://blog.csdn.net/u013538360/article/details/24740771
声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有,如涉及侵权,请联系小编进行处理。

围观 45

STM32中断和事件的区别!

事件是中断的触发源,开放了对应的中断屏蔽位,则事件可以触发相应的中断。

事件还是其它一些操作的触发源,比如DMA,还有TIM中影子寄存器的传递与更新;而中断是不能触发这些操作的,所以要把事件与中断区分开。当你只要产生中断而不想触发其它操作时,就可以用事件屏蔽寄存器实现。
在STM32中,中断与事件不是等价的,一个中断肯定对应一个事件,但一个事件不一定对应一个中断。

“”

这张图是一条外部中断线或外部事件线的示意图,图中信号线上划有一条斜线,旁边标志19字样的注释,表示这样的线路共有19套.图中的蓝色虚线箭头,标出了外部中断信号的传输路径,首先外部信号从编号1的芯片管脚进入,经过编号2的边沿检测电路,通过编号3的或门进入中断挂起请求寄存器,最后经过编号4的与门输出到NVIC中断检测电路,这个边沿检测电路受上升沿或下降沿选择寄存器控制,用户可以使用这两个寄存器控制需要哪一个边沿产生中断,因为选择上升沿或下降沿是分别受2个平行的寄存器控制,所以用户可以同时选择上升沿或下降沿,而如果只有一个寄存器控制,那么只能选择一个边沿了.

按下来是编号3的或门,这个或门的另一个输入是软件中断/事件寄存器,从这里可以看出,软件可以优先于外部信号请求一个中断或事件,即当软件中断/事件寄存器的对应位为"1"时,不管外部信号如何,编号3的或门都会输出有效信号.

一个中断或事件请求信号经过编号3的或门后,进入挂起请求寄存器,到此之前,中断和事件的信号传输通路都是一致的,也就是说,挂起请求寄存器中记录了外部信号的电平变化.

外部请求信号最后经过编号4的与门,向NVIC中断控制器发出一个中断请求,如果中断屏蔽寄存器的对应位为"0",则该请求信号不能传输到与门的另一端,实现了中断的屏蔽.

明白了外部中断的请求机制,就很容易理解事件的请求机制了.图中红色虚线箭头,标出了外部事件信号的传输路径,外部请求信号经过编号3的或门后,进入编号5的与门,这个与门的作用与编号4的与门类似,用于引入事件屏蔽寄存器的控制;最后脉冲发生器的一个跳变的信号转变为一个单脉冲,输出到芯片中的其它功能模块.从这张图上我们也可以知道,从外部激励信号来看,中断和事件的产生源都可以是一样的.之所以分成2个部分,由于中断是需要CPU参与的,需要软件的中断服务函数才能完成中断后产生的结果;但是事件,是靠脉冲发生器产生一个脉冲,进而由硬件自动完成这个事件产生的结果,当然相应的联动部件需要先设置好,比如引起DMA操作,AD转换等;

简单举例:外部I/O触发AD转换,来测量外部物品的重量;如果使用传统的中断通道,需要I/O触发产生外部中断,外部中断服务程序启动AD转换,AD转换完成中断服务程序提交最后结果;要是使用事件通道,I/O触发产生事件,然后联动触发AD转换,AD转换完成中断服务程序提交最后结果;相比之下,后者不要软件参与AD触发,并且响应速度也更块;要是使用事件触发DMA操作,就完全不用软件参与就可以完成某些联动任务了。

总结:

可以这样简单的认为,事件机制提供了一个完全有硬件自动完成的触发到产生结果的通道,不要软件的参与,降低了CPU的负荷,节省了中断资源,提高了响应速度(硬件总快于软件),是利用硬件来提升CPU芯片处理事件能力的一个有效方法;

本文转载自:张飞实战电子
转载地址:http://mp.weixin.qq.com/s/EADRk6laMz5bNMbPyz6oUA
声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有,如涉及侵权,请联系小编进行处理。

围观 45