CC2530学习笔记:第二章:CC2530按键中断控制

声明:文章内容皆为学习过程所理解,多主观,仅供自己参考,多有疏漏,或有不当之处,多多包涵。

这一章学习CC2530外部中断,以按键中断控制LED灯亮灭为例

首先,中断响应的过程:CPU在运行某个程序,当他检测到中断源,他就会放下手头的工作去执行中断源带来的程序。 很容易理解。那先现在需要知道中断源怎么来?

CC2530有18个中断源,这里我学习IO口中断控制。以:S1产生外部中断,S1按下LED点亮。这里我们学习第13个P0口的中断源配置。
CC2530学习笔记:第二章:CC2530按键中断控制_第1张图片
CPU响应中断

中断触发信号源
中断源
CPU

一.IO口中断触发信号源有上升沿和下降沿两种触发模式:

CC2530学习笔记:第二章:CC2530按键中断控制_第2张图片
从图中可以看到,当按键S1按下会产生一个从高电平到低电平的下降沿的信号,我们就以这个信号让CPU知道中断来了。描述IO口外部中断触发模式的寄存器叫:PICTL(8bit)
CC2530学习笔记:第二章:CC2530按键中断控制_第3张图片
这里以P0_0口触发中断为例。所以将P0口的中断触发模式设为下降沿触发,通过查表得出将PICTL的第0位置1:

PICTL |=0x01;

## 2.此外还需要让P0口能够产生中断,也就是让P0口中断使能。通过配置寄存器IEN1来实现

CC2530学习笔记:第二章:CC2530按键中断控制_第4张图片
查表可以了解到IEN1的第五位是描述P0口中断使能。所以:

IEN1     |=0x20;

3.P0端口的中断使能已经打开了,但是我们是P0_0口产生的信号,所以还需要精确到P0_0引脚。打开P0_0这个引脚的中断使能,它是由寄存器P0IEN来描述的。

CC2530学习笔记:第二章:CC2530按键中断控制_第5张图片
根据表可得,是的P0_0口中断使能为将P0IEN第0位置1。所以:

 P0IEN |=0X01;

至此中断触发信号源已经配置好了。接下来是两个任务,打开总中断;清除中断标志。

4.总中断通过寄存器IEN0来描述


CC2530学习笔记:第二章:CC2530按键中断控制_第6张图片所以打开总中断:

IEN0 |=0X80;

5.清除中断标志位

清除中断标志位

中断标志
引脚中断标志位
端口中断标志位
清除

为什么清除?我的理解是:把开关拨回去。

这里有两个寄存器控制中断标志:IRCON、P0IFG
CC2530学习笔记:第二章:CC2530按键中断控制_第7张图片
这里将第5位置0,即代表清除P0口中断标志。

CC2530学习笔记:第二章:CC2530按键中断控制_第8张图片
图表中可以看到两个寄存器的作用。我们要将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 
#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);
}

你可能感兴趣的:(CC2530芯片)