失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > CC2530基础实验:(10)系统睡眠唤醒--中断唤醒

CC2530基础实验:(10)系统睡眠唤醒--中断唤醒

时间:2023-10-06 16:43:18

相关推荐

CC2530基础实验:(10)系统睡眠唤醒--中断唤醒

目录

前言

一、实验相关电路图

二、实验相关理论与寄存器

三、源码分析

前言

1) 为什么要睡眠? Zigbee的特点就是远距离低功耗的无线传输设备,节点模块闲时可以

进入睡眠模式,在需要传输数据时候进行唤醒,能进一步节省电量

2) 掌握几种系统电源模式的基本设置及切换。系统电源有以下几种管理模式:

全功能模式,高频晶振( 16M 或者 32M )和低频晶振( 32.768K RCOSC/XOSC )全部

工作, 数字处理模块正常工作。PM1 : 高频晶振( 16M 或者32M )关闭,低频晶振( 32.768K RCOSC/XOSC )工作,

数字核心模块正常工作。PM2 :低频晶振( 32.768K RCOSC/XOSC )工作, 数字核心模块关闭,系统通过RESET,

外部中断或者睡眠计数器溢出唤醒。PM3 : 晶振全部关闭,数字处理核心模块关闭,系统只能通过RESET或外部中断唤醒。

此模式下功耗最低。

3)将睡眠模式下的 CC2530 通过按键中断唤醒,观察 LED 闪烁现象

一、实验相关电路图

由于发光二级管单向导电特性, 即只有在正向电压(二极管的正极接正,负极接负)下才

能导通发光。 P1.0 引脚接发光二极管(D1)的负极,所以 P1.0 引脚输出低电平 D1 亮, P1.0

引脚输出亮电平 D1 熄灭。 当 P0_1 引脚为低电平时说明按键被按下,高电平时为抬起状态.

二、实验相关理论与寄存器

相关寄存器 PCON, SLEEPCMD, 如下表所示:

睡眠定时器用于设置系统进入和退出低功耗睡眠模式之间的周期。还用于当系统进入低功耗模式后,维持 MAC 定时器(T2)的定时。其特性如下: 长达 24 位定时计数器,运行在 32.768KHZ

的工作频率。 24 位的比较器具有中断和 DMA 触发功能在 PM2 低功耗模式下运行.按照表格寄

存器的内容, 相关寄存器配置如下:

SLEEPCMD |= mode; //设置系统睡眠模式 mode 取值为 0、 1、 2、 3PCON = 0x01; //进入睡眠模式 ,通过中断唤醒PCON = 0x00; //通过中断唤醒系统

三、源码分析

main.c文件如下

/***************************************************************************** 文 件 名: main.c* 描 述: LED1闪烁3次后进入睡眠状态,通过按下按键S1产生外部中断进行唤醒****************************************************************************/#include <ioCC2530.h>typedef unsigned char uchar;typedef unsigned int uint;#define LED1 P1_0 //P1.0口控制LED1#define KEY1 P0_1 //P0.1口控制S1/程序入口函数void main(void){ uchar i=0; InitLed(); //设置LED灯相应的IO口InitKey();//设置KEY相应的IO口while(1){for (i=0; i<6; i++) //LED1闪烁3次提醒用户将进入睡眠模式{LED1 = ~LED1;DelayMS(500);}SysPowerMode(3);//进入睡眠模式PM3,按下按键S1中断唤醒系统 }}/***************************************************************************** 名 称: DelayMS()* 功 能: 以毫秒为单位延时 16M时约为535,系统时钟不修改默认为16M* 入口参数: msec 延时参数,值越大,延时越久* 出口参数: 无****************************************************************************/void DelayMS(uint msec){ uint i,j;for (i=0; i<msec; i++)for (j=0; j<535; j++);}/***************************************************************************** 名 称: InitLed()* 功 能: 设置LED灯相应的IO口* 入口参数: 无* 出口参数: 无****************************************************************************/void InitLed(void){P1DIR |= 0x01; //P1.0定义为输出口LED1 = 1;//LED1灯上电默认为熄灭 }/***************************************************************************** 名 称: InitKey()* 功 能: 设置KEY相应的IO口,采用中断方式 * 入口参数: 无* 出口参数: 无****************************************************************************/void InitKey(){P0IEN |= 0x2; // P0.1 设置为中断方式 1:中断使能PICTL |= 0x2; //下降沿触发 IEN1 |= 0x20; //允许P0口中断; P0IFG = 0x00; //初始化中断标志位EA = 1; //打开总中断}/***************************************************************************** 名 称: SysPowerMode()* 功 能: 设置系统工作模式* 入口参数: mode等于0为PM0 1为PM1 2为PM2 3为PM3 * 出口参数: 无****************************************************************************/void SysPowerMode(uchar mode) { if(mode > 0 && mode < 4) { SLEEPCMD |= mode; //设置系统睡眠模式 PCON = 0x01; //进入睡眠模式 ,通过中断唤醒} else PCON = 0x00; //主动/空闲模 通过中断唤醒系统 }/***************************************************************************** 名 称: P0_ISR(void) 中断处理函数 * 描 述: #pragma vector = 中断向量,紧接着是中断处理程序****************************************************************************/#pragma vector = P0INT_VECTOR __interrupt void P0_ISR(void) { if(P0IFG > 0) { P0IFG = 0; //清标志位} P0IF = 0; SysPowerMode(4); //正常工作模式}

如果觉得《CC2530基础实验:(10)系统睡眠唤醒--中断唤醒》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。