ZigBee案例笔记 -- 外部中断

1.中断概述

CC2530有18个中断源,每个中断源都有它自己的位于一系列 SFR 寄存器中的中断请求标志。相应标志位请求的每个中断可以分别使能或禁用,中断分别组合为不同的、可以选择的优先级别,中断源的定义和中断向量如表所示
在这里插入图片描述

2.中断屏蔽

每个中断请求可以通过设置中断使能 SFR 寄存器的中断使能位 IEN0,IEN1 或者 IEN2 使能或禁止,某些外部设备有若干事件,可以产生与外设相关的中断请求。这些中断请求可以作用在端口 0、端口 1、端口 2、定时器 1、定时器 2、定时器 3、定时器 4 和无线电上。对于每个内部中断源对应的 SFR 寄存器,这些外部设备都有中断屏蔽位
为了使能任一中断功能,应当采取下列步骤:
1、清除中断标志
2、如果有,则设置 SFR 寄存器中对应的各中断使能位为 1
3、设置寄存器 IEN0、IEN1 和 IEN2 中对应的中断使能位为 1
4、设置 IEN0 中的 EA 位为 1 使能全局中断
5、在该中断对应的向量地址上,运行该中断的服务程序

寄存器 IEN0,IEN1 和 IEN2 如图所示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在上面3个寄存器中,IEN0.EA是对总中断进行使能控制,其他的是对所有中断源进行中断使能控制(包括端口0、端口1和端口2中断的使能即其他外设中断的使能)
I/O中断可以设置在外部信号的上升或下降沿触发。P0、P1 或 P2 端口都有中断使能位,对位于 IENl-2 寄存器内的端口所有的位都是公共的,如下:

  • IENI.P0 IE:P0 中断使能
  • IEN2.PI IE:P1 中断使能
  • IEN2.P2IE:P2 中断使能

除了这些公共中断使能之外,每个端口的位都有位于 SFR 寄存器 P0IEN、P1IEN 和 P2IEN 的单独的中断使能。即使配置为外设 I/O 或通用输出的 I/O 引脚使能时都有中断产生
在这里插入图片描述
中断使能的步骤如下

Created with Raphaël 2.3.0 总中断使能(EA) 端口中断使能(PxIE) 位中断使能(PxIEN) 触发沿设置(上升沿/下降沿)

1.使能IEN0中EA位为1,开总中断
2.设置寄存器IEN0、IEN1和IEN2中相应中断使能位为1
3.设置P0、P1、P2中指定引脚中断使能位为1
4.最后在寄存器PICTL中设置中断是上升沿或是下降沿触发

3.中断处理

当中断发生时,CPU 就指向中断向量地址。一旦中断服务开始,就只能够被更高优先级的中断打断。中断服务程序由中断指令 RETI(从中断指令返回)终止,当 RETI 执行时,CPU 将返回到中断发生时的下一条指令。当中断发生时,不管该中断使能或禁止,CPU 都会在中断标志寄存器中设置中断标志位。如果当设置中断标志时中断使能,那么在下一个指令周期,由硬件强行产生一个 LCALL 到对应的向量地址,运行中断服务程序。
中断的响应需要不同的时间,取决于该中断发生时 CPU 的状态。当 CPU 正在运行的中断服务程序,其优先级大于或等于新的中断时,新的中断暂不运行,直至新的中断的优先级高于正在运行的中断服务程序。在其他情况下,中断响应的时间取决于当前的指令,最快响应一个中断的时间是 7 个机器指令周期,其中 1 个机器指令周期用于探测中断,其余 6 个用来执行 LCALL

注意
如果一个中断被禁用且中断标志被轮询, 8051 汇编指令 JBC 不能用于轮询中断标志,当设置时要把它清除。如果使用了,中断标志可能立即重新生效。

TCON、S0CON、S1CON、IRCON、IRCON2是CC2530的5个中断标志寄存器
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
当中断条件发生在 I/O 引脚之一上面,P0-P2 中断标志寄存器 P0IFG、P1IFG 或 P2IFG 中相应的中断状态标志将设置为 1。不管引脚是否设置了它的中断使能位,中断状态标志都被设置。当中断已经执行,中断状态标志被清除,该标志写入 0。这个标志必须在清除 CPU 端口中断标志(PxIF)之前被清除

  • P0IFG: P0 中断标志
  • P1IFG: P1 中断标志
  • P2IFG: P2 中断标志

在这里插入图片描述I/O中断方式由寄存器PICTL控制
在这里插入图片描述

4.按键中断控制LED

实现按键key1控制LED1和LED2交替闪烁

#include <ioCC2530.h>

#define LED1 P1_0
#define LED2 P1_1

void main()
{
	P0SEL &= ~0x02;
	P0INP |= 0x02;					// 上拉
	P0IEN |= 0x02;					// P0_1 设置为中断方式
	PICTL |= 0x01;					// 下降沿触发

	EA = 1;							// 开总中断
	IEN1 |= 0x20;					// P0设置为中断模式
	P0IFG |= 0x00;					// 初始化中断标志位

	P1SEL &= ~0x03;
	P1DIR |= 0x03;

	LED1 = 1;
	LED2 = 0;

	while(1);
}

#pragma vector = P0INT_VECTOR	// 端口P0的中断处理函数
__interrupt void P0_ISR(void)
{
	if(P0IFG > 0)
	{
		LED1 = !LED1;
		LED2 = !LED2;

		P0IFG = 0;			// 清除P0_0中断标志
		P0IF = 0;			// 清除P0中断标志
	}
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GenCoder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值