智能创客,中国最大的极客空间,智能平台,免费教学,视频教程,手把手教你创造儿时梦想!

标题: Zigbee之旅(三):几个重要的CC2430基础实验——外部中断 [打印本页]

作者: znck007    时间: 2014-2-9 10:21
标题: Zigbee之旅(三):几个重要的CC2430基础实验——外部中断
一、承上启下

  上一讲,我们通过一个最简单的LED闪烁小实验,熟悉了IAR开发CC2430程序的基本过程。刀好歹磨过了(虽然我这块磨刀石不咋地),现在就开始屠虫了:)。接下来,我们一起来学习几个CC2430的基础实验。每个小实验,分“实验简介”、“程序流程图”,“实验源码及剖析”三个部分阐述。

  本篇讲解外部中断。

二、外部中断(1)实验简介

  中断是单片机实时地处理内部或外部事件的一种内部机制。当某种内部或外部事件发生时,单片机的中断系统将迫使CPU暂停正在执行的程序,转而去进行中断事件的处理,中断处理完毕后,又返回被中断的程序处,继续执行下去。

  中断分外部中断和内部中断,CC2430共包含18个中断源(具体中断描述及中断向量的定义,可参考《CC2430中文手册》)。

  现在我们来看一下本开发板的电路图:

  开发板上已把S1按键与P0.1相连,本实验想要达到的效果就是,通过按键S1触发P0.1的中断,进而在中断服务子程序中控制LED1的亮/灭。

(2)实验原理及流程图

  实验流程图如下:



(3)实验源码//头文件
#include

//延时子函数
#define led1 P1_0
#define led2 P1_1
#define led3 P1_2
#define led4 P1_3

void Delay(unsigned n)   
{
  unsigned tt;
  for(tt = 0;tt<n;tt++);
  for(tt = 0;tt<n;tt++);
  for(tt = 0;tt<n;tt++);
  for(tt = 0;tt<n;tt++);
  for(tt = 0;tt<n;tt++);
}

//32M晶振初始化
void xtal_init(void)
{
  SLEEP &= ~0x04;             //都上电
  while(!(SLEEP & 0x40));     //晶体振荡器开启且稳定
  CLKCON &= ~0x47;           //选择32MHz 晶体振荡器
  SLEEP |= 0x04;
}

//LED灯初始化
void led_init(void)
{
  P1SEL  = 0x00;          //P1为普通 I/O 口
  P1DIR |= 0x0F;          //P1.0 P1.1 P1.2 P1.3 输出
  
  led1 = 0;
  led2 = 0;
  led3 = 0;
  led4 = 0;
}

//io及外部中断初始化
void io_init(void)
{
    P0INP &= ~0X02;   //P0.1有上拉、下拉

    EA = 1;           //总中断使能
   
    P0IE = 1;   //P0中断使能
   
    PICTL |=  0X09;   //P0.1口中断使能,下降沿触发
   
    P0IFG &= ~0x02;   //P0.1中断标志清0
};

//主函数
void main(void)   
{
  xtal_init();
  led_init();  
  io_init();

  while(1);    //等待中断
}

//中断服务子程序
#pragma vector = P0INT_VECTOR
__interrupt void P0_ISR(void)
{
  EA = 0;                         //关中断  

  Delay(10000);  
  Delay(10000);
  Delay(10000);
  Delay(10000);
  Delay(10000);

  if((P0IFG & 0x02 ) >0 )         //按键中断
  {
    P0IFG &= ~0x02;               //P0.1中断标志清0
    led1 = !led1;
  }
  P0IF = 0;                       //P0中断标志清0

  EA = 1;                         //开中断
}

  首先初始化统时钟:选用32MHz晶体振荡器。

  然后初始化LED:设置P1为通用I/O口,设置 P1.0 ~ P1.3 方向为输出,然后关闭4个LED灯。

  再来配置外部中断的相关SFR寄存器,开启各级中断使能,涉及3个SFR:EAIEN1PICTL(各SFR详细介绍请查阅《CC2430中文手册》):

    EA —— 总中断使能;

    IEN1.5 —— P0中断使能;

    PICTL.3 —— P0.1口中断使能;

    PICTL.0 —— 设置P0.1口输入下降沿引起中断触发。

  然后在主函数中使用 while(1) 等待中断即可。


CC2430 小贴士
(1)位赋值语法小结
  很多时候,我们需要对单字节的SFR中的某一位赋值(0或1),以精确控制硬件设备。
  有的SFR支持位寻址,比如说TCON、P0等,此时,对位的赋值非常简单,只需查询 ioCC2430.h 头文件中 SFR Bit Access 部分的位定义即可:
  P0_0 = 0; //对P0第一位赋值0
  P0_0 = 1; //对P0第一位赋值1  

  但有的SFR并不支持位寻址,就如本实验中的 PICTL,此时想要对其中的某一位赋值,语法如下:
  PICTL &= ~0x01;   //对第1位赋值0
  PICTL |= 0x01;     //对第1位赋值1

  大家可以记住 &= ~|= 这两个常用的位赋值语法。

(2)中断使能小结
  在程序中涉及到某中断时,必须在触发中断前使能此中断。
  C51的中断使能系统,其层次结构非常明显:
  中断老大:EA 是老大,负责总的中断使能:
  EA = 1;

  各中断分队队长:接下来是针对每一个功能部件(如P0、定时器1等)的使能控制,此类SFR一般可位寻址,命名中一般含有 IE(Interrupt Enable):
  P0IE = 1;

  各中断队员:分队但由于每个功能部件内部也含有多个中断,所以最后一级就是针对这每一个中断的使能控制,此类SFR一般不可位寻址,命名中一般含有IE(Interrupt Enable)或 IM(Interrupt Mask):
  PICTL |=0x01;

  不需死记硬背中断SFR,只要了解其层次结构,然后用时查询手册或头文件即可。

(3)中断程序的编写
  在一个程序中使用中断,一般包括、两个部分:中断服务子程序的编写、中断使能的开启。中断使能已在上面介绍过,下面简单介绍一下中断服务子程序的编写:
  首先指定中断向量,可以在 ioCC2430.h 头文件中的 Interrupt Vectors 部分查询,语法如下:
  #pragma vector = 中断向量

  然后紧跟着编写中断处理程序,结构如下:
  __interrupt void 函数名(void)
  {
    //开中断
    //中断处理
    //中断标志清0
    //关中断
  }



三、结语

  本篇介绍了基于CC2430的简单的外部中断的实现方法,有了中断的基础之后,接下来我们介绍另外一个非常重要的模块——定时器。CC2430共有4个定时器,可分三类:定时器1、定时器2、定时器3/4(3与4的用法基本一样)。


作者: jo万劫仙界m    时间: 2014-7-27 02:49
提示: 该帖被管理员或版主屏蔽
作者: 胜恩家    时间: 2014-8-15 12:58
提示: 该帖被管理员或版主屏蔽
作者: ovlm0506    时间: 2014-8-28 10:02
提示: 该帖被管理员或版主屏蔽
作者: dcri78    时间: 2015-1-29 03:30
真正围观中...-_-












成人用品 充气娃娃
作者: m35015106    时间: 2015-4-21 23:27
很不错的啊











交友:我是个小女生,21岁,独生子女,还没谈过恋爱,长相较好,反正带出去不会给你丢脸,身高165cm,体重50kg,现在是一家公司的文员。希望找个比我大几岁的男生,不需要你有非常好的条件,但一定要有上进心,会体贴女生,不花心。因为我是第一次恋爱,所以希望找的就是那种能结婚的。如果你是我说的那个他,那就加我微信吧:pndrwx
作者: 北京生活网a    时间: 2015-6-26 23:34
很好,谢谢你啊,辛苦了~~













淘客机器人、淘客返利机器人、淘宝客机器人 联系客服QQ:1785400000

作者: qvsst    时间: 2015-8-19 00:38
提示: 作者被禁止或删除 内容自动屏蔽
作者: agkkl    时间: 2015-8-31 22:37
提示: 作者被禁止或删除 内容自动屏蔽
作者: kycup    时间: 2015-9-29 05:41
提示: 作者被禁止或删除 内容自动屏蔽
作者: tswtj    时间: 2015-11-8 11:34
提示: 作者被禁止或删除 内容自动屏蔽
作者: 飞珍非仓    时间: 2016-3-12 19:43
谢谢了饿~~~~~~~
作者: iwdlw    时间: 2016-4-4 00:26
〓金牌-投票███扣扣:119209911 ███微信:13911679882(手机)如有网上投票刷票需求就到金牌微信投票公司,将提供专业服务。
随着网络的深入很多商家或者节目都会通过网络的方式进行投票,通过网上投票也是对选手的一种综合评分的评定方式之一,但在网上投票也会有一些限制,有的会选择先关注在投票的模式,有的是对投票的次数有一定的限制,总之,都是给大家一个公平的竞争机会,也是一个供大家交流的一个平台,而微信投票的主要方式还是依靠庞大的专业从事网络投票的人员组成,而微信投票公司的工作人员遍布全国各地实现真实的IP投票流程,投票结果真实,伴随着商城的诞生与兴起,消费者可通过微信平台、微信投票平台、微信公众号等,就可以实现网上查询、购物、支付等线上与线下的一体化服务。
作者: zmlxh168    时间: 2016-4-21 12:32
谢了.学习中,先顶
作者: mxatp    时间: 2016-5-3 18:27
谢谢楼主~~~~~~~
作者: 也黑不过人心    时间: 2016-5-20 07:20
绝对喜欢,好帖子不多哦,顶一下
作者: fnfbp    时间: 2016-6-10 01:02
哈 谢谢啦 !谢谢分享













作者: dpzkm    时间: 2016-6-11 04:30
回不回呢,考虑再三,还是不回了吧。
作者: fnfbp    时间: 2016-6-26 10:46
留个脚印```````













作者: 方重明    时间: 2016-9-29 22:33
顶下再看哈












某宝购买 视频教程 素材 软件 xiao视频 等资源  百度网盘免费下载   hao.wpan123.com
作者: 男人上031    时间: 2016-10-16 01:53
经验之谈,谢谢楼主了,请继续努力













作者: ys颐达小垒    时间: 2016-11-2 17:16
不错不错,值得学习啊!













作者: 南国一梦web    时间: 2016-11-4 07:06
不错~~~~~~

















欢迎光临 智能创客,中国最大的极客空间,智能平台,免费教学,视频教程,手把手教你创造儿时梦想! (http://luntan.znck007.com/) Powered by Discuz! X3.2