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

发布者:Xiaochen520最新更新时间:2019-09-04 来源: eefocus关键字:cc2530  裸机编程  外中断程序 手机看文章 扫描二维码
随时随地手机看文章

在做实验之前我们先来了解一下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 CC2530.h>  

  4.   

  5. #define LED_NUM_1   0x00  

  6. #define LED_NUM_2   0x01  

  7. #define LED_NUM_3   0x02  

  8. #define LED_NUM_4   0x03  

  9.   

  10. #define LED_MODE_ON     0x00  

  11. #define LED_MODE_OFF    0x01  

  12.   

  13. void hal_init_led(void);  

  14. void hal_set_led_mode(unsigned char led,unsigned char mode);  


  1. hal_led.c  

  2. #include "hal_led.h"  

  3.   

  4. #define LED1    P1_2  

  5. #define LED2    P1_3  

  6. #define LED3    P1_5  

  7. #define LED4    P1_6  

  8.   

  9. void hal_init_led(void)  

  10. {  

  11.     P1SEL &= ~0x6C; //01101100  

  12.     P1DIR |=  0x6C;  

  13.     LED1 = LED_MODE_OFF;  

  14.     LED2 = LED_MODE_OFF;  

  15.     LED3 = LED_MODE_OFF;  

  16.     LED4 = LED_MODE_OFF;  

  17. }  

  18. void hal_set_led_mode(unsigned char led,unsigned char mode)  

  19. {  

  20.   mode = !!mode;  

  21.   switch(led){  

  22.   case LED_NUM_1:  

  23.     LED1 = mode;  

  24.     break;  

  25.   case LED_NUM_2:  

  26.     LED2 = mode;  

  27.     break;  

  28.   case LED_NUM_3:  

  29.     LED3 = mode;  

  30.     break;  

  31.   case LED_NUM_4:  

  32.     LED4 = mode;  

  33.     break;  

  34.   default:  

  35.     break;  

  36.   }  

  37.   return;  

  38. }  

这部分代码在之前的IO实验中已经解析过,只是修改了LED的io而已,就根据datasheet修改就行了,就不解析了。

下面上按键部分代码,这部分代码就只有初始化和一个中断处理函数而已


void hal_init_key(void)  

  1. {  

  2.     P1SEL &= ~0x01;  

  3.     P1DIR |= 0X01;  

  4.          

  5.      

  6.     P1IEN |= 0X01;     //P10设置为中断方式  

  7.      PICTL |= 0X02;     //下降沿触发  

  8.      EA = 1;  

  9.     IEN2 |= 0x10;  

  10.     P1IFG  = 0;  

  11. }  

先来解析这个初始化代码先,其实思路很简单,初始化IO口为普通io并且设置io口模式为输入模式--->设置P1.0端口为中断模式并且是下降沿触发然后开中断

上面设置io的那部分就不解析了,因为和之前的设置是一样的,只是之前设置为输出,现在设置为输入而已,来看看中断设置这部分:

 老办法,我们先来datasheet找找P1IEN这个寄存器,可以找到这么一段:

The SFR registers used for interrupts are described later in this section. The registers are summarized as follows:
• P0IEN : P0 interrupt enables
• P1IEN : P1 interrupt enables
• P2IEN : P2 interrupt enables
• PICTL : P0, P1, and P2 edge configuration
• P0IFG : P0 interrupt flags
• P1IFG : P1 interrupt flags
• P2IFG : P2 interrupt flags
意思就是说pxIEN是设置中断源的使能的,同样我们找这个P1IEN的table看看

这里可以看到这个寄存器的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  裸机编程  外中断程序 引用地址:cc2530裸机编程系列笔记6--外中断程序

上一篇:51单片机系列知识14--1206LCD(2)
下一篇:cc2530裸机编程系列笔记5--中断

推荐阅读最新更新时间:2024-11-09 21:49

S3C2440裸机------NandFlash编程_时序及初始化
1.NandFlash初始化 Nandflash初始化主要包括时序图的设置和Nandflash控制器的使能,我们首先看一下S3C2440芯片手册里面的时序图。 上图中的HCLK我们已经设置成了100M。那么时钟周期是1/100M=10ns 然后下图是NandFlash芯片手册里面的时序图。 我们将S2C2440里面NandFlash控制器的时序图和NandFlash时序图结合起来看。 左图中的TACLS表示当我们的CLE/ALE发出之后,再过多长时间再发出WE信号,就是右图中的tcls-twp,而我们从右下图可以看到,tcls的最小值是12,twp的最小值也是12,就表明tcls-twp可以为零,也就表明CLE
[单片机]
S3C2440<font color='red'>裸机</font>------NandFlash<font color='red'>编程</font>_时序及初始化
s3c2440裸机-nandflash编程(四. nand读写擦实现)
1.顺寻访问(Page Read) 下图的表格,来说明NAND FLASH内部结构,前面2K(02047)表示页数据,后边64字节(20482111)表示oob。 CPU想读取,第2048个数据,它是哪以一个? 是Page1的第0个字节。CPU使用某个地址访问数据的时候,是在页数据空间来寻址的。 下图为读NAND FLASH的read时序操作: 1.首先需要锁存00命令,nCE、CLE、nWE有效,0x00命令被锁存; 2.此时CLE无效,ALE开始有效,地址被锁存(从NAND FLASH的地址周期中可以看出来,先发出2个周期的col列地址,再发出3个周期的Row行地址); 3.锁存0x30命令; 4.然后会有一个busy时
[单片机]
s3c2440<font color='red'>裸机</font>-nandflash<font color='red'>编程</font>(四. nand读写擦实现)
TQ210_裸机编程(三)——串口通信
由于我们所使用的TQ210板的L0部分已经写死 ,而且L0部分有时钟的初始化, 所以我们现在做串口通信 ,就不用再初始化时钟了。我们将会直接把程序放在SRAM里运行。 S5PV210 包含 4 个异步收发器(UART),提供 4 个独立的异步串行输入/输出(I/O)端口。所有端口可工作于中断模式或 DMA 模式。提供高达 3Mbps的位速率。每个 UART 包含 2 个 FIFO 用于接收和发送数据。具有可编程的波特率、红外收发、1 位或 2 位停止位、5~8 位数据位、校验。 数据发送:要发送的数据帧是可编程的。它包含 1 位起始位,5~8 位数据位,1 个可选校验位,1或2位停止位,这些都通过ULCONn寄存器来设置
[单片机]
TQ210_<font color='red'>裸机</font><font color='red'>编程</font>(三)——串口通信
城市停车诱导系统中区域性Zigbee网络的设计
停车诱导系统是一种以多级信息发布为载体,可实时地提供停车场的位置、车位数、车位状态等信息,指引驾驶员有效停车的信息系统。根据覆盖范围的大小,停车诱导系统一般又可分为城市级和停车场级两种。为节约城市级停车诱导系统的建设及运营成本,本文提出一种无需建立管理控制中心的系统架构。在此基础上,本文重点研究所提架构中的重要组成部分——区域性Zigbee网络的硬件及软件设计。 1 研究现状 停车诱导系统是一种用于缓解城市中停车难现象的智能交通系统。国外最早出现于1971年的德国亚琛市,近40年的发展效果显著。我国的建设兴起于2001年,近10多年的发展也取得了不错的效果。经分析后发现,国内外的各种系统虽各有特点,但它们的系统结构和工作原理基
[单片机]
城市停车诱导系统中区域性Zigbee网络的设计
s3c2440裸机-LCD编程(五、LCD上实现画点、线、圆)
1.画点 无论是何种图形,都是基于点来构成的,因此我们需要先实现画点,其他的都是上层的一些数据处理了,像各种图形、甚至色彩鲜艳的图片无非都是一些由点构造出的数据而已。 我们在在farmebuffer.c实现画点,在geomentry.c实现画线、画圆等几何图形,font.c实现画字。 那么一个像素点要显示到lcd上,我们要知道它的位置坐标,然后还要知道它的颜色值,假设该像素点的坐标为(x,y),那么该像素的地址为: (x,y)= fb_base + (xres*(bpp/8))*y +x*bpp/8; 那么所以在画点前需要先获取lcd参数:fb_base、xres、yres、bpp; static unsigned
[单片机]
S3C2440裸机------Nor Flash编程_识别
1.编写菜单程序 首先我们编写一个测试菜单程序,用来获取norFlash信息以及对NorFlash进行读写操作,代码如下: void nor_flash_test(void) { char c; while (1) { /* 打印菜单, 供我们选择测试内容 */ printf( Scan nor flashnr ); printf( Erase nor flashnr ); printf( Write nor flashnr ); printf( Read nor flashnr ); printf( quitnr ); printf( Enter selection:
[单片机]
S3C2440<font color='red'>裸机</font>------Nor Flash<font color='red'>编程</font>_识别
cc2530裸机编程系列笔记5--中断
中断是单片机实时地处理内部或外部事件的一种内部机制。当某种内部或外部事件发生时,单片机的中断系统将迫使CPU 暂停正在执行的程序,转而去进行中断事件的处理,中断处理完毕后,又返回被中断的程序处,继续执行下去。 中断处理过程: (1)保护被中断进程现场。为了在中断处理结束后能够使进程准确地返回到中断点,系统必须保存当前处理机程序状态和程序计数器PC 等的值。 (2)分析中断原因,转去执行相应的中断处理程序。在多个中断请求同时发生时,处理优先级最高的中断源发出的中断请求。 (3)恢复被中断进程的现场,CPU 继续执行原来被中断的进程。 【本实验的设计思路】 开发板上已把S1 按键与P0.1 相连,本实验
[单片机]
<font color='red'>cc2530</font><font color='red'>裸机</font><font color='red'>编程</font>系列笔记5--<font color='red'>中断</font>
s3c2440裸机-I2c编程-2.i2c控制器
1.I2c主控与从设备关系 对于写操作,主控作为transmitter,从设备作为receiver 对于读操作,主控作为receiver, 从设备作为transmitter 2.I2c控制器 2.1总框图 Pclk = 50Mhz, 经过prescaler分频,可以得到SCL。 IICSTAT:发出S(start)信号或者P(stop)信号。 Data Bus可以把数据写入IICDS寄存器,然后会自动产生SCL,并且会将8位数据从SDA同步给slave dev, 在数据发送出去后,在第9个SCL时钟,会受到slave dev的ack应答,可以通过查询IICSTAT来判断是否有ACK回应。 当slave dev回应ACK后,
[单片机]
s3c2440<font color='red'>裸机</font>-I2c<font color='red'>编程</font>-2.i2c控制器
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved