声明:文章内容皆为学习过程所理解,多主观,仅供自己参考,多有疏漏,或有不当之处,多多包涵。
这一章学习CC2530外部中断,以按键中断控制LED灯亮灭为例
首先,中断响应的过程:CPU在运行某个程序,当他检测到中断源,他就会放下手头的工作去执行中断源带来的程序。 很容易理解。那先现在需要知道中断源怎么来?
CC2530有18个中断源,这里我学习IO口中断控制。以:S1产生外部中断,S1按下LED点亮。这里我们学习第13个P0口的中断源配置。
CPU响应中断
一.IO口中断触发信号源有上升沿和下降沿两种触发模式:
从图中可以看到,当按键S1按下会产生一个从高电平到低电平的下降沿的信号,我们就以这个信号让CPU知道中断来了。描述IO口外部中断触发模式的寄存器叫:PICTL(8bit)
这里以P0_0口触发中断为例。所以将P0口的中断触发模式设为下降沿触发,通过查表得出将PICTL的第0位置1:
PICTL |=0x01;
## 2.此外还需要让P0口能够产生中断,也就是让P0口中断使能。通过配置寄存器IEN1来实现。
查表可以了解到IEN1的第五位是描述P0口中断使能。所以:
IEN1 |=0x20;
3.P0端口的中断使能已经打开了,但是我们是P0_0口产生的信号,所以还需要精确到P0_0引脚。打开P0_0这个引脚的中断使能,它是由寄存器P0IEN来描述的。
根据表可得,是的P0_0口中断使能为将P0IEN第0位置1。所以:
P0IEN |=0X01;
至此中断触发信号源已经配置好了。接下来是两个任务,打开总中断;清除中断标志。
4.总中断通过寄存器IEN0来描述
:
所以打开总中断:
IEN0 |=0X80;
5.清除中断标志位
为什么清除?我的理解是:把开关拨回去。
这里有两个寄存器控制中断标志:IRCON、P0IFG
这里将第5位置0,即代表清除P0口中断标志。
图表中可以看到两个寄存器的作用。我们要将P0口中断标志清零,还要将P0_0口中断标志清零。所以:
IRCON &=~0X20;
P0IFG &=~0X01;
到此中断初始化已经配置完成。
代码附上:
void KEY_Init()
{
PICTL |=0x01;
IEN1 |=0x20;
P0IEN |=0X01
IEN0 |=0X80;
IRCON &=~0X20;
P0IFG &=~0X01;
}
中断入口地址:
#pragma vertor P0INT_VECTOR
__interrupt void P0_ISR()
{
//先清除中断标志位
IRCON &=~0X20;
P0IFG &=~0X01;
//中断程序。。。
}
题目:S1产生外部中断,S1按下LED点亮。
完整代码:
#include <ioCC2530.h>
#define RLED P1_0
#define S1 P0_0
void DelayMS(unsigned int time)
{
unsigned int i;
unsigned char j;
for(i=0;i<time;i++)
{
for(j=0;j<240;j++)
{
asm("NOP");
asm("NOP");
asm("NOP");
}
}
}
void LED_Init()
{
P1SEL &=~0X01;//(1<<0)
P1DIR |=0X01;
RLED=0;
}
//初始化外部中断
void InitKey()
{
P0SEL &=~0X01;
P0DIR &=~0x01;
P0INP &=~0X01;
P2INP &=~0X20;
PICTL |=0x01;//P0_0下降沿触发
IEN1 |=0x20;//P0口中断使能
P0IEN |=0X01//P0_0口中断引脚使能
IEN0 |=0X80;//打开总中断
IRCON &=~0X20;//清除P0口中断标志位
P0IFG &=~0X01;//清除P0_0口中断标志位
}
void main()
{
LED_Init();
InitKey();
while(1);//等待外部中断
}
//中断处理函数
#pragma vector = P0INT_VECTOR//头文件
__interrupt void P0_ISR(void)
{
IRCON &=~0X20;//清除P0口中断标志位
P0IFG &=~0X01;//清除P0_0口中断标志位
RLED=1;
DelayMS(100);
}