CC2530(zigbee)入门开发: 外部中断配置

举报
DS小龙哥 发表于 2022/02/28 09:24:41 2022/02/28
【摘要】 中断在单片机里非常常用,专门来处理紧急事件。比如: 串口接收中断可以实时知道有数据到达,定时器超时中断可以实时知道时间到达,外部中断可以实时知道外部设备产生了事件需要立即处理。

第一章 外部中断与按键硬件原理图分析

中断在单片机里非常常用,专门来处理紧急事件。比如: 串口接收中断可以实时知道有数据到达,定时器超时中断可以实时知道时间到达,外部中断可以实时知道外部设备产生了事件需要立即处理。

CC2530一个有18个中断源,每个中断源都由各自的一系列特殊功能寄存器来进行控制。可以配置相关特殊功能寄存器,设置18个中断源的优先级以及使能中断申请响应。

CC2530的P0、P1和P2端口中的每个引脚都具有外部中断输入功能,要使某些引脚具有外部中断功能,需要对IENx寄存器、PxIEN寄存器和PICTL寄存器进行适当的设置。

除了各个中断源都有自己的中断使能开关之外,中断系统还有一个总开关,可以同"EA = 1;"来打开总中断。

P0、P1和P2端口分别使用P0IF、P1IF和P2IF作为中断标志位,任何一个端口组上的引脚产生外部中断时,都会将对应端口组的中断标志自动置位。注意,外部中断标志必须在中断服务函数中手工清除,否则CPU会反复进入中断。 端口状态标志寄存器P0IFG、P1IGF和P2IFG,分别对应3个端口中各引脚的中断触发状态,当某引脚发生外部中断触发时,对应的标志位会自动置位,这个标志同样需要手工清除。

 中断服务函数与一般自定义函数不同,有特定的书写格式:
<1> 在每一个中断服务函数之前,都要加上一句起始语句:
        #pragma vector = <中断向量>
        <中断向量>表示接下来要写的中断服务函数是为那个中断源服务的,该 语句有两种写法:
        #pragma  vector = 0x7B    或者    #pragma  vector = P1INT_VECTOR
        前者是中断向量的入口地址,后者是头文件“ioCC2530.h”中的宏定义。
<2> _ _interrupt关键字表示该函数是一个中断服务函数,<函数名称>可以 自定义,函数体不能带有参数,也不能有返回值。

一般在单片机里学习外部中断时,都采用独立按键配置学习,方便演示效果;

下面就介绍按键的外部中断配置流程,并编写示例代码。
image.png

第二章 配置按键中断步骤

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

第三章 按键中断代码配置示例


#include <ioCC2530.h>

//定义LED灯的端口
#define LED1 P1_2
#define LED2 P1_3

//定义KEY按键的端口
#define KEY1 P1_0       //定义按键为P1_0口控制
#define KEY2 P1_1       //定义按键为P1_1口控制

/*
函数功能:LED灯IO口初始化
硬件连接:LED1-->P1_2 , LED2-->P1_3
*/
void LED_Init(void)
{
    P1DIR |=0x3<<2;  //配置P1_2、P1_3为输出模式
    LED1 = 1;
    LED2 = 1;
}

/*
函数功能:初始化按键为中断模式
硬件连接:KEY1-->P1_0  KEY2-->P1_1  
*/
void KEY_InterruptInit(void)
{
    P1DIR&=~(0x3<<0); //配置P1_0、P1_1为输入模式
    P1INP|= 0x3<<0;   //上拉
    P1IEN|= 0x3<<0;   //中断使能
    PICTL|= 0x1<<1;   //下降沿触发(P1口所有端口都共用一个配置)
    IEN2 |= 0x1<<4;   //端口P1中断使能
    P1IFG&= ~(0x3<<0);//清除中断标志位
    EA = 1;           //使能总中断
}


void delay10ms(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=193;c>0;c--)
        for(b=118;b>0;b--)
            for(a=2;a>0;a--);
}

/*
函数功能:P1端口中断处理函数
*/
#pragma vector = P1INT_VECTOR   //声明P1口中断服务函数的位置
 __interrupt void P1_Interrupt(void)  //中断服务函数的名字的可以随意命名
{ 
        if(P1IFG&1<<0)         //判断按键1中断
        {
          delay10ms();  
          if(!KEY1)
          {
             LED1 = !LED1;   
          }
           P1IFG&=~(1<<0);     //清中断状态
        }
        
        if(P1IFG&1<<1)         //判断按键2中断
        {
          delay10ms();  
          if(!KEY2)
          {
             LED2 = !LED2;   
          }
          P1IFG&=~(1<<1);     //清中断状态
        } 
        P1IF = 0;             //清P1口中断标志
}


/*主函数*/
void main(void)
{
    LED_Init();//初始化LED灯控制IO口
    KEY_InterruptInit();//按键初始化
    while(1)          
    {  
            
    }
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。