ZigBee案例笔记 -- 外部中断
Posted GenCoder
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 引脚使能时都有中断产生
中断使能的步骤如下
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中断标志
以上是关于ZigBee案例笔记 -- 外部中断的主要内容,如果未能解决你的问题,请参考以下文章
ZigBee案例笔记 -- IAR for 8051工程创建
ZigBee案例笔记 -- IAR for 8051工程创建
ZigBee案例笔记 -- IAR for 8051工程创建