×
单片机 > 单片机程序设计 > 详情

cc2530裸机编程系列笔记6--外中断程序

发布时间:2020-09-03 发布时间:
|

在做实验之前我们先来了解一下cc2530的51内核的外部中断的基本信息,同样我们去datasheet里面找找这些中断的说明文字:

         Interrupts
             The CPU has 18 interrupt sources. Each source has its own request flag located in a set of interrupt flag
             SFR registers. Each interrupt requested by the corresponding flag can be individually enabled or disabled.
             The definitions of the interrupt sources and the interrupt vectors are given in Table 2-5 .


就是说cc2530的51内核有18个中断源,每个中断源都有自己的中断标志SFR寄存器,每个中断源都可以开启或者关闭,具体的这18个中断源如下:

         

在上面我们可以看到这18个中断源的基本情况,以及他们被分开了三个中断控制小分队长寄存器IENX,以及对应关系


当然,这么多中断我不可能一一说明,所以这里我选择了一个最简单的,基本的io中断来做一个实验,来说明这些中断的初始化以及处理,其实讲中断主要是为了下面做休眠实验做准备。


好了,我现在不用上一节说的佳杰的板子了,直接用我们公司自己画的板子,因为我们做的板子就只有一块很小的板子,io口全是裸露出来的,我想怎么弄就怎么弄,为了方便我的按键也没有加上拉电阻,字节是从cpu的io口出来,然后接按键的一个脚,然后按键的另外一个脚接在了GND,就这么简单,当然,这肯定是不行的,你还得加该加的东西,我这里只是为了试验而已,并不是真正的产品。而且我不是硬件工程师,也不会这些东西。

    因为以前是学嵌入式linux的,还有就是大学的时候深受java编程的影响,一切都喜欢封装,来到了单片机这里,同样喜欢把不同的代码放在不同的代码实现文件中,不喜欢全部放在一个.c文件。我把led的操作和宏定义定义在了hal_led.h和hal_led.c中。


  1. hal_led.h  

  2.   

  3. #include 
    这里可以看到这个寄存器的0-7bit是设置p1.0-p1.7的中断使能的,P1IEN |= 0X01;就是使能p1.0的中断

    同样的办法找PICTL的解析和table,其实PICTL的解析就在上面:PICTL : P0, P1, and P2 edge configuration
    这个寄存器是设置p0,p1,p2的触发模式的,上他的table

    因为我们是P1.0所以我们看p1的,我么可以看到P1ICONL和P1ICONH这两个bit,第一个是设置p1.3-p1.0的,第二个是设置p1.7-p1.4的,那么PICTL |= 0X02;刚好设置的就是p1.0的

    EA是中断的总开关,就算我们一栋楼里的总闸一样,IEN2是中断的小分队长,就像我们出租屋里的自己那个房子的总闸一样,因为我们用到的是p1,我们通过上面的中断源的那个table可以找到p1的开关是IEN2,当然,如果你用别的io,必须改用别的寄存器,我们看看IEN2的table

    至于为什么是IEN2 |= 0x10;我就不说了,再说就废话了。到此初始化工作到此结束。

    下面就看看中断处理函数,因为我只是为了得到这个中断而已,所以没多按钮做太多处理,实际应用请自己加上


    #pragma vector = P1INT_VECTOR  

    1.  __interrupt void P1_ISR(void)  

    2.  {  

    3.     if(P1IFG>0)  

    4.     {  

    5.       if(P1IFG == 0x01)  

    6.       {  

    7.            hal_set_led_mode(LED_NUM_1,ledStatus);   

    8.            ledStatus = !ledStatus;  

    9.       }  

    10.       P1IFG = 0;  

    11.     }  

    12.     P1IF = 0;  

    13.  }  

    这没什么好说的,我这里的处理就是按下按键,然后取反LED灯而已。

    好了,上main函数,结束这篇笔记


    1. int ledStatus = 0;  

    2. void main(void)  

    3. {  

    4.     initxsta();  

    5.     hal_init_led();  

    6.     hal_init_key();  

    7.   

    8.     while(1);  

    9.       

    10. }  

    到此,对于p1_0这个io端口的中断我弄完了,也就结束了我的外部中断的实验。


    关键字:cc2530  裸机编程  外中断程序

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何升级STM32单片机的代码