CC2530整理

一、 IAR软件配置

1.打开 Project---Options,
General Options 配置如图 1.33 所示,单击圆圈所示按钮,先向上返
回上一级目录,然后打开 Texas Instruments 文件夹,选择 CC2530F256
芯片.

2.选择 Linker—Config—Linker command file 选项。单击图 1.35 所示
按钮,导出配置文件,先向上返回上一级目录,然后打开 Texas
Instruments 文件夹,选择 lnk51ew_cc2530F256.xcl(这里是使用
CC2530F256 芯片)。

3.Debugger 选项的 Driver 里选择 Texas Instruments(使用编程器仿
真),下面选择 io8051.ddf 文件

二、 IO口寄存器

1. IO 口配置我们需要配置的寄存器 。(P*SEL.    P*DIR.    P*INP)

P0----

P0INP:设置各个IO口的输入模式,0为上拉/下拉,1为三态模式。

D7 D6 D5 D4 D3 D2 D1 D0
P0_7模式 P0_6模式 P0_5模式 P0_4模式 P0_3模式 P0_2模式 P0_1模式 P0_0模式

P0SEL:各个I/O口的功能选择,0为普通I/O功能,1为外设功能。

D7 D6 D5 D4 D3 D2 D1 D0
P0_7模式 P0_6模式 P0_5模式 P0_4模式 P0_3模式 P0_2模式 P0_1模式 P0_0模式

P0DIR:各个I/O口的方向,0为输入,1为输出。

D7 D6 D5 D4 D3 D2 D1 D0
P0_7方向 P0_6方向 P0_5方向 P0_4方向 P0_3方向 P0_2方向 P0_1方向 P0_0方向

P1----

P1INP:设置各个IO口的输入模式,0为上拉/下拉,1为三态模式。P1INP中只有D7~D2分别设置对应IO口输入模式。D1D0无作用。

D7 D6 D5 D4 D3 D2 D1 D0
P1_7模式 P1_6模式 P1_5模式 P1_4模式 P1_3模式 P1_2模式 P1_1模式 P1_0模式

P1SEL:各个I/O口的功能选择,0为普通I/O功能,1为外设功能。

D7 D6 D5 D4 D3 D2 D1 D0
P1_7模式 P1_6模式 P1_5模式 P1_4模式 P1_3模式 P1_2模式 P1_1模式 P1_0模式

P1DIR:各个I/O口的方向,0为输入,1为输出。

D7 D6 D5 D4 D3 D2 D1 D0
P1_7方向 P1_6方向 P1_5方向 P1_4方向 P1_3方向 P1_2方向 P1_1方向 P1_0方向

P2----

P2INP:D0~D4控制P2_0~P2_4的输入模式,0为上拉/下拉,1为三态。

           D5~D7设置对P0,P1和P2的上拉或下拉的选择。0为上拉,1为下拉。

D7 D6 D5 D4 D3 D2 D1 D0
P2选择 P1选择 P0选择 P2_4模式 P2_3模式 P2_2模式 P2_1模式 P2_0模式

P2SEL:(D0到D2位)端口2功能选择,0为普通I/O功能,1为外设功能

            (D3到D6)    端口1外设优先级控制。

D7 D6 D5 D4 D3 D2 D1 D0
*

0:USART0优先

1:USART1优先

0:USART1优先

1:定时器3优先

0:定时器1优先

1:定时器4优先

0:USART0优先

1:定时器1优先

P2_4功能选择 P2_3功能选择 P2_0功能选择

P2DIR :D0~D4设置P2_0到P2_4的方向
               D7、D6位作为端口0外设优先级的控制

D7

D6

D5

D4

D3

D2

D1

D0

未使用

P2_4方向

P2_3方向

P2_2方向

P2_1方向

P2_0方向

 D7D6

 意义

 00

第1优先级:USART 0
第2优先级:USART 1
第3优先级:定时器1

 01

第1优先级:USART 1
第2优先级:USART 0
第3优先级:定时器1

 10

第1优先级:定时器1通道0-1
第2优先级:USART 1
第3优先级:USART 0
第4优先级:定时器1通道2 –3

 11

第1优先级:定时器1通道2-3
第2优先级:USART 0
第3优先级:USART 1
第4优先级:定时器1通道0 –1

例子:

/*按照表格寄存器内容,我们对 LED1,也就是 P1_0 口进行配置,当 P1_0 输
出高电平时 LED1 被点亮。所以配置如下:    */ 
P1SEL &=~0x01; //作为普通 IO 口
P1DIR |= 0x01; //P1_0 定义为输出
P1INP |= 0X01; //打开下拉   
 
/*由于 CC2530 寄存器初始化时默认是: */ 
P1SEL =0x00;  
P1DIR =0x00;  
P1INP =0X00;  
 
/*所以 IO 口初始化我们可以简化初始化指令: */ 
P1DIR |= 0x01; //P1_0 定义为输出
P1INP |= 0X01; //打开下拉

/****************************
     按键初始化函数
*****************************/
void InitKey()
{
  P0SEL &= ~0X01;    //设置 P00 为普通 IO 口   
  P0DIR &= ~0X01;   //按键在 P00 口,设置为输入模式  
  P0INP &= ~0x01;   //打开 P00 上拉电阻,不影响
}

三、外部中断

外部中断需要配置三个寄存器 P*IEN 、PICTL 、P*IFG、IEN1

PICTL:D0~D3设置各个端口的中断触发方式,0为上升沿触发,1为下降沿触发。
              D7控制I/O引脚在输出模式下的驱动能力。选择输出驱动能力增强来补偿引脚DVDD的低I/O电压,确保在较
              低的电压下的驱动能力和较高电压下相同。0为最小驱动能力增强。1为最大驱动能力增强。

 

D7

D6

D5

D4

D3

D2

D1

D0

I/O驱动能力

未用

未用

未用

P2_0~P2_4

P1_4~P1_7

P1_0~P1_3

P0_0~P0_7

IEN0:中断使能0,0为中断禁止,1为中断使能

D7

D6

D5

D4

D3

D2

D1

D0

总中断EA

未用

睡眠定时器中断

AES加密/解密中断

USART1 RX中断

USART0 RX中断

ADC中断

RF TX/RF FIFO中断

   
IEN1:  D5为P0[7:0]中断使能位:0为中断禁止,1为中断使能,

D7

D6

D5

D4

D3

D2

D1

D0

未用

未用

端口0

定时器4

定时器3

定时器2

定时器1

DMA传输

   
IEN2:中断使能2,0为中断禁止,1为中断使能

D7

D6

D5

D4

D3

D2

D1

D0

未用

未用

看门狗定时器

端口1

USART1 TX

USART0 TX

端口2

RF一般中断

 

 

P0----

P0IFG   :P0[7:0]  终端状态标志寄存器,当输入端口有中断请求时,相应的标志位置1

P0IEN   :   P0[7:0]  各个控制口的中断使能,0为中断禁止,1为中断使能。

P1----

P1IFG   :P1[7:0]  终端状态标志寄存器,当输入端口有中断请求时,相应的标志位置1

P1IEN   :   P1[7:0]  各个控制口的中断使能,0为中断禁止,1为中断使能。

P2---

P2IFG:D0~D4为P2_0~P2_4的中断标志位。

           D5为USD D+中断状态标志,当D+线有一个中断请求未决时设置该标志,用于检测USB挂起状态下的USB恢复事件。       

           当USB控制器没有挂起时不设置该标志。

 

D7

D6

D5

D4

D3

D2

D1

D0

未用

未用

USB D+

P2_4

P2_3

P2_2

P2_1

P2_0


P2IEN:D0~D4控制P2_0~P2_4的中断使能
              D5控制USB D+的中断使能

D7

D6

D5

D4

D3

D2

D1

D0

未用

未用

USB D+

P2_4

P2_3

P2_2

P2_1

P2_0

例子:

//外部中断初始化:

void InitKey()

{
  P0IEN |= 0X01;  //P00 设置为中断方式  
  PICTL |= 0X01;  // 下降沿触发    
  IEN1  |= 0X20;   // 允许 P0 口中断;  
  P0IFG &= ~0x10;  // 初始化中断标志;
  EA = 1;         //开总中断

}

 /****************************  
      中断处理函数  
*****************************/  
#pragma vector = P0INT_VECTOR       //格式:#pragma vector = 中断向量,
                                    // 紧接着是中断处理程序
  __interrupt void P0_ISR(void)  
 {
  // 执行代码;             
    P0IFG &= ~0x10;         //清中断标志  
    P0IF = 0;                      //清中断标志 
}

 

四、定时器

IRCON:中断标志4,;0为无中断请求。1为有中断请求。

D7

D6

D5

D4

D3

D2

D1

D0

睡眠定时器

必须为0

端口0

定时器4

定时器3

定时器2

定时器1

DMA完成

TIMIF:定时器1的溢出中断屏蔽与定时器3、4的中断标志。D6为定时器1的溢出中断屏蔽,0为屏蔽,1为使能,默认为1.D5~D0为定时器3和4中各个通道的中断标志。

D7

D6

D5

D4

D3

D2

D1

D0

未用

T1溢出中断使能

T4通道1中断标志

T4通道0中断标志

T4溢出标志中断标志

T3通道1

T3通道0

T3溢出中断标志

1. T1(查询方式)

T1CTL:定时器1的控制,D1D0控制运行模式,D3D2设置分频划分值

D7

D6

D5

D4

D3D2

D1D0

未用

未用

未用

未用

00:不分频
01:8分频
10:32分频
11:128分频

00:暂停运行
01:自由运行,反复从0x0000到0xffff计数
10:模计数,从0x000到T1CC0反复计数
11:正计数/倒计数,从0x0000到T1CC0反复计数并且从T1CC0倒计数到0x0000


T1STAT:定时器1的状态寄存器,D4~D0为通道4~通道0的中断标志,D5为溢出标志位,当计数到最终技术值是自动置1。

D7

D6

D5

D4

D3

D2

D1

D0

未用

未用

溢出中断

通道4中断

通道3中断

通道2中断

通道1中断

通道0中断

   
T1CCTL0~T1CCTL4:定时器1通道0~通道4的工作方式设置。D1D0为捕捉模式选择:00为不捕捉,01为上升沿捕获,10为下降沿捕获,11为上升或下降沿都捕获。

D2位为捕获或比较的选择,0为捕获模式,1为比较模式。D5D4D3为比较模式的选择:000为发生比较式输出端置1,001为发生比较时输出端清0,010为比较时输出翻转,其他模式较少使用。

D7

D6

D5D4D3

D2

D1D0

未用

未用

比较模式

捕获/比较

捕捉模式

例子:

//定时器 1 初始化:

 void InitT1()      //系统不配置工作时钟时使用内部 RC 振荡器,即 16MHz
{
  T1CTL = 0x0d;          //128 分频,自动重装 0X0000-0XFFFF  

  //T1STAT = 0x21;        //通道 0, 中断有效    0010 0001 
}
void main(void)
{
   uchar count;           

   //调用初始化函数
   InitT1();
   while(1)
 {
          if(IRCON>0)             //查询方式
          { IRCON=0;
            if(++count==1)         //约 1s 周期性闪烁
            {
              count=0;
              //执行代码   
            }
          }  
 }


重点:系统在不配置工作频率时默认为 2 分频,即 32M/2=16M,所以定时
           器每次溢出时T=1/(16M/128)*65536≈0.5s, 所以总时间Ta=T*count=0.5*1=0.5S切换 1 次状态。

 

2.定时器 T3/4(中断方式) (8 位)

T3 定时器主要是配置三个寄存器 T3CTL,T3CCTL0,T3CC0,T3CCTL1,T3CC1。

T3CTL/T4CTL:定时器3或定时器4的方式控制寄存器。D7D6D5设置分频:000为无分频、001为2分频、010为4分频、011为8分频、100为16分频、101为32分频、110为64分频,111为128分频。D4为启动位,启动时1,停止工作为0。D3位为中断使能位,0为禁止,1为使能,默认为1;D2为复位,置1时定时器复位。D1D0为计数器模式选择:该位与T1CTL的D1D0位意义相同。

D7D6D5

D4

D3

D2

D1D0

分频

启动定时器

溢出中断

清除计数器

计数模式

   
T3CCTL0/T3CCTL1/T4CCTL0/T4CCTL1:定时器3或定时器4的通道0和通道1的方式控制,D6为该通道的中断使能位,0为禁止,1为使能,默认为1;D5~D0与T1CCTL0相同

D7

D6

D5D4D3

D1

D0

未用

中断使能

比较模式

捕获/比较

捕捉模式

 

例子:

使用 T3 定时器(8 位),

中断方式。寄存器配置如下:

T3CTL |= 0x08 ;                //开溢出中断     

T3IE   = 1;                    //开总中断和 T3 中断

T3CTL |=0XE0;                  //128 分频,128/16000000*N=0.5S,N=65200  

T3CTL &= ~0X03;                //自动重装 00->0xff  65200/256=254(次)

T3CTL |=0X10;                  //启动

EA = 1;                        //开总中断


/************************************
          中断函数
************************************/

#pragma vector = T3_VECTOR      //定时器 T3

 __interrupt void T3_ISR(void) 

 { 

   IRCON = 0x00;      //清中断标志, 也可由硬件自动完成 

   if(++count>254)   //254 次中断后 LED 取反,闪烁一轮(约为 0.5 秒时间) 

   {          

     count = 0;      // 计数清零 

    //执行代码

   }

 }

五、串口通讯

UART0 对应的外部设备 IO 引脚关系为:

                        P0_2------RX

                        P0_3------TX

UART1 对应的外部设备 IO 引脚关系为:

                        P0_5------RX

                        P0_4------TX

能够分别运行于异步 USART 模式或者同步 SPI 模式

 

USART 模式的操作具有下列特点:

1、8 位或者 9 位负载数据

2、奇校验、偶校验或者无奇偶校验

3、配置起始位和停止位电平

4、配置 LSB 或者 MSB 首先传送

5、独立收发中断

6、独立收发 DMA 触发

 

CC2530 配置串口的一般步骤:

1、 配置 IO,使用外部设备功能。此处配置 P0_2 和 P0_3 用作串口 UART0

 2、 配置相应串口的控制和状态寄存器。此处配置 UART0 的工作寄存器

 3、 配置串口工作的波特率。此处配置为波特率为 115200

寄存器具体配置如下:    
PERCFG = 0x00;     //位置 1 P0 口 
P0SEL  = 0x0c;     //P0_2,P0_3 用作串口(外部设备功能) 
P2DIR &= ~0XC0;        //P0 优先作为 UART0 
 
U0CSR  |= 0x80;     //设置为 UART 方式 
U0GCR  |= 11;            
U0BAUD |= 216;    //波特率设为 115200 
UTX0IF  = 0;           //UART0 TX 中断标志初始置位 0 

PERCFG:设置部分外设的I/O位置,0为默认I位置1,1为默认位置2

D7

D6

D5

D4

D3

D2

D1

D0

未用

 定时器1

 定时器3

 定时器4

 未用

 未用

USART1 

 USART0

P0SEL:见上文。

P2DIR :见上文。

串口的波特率设置可以从 CC2530 的 datasheet 中查得波特率由下式求得:

波特率

指数值

小数部分

2400

6

59

4800

7

59

9600

8

59

14400

8

216

19200

9

59

28800

9

216

38400

10

59

57600

10

216

76800

11

59

115200

11

216

230400

12

216

设置系统时钟源: CLKCONCMD:时钟频率控制寄存器。

D7

D6

D5~D3

D2~D0

32KHZ时间振荡器选择

系统时钟选择

定时器输出标记

系统主时钟选择

D7位为32KHZ时间振荡器选择,,0为32KRC震荡,1为32K晶振。默认为1。
D6位为系统时钟选择。0为32M晶振,1为16M RC震荡。当D7位为0时D6必须为1。
D5~D3为定时器输出标记。000为32MHZ,001为16MHZ,010为8MHZ,011为4MHZ,100为2MHZ,101为 1MHZ,110为500KHZ,111为250KHZ。默认为001。需要注意的是:当D6为1时,定时器频率最高可采用频率为16MHZ。
D2~D0:系统主时钟选择:000为32MHZ,001为16MHZ,010为8MHZ,011为4MHZ,100为2MHZ,101为1MHZ,110为500KHZ,111为250KHZ。当D6为1时,系统主时钟最高可采用频率为16MHZ。


等待晶振稳定: CLKCONSTA:时间频率状态寄存器。

D7

D6

D5~D3

D2~D0

当前32KHZ时间振荡器

当前系统时钟

当前定时器输出标记

当前系统主时钟

D7位为当前32KHZ时间振荡器频率。0为32KRC震荡,1为32K晶振。
D6位为当前系统时钟选择。0为32M晶振,1为16M RC震荡。
D5~D3为当前定时器输出标记。000为32MHZ,001为16MHZ,010为8MHZ,011为4MHZ,100为2MHZ,101为 1MHZ,110为500KHZ,111为250KHZ。
D2~D0为当前系统主时钟。000为32MHZ,001为16MHZ,010为8MHZ,011为4MHZ,100为2MHZ,101为1MHZ,110为500KHZ,111为250KHZ。

例子:

串口发送函数请参考下面源程序: 
 
源程序代码(全) 
/************************************** 
描述:在串口调试助手上可以看到不停地 
        收到 CC2530 发过来的:HELLO WEBEE 
        波特率:115200bps 
**************************************/ 
#include <ioCC2530.h> 
#include <string.h> 
 
#define  uint  unsigned int 
#define  uchar unsigned char 
 
//定义 LED 的端口 
#define LED1 P1_0 
#define LED2 P1_1 
 
//函数声明 
void Delay_ms(uint); 
void initUART(void); 
void UartSend_String(char *Data,int len); 
 
char Txdata[14];    //存放”HELLO WEBEE   “共 14 个字符串 
/**************************************************************** 
延时函数            
****************************************************************/ 
void Delay_ms(uint n) 
{ 
     uint I,j; 
     for(i=0;i<n;i++) 
     { 
     for(j=0;j<1774;j++); 
     } 
} 
 
void IO_Init() 
{ 
  P1DIR = 0x03;          //IO 方向输出 
 
  LED1 = 0;               //关 LED 
  LED2 = 0; 
} 
 
/**************************************************************** 
   串口初始化函数     
****************************************************************/ 
void InitUART(void) 

{  
  PERCFG = 0x00;        //位置 1 P0 口 
  P0SEL = 0x0c;        //P0_2,P0_3 用作串口(外部设备功能) 
  P2DIR &= ~0XC0;         //P0 优先作为 UART0 
 
  U0CSR |= 0x80;        //设置为 UART 方式 
  U0GCR |= 11;            
  U0BAUD |= 216;        //波特率设为 115200 
  UTX0IF = 0;              //UART0 TX 中断标志初始置位 0 
} 
/**************************************************************** 
串口发送字符串函数    
****************************************************************/ 
void UartSend_String(char *Data,int len) 
{ 
  int j; 
  for(j=0;j<len;j++) 
  { 
    U0DBUF = *Data++; 
    while(UTX0IF == 0); 
    UTX0IF = 0; 
  } 
} 
/**************************************************************** 
主函数       
****************************************************************/ 
void main(void) 
{  
CLKCONCMD &= ~0x40;                 //设置系统时钟源为 32MHZ 晶振 
while(CLKCONSTA & 0x40);              //等待晶振稳定为 32M 
CLKCONCMD &= ~0x47;                //设置系统主时钟频率为 32MHZ    
IO_Init(); 
InitUART();  
strcpy(Txdata,”HELLO WEBEE   “);      //将发送内容 copy 到 Txdata; 
while(1) 
{ 
  UartSend_String(Txdata,sizeof(“HELLO WEBEE   “));  //串口发送数据 
  Delay_ms(500);                            //延时 
  LED1=!LED1;                               //标志发送状态 
 } 
} 
串口接收和发送(send & receive)   
寄存器配置请参考上方实验 1 的表格。实验 1 较实验 1 增加了串口接收功
能,故寄存器配置有所改变,如下。 
  
 CLKCONCMD &= ~0x40;         // 设置系统时钟源为 32MHZ 晶振 
 while(CLKCONSTA & 0x40);    // 等待晶振稳定  
 CLKCONCMD &= ~0x47;         // 设置系统主时钟频率为 32MHZ 
 
 PERCFG  = 0x00;           //位置 1 P0 口  
 P0SEL   = 0x3c;           //P0_2,P0_3,P0_4,P0_5用作串口,第二功能  
 P2DIR  &= ~0XC0;          //P0 优先作为 UART0 ,优先级 
  
 U0CSR  |= 0x80;             //UART 方式  
 U0GCR  |= 11;               //U0GCR 与 U0BAUD 配合      
 U0BAUD |= 216;          // 波特率设为 115200  
 UTX0IF  = 0;            //UART0 TX 中断标志初始置位 1  (收发时候)

 U0CSR  |= 0X40;        //允许接收  
 IEN0   |= 0x84;        // 开总中断,接收中断     
 
 
源程序代码(部分) 请读者自行分析 
/************************************** 
程序描述:例以 abc#方式发送,#为结束符, 
        返回 abc。波特率:115200bps 
**************************************/ 

/****************************************************************  
   串口初始化函数      
****************************************************************/ 
void InitUart() 
{ 
CLKCONCMD &= ~0x40;           // 设置系统时钟源为 32MHZ 晶振 
while(CLKCONSTA & 0x40);      // 等待晶振稳定  
CLKCONCMD &= ~0x47;           // 设置系统主时钟频率为 32MHZ 
 
PERCFG = 0x00;            //位置 1 P0 口  
P0SEL = 0x3c;              //P0_2,P0_3,P0_4,P0_5 用作串口,第二功能  
P2DIR &= ~0XC0;           //P0 优先作为 UART0 ,优先级 
  
U0CSR |= 0x80;            //UART 方式  
U0GCR |= 11;         //U0GCR 与 U0BAUD 配合      
U0BAUD |= 216;       // 波特率设为 115200  
UTX0IF = 0;          //UART0 TX 中断标志初始置位 1  (收发时候) 
U0CSR |= 0X40;       //允许接收  
IEN0 |= 0x84;        // 开总中断,接收中断     
} 
 
/****************************************************************  
串口发送字符串函数     
****************************************************************/  
void Uart_Send_String(char *Data,int len)  
{ 
{  
  int j;  
  for(j=0;j<len;j++)  
 {  
U0DBUF = *Data++;  
while(UTX0IF == 0);   //发送完成标志位 
UTX0IF = 0;  
  }  
 } 
} 
 
/*************************** 
主函数 
***************************/ 
void main(void) 
{ 
  InitLed();            //调用初始化函数  
  InitUart(); 
  while(1) 
  { 
     if(RXTXflag == 1)     //接收状态  
     {  
        LED1 = 1;           //接收状态指示  
        if( temp != 0)  
        {  
           if((temp!=’#’)&&(datanumber<50)) //’#’被定义为结束字
符,最多能接收 50 个字
符            
           Rxdata[datanumber++] = temp;  
           else  
           {  
             RXTXflag = 3;                     //进入发送状态  

 
 

             LED1 = 0;                          //关指示灯 
            }  
            temp  = 0; 
         } 
      } 
      if(RXTXflag == 3)     //发送状态  
      {  
       LED2= 1;                            
       U0CSR &= ~0x40;      //禁止接收  
       Uart_Send_String(Rxdata,datanumber); //发送已记录的字符串。
 
       U0CSR |= 0x40;      //允许接收  
       RXTXflag = 1;       // 恢复到接收状态  
       datanumber = 0;     //指针归 0  
       LED2 = 0;           //关发送指示  
      }     
 } 
} 
/****************************************************************  
串口接收一个字符: 一旦有数据从串口传至 CC2530, 则进入中断,将接收
到的数据赋值给变量 temp.  
****************************************************************/  
#pragma vector = URX0_VECTOR  
  __interrupt void UART0_ISR(void)  
 {  
  URX0IF = 0;    // 清中断标志  
  temp = U0DBUF;                     

六、睡眠唤醒

前言:

Zigbee 的特点就是远距离低功耗的无线传输设备,节点模块闲时可以进入睡眠模式,在需要传输数据时候进行唤醒,能进一步节省电量。本章将讲述CC2530 在睡眠模式下的 2 种唤醒方法:外部中断唤醒和定时器唤醒。 睡眠定时器用于设置系统进入和退出低功耗睡眠模式之间的周期。还用于当系统进入低功耗模式后,维持 MAC 定时器(T2)的定时。其特性如下:  长达 24 位定时计数器,运行在 32.768KHZ 的工作频率。24 位的比较器具有中断和 DMA 触发功能在 PM2 低功耗模式下运行系统电源管理(工作方式如下): 

1. 全功能模式,高频晶振(16M 或者 32M )和低频晶振(32.768K RCOSC/XOSC )全部工作, 数字处理模块正常工作。 

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

3. PM2 :低频晶振(32.768K RCOSC/XOSC )工作, 数字核心模块关闭,系统通过 RESET,外部中断或者睡眠计数器溢出唤醒。

4. PM3 : 晶振全部关闭,数字处理核心模块关闭,系统只能通过 RESET 或外部中断唤醒。此模式下功耗最低。

 

1.中断唤醒      CC2530 需要配置的主要寄存器如下:PCON ,SLEEPCMD

配置方法:

SLEEPCMD |= i;     // 设置系统睡眠模式,i=0,1,2,3

PCON = 0x01;       // 进入睡眠模式 ,通过中断打断

PCON = 0x00;       // 系统唤醒 ,通过中断打断

例子:

源程序代码(全) 
/********************************************** 
程序描述:LED2 闪烁 5 次后进入睡眠状态,通 
          过按下按键 S1 产生外部中断进行唤 
          醒,重新进入工作模式。   
***********************************************/ 
#include <ioCC2530.h>  
#define uint unsigned int 
#define uchar unsigned char 
 
//定义控制 LED 灯和按键的端口 
#define LED2 P1_1               //定义 LED2 为 P11 口控制 
#define KEY1 P0_0 
 
//函数声明 
void Delayms(uint);         //延时函数 
void InitLed(void);         //初始化 P1 口 
void SysPowerMode(uchar sel);  //系统工作模式  
 
/**************************** 
         延时函数 
*****************************/ 
void Delayms(uint xms)             //i=xms 即延时 i 毫秒 
{ 
 uint I,j; 
 for(i=xms;i>0;i--) 
   for(j=587;j>0;j--); 
} 
/**************************** 
//初始化程序 
*****************************/ 
void InitLed(void) 
{ 
 P1DIR |= 0x02;     //P1_1 定义为输出 
   PICTL |= 0x02;     //下降沿触发   
 LED2 = 0;         //LED2 灯熄灭 
   P0INP  &= ~0X01;   //设置 P0 口输入电路模式为上拉/ 下拉 
   P0IEN |= 0X01;     //P00 设置为中断方式  
   PICTL |= 0X01;     // 下降沿触发       
} 
/***************************************************************  
系统工作模式选择函数             
* para1  0  1 2 3           
* mode  PM0 PM1 PM2 PM3               
***************************************************************/  
void SysPowerMode(uchar mode)  
{  
 uchar I,j;  
 I = mode;  
 if(mode<4)  
 {   
SLEEPCMD |= I;            // 设置系统睡眠模式  
  for(j=0;j<4;j++);  
PCON = 0x01;              // 进入睡眠模式 ,通过中断打断 

  }  
 else  
 {  
      PCON = 0x00;             // 系统唤醒 ,通过中断打断 
 }  
} 
/*************************** 
        主函数 
***************************/ 
void main(void) 
{    
uchar count = 0; 
InitLed();        //调用初始化函数      
IEN1 |= 0X20;      //开 P0 口总中断  
P0IFG |= 0x00;     //清中断标志 
  EA = 1;  
while(1) 
{ 
       LED2=~LED2; 
       if(++count>=10) 
       { 
          count=0; 
          SysPowerMode(3);    //5 次闪烁后进入睡眠状态 PM3, 
//等待按键 S1 中断唤醒 
        } 
        Delayms(500); 
     } 
} 
/*****************************************  
     中断处理函数-系统唤醒  
*****************************************/  
#pragma vector = P0INT_VECTOR  
  __interrupt void P0_ISR(void)  
 {  
      if(P0IFG>0)  
     {   
         P0IFG = 0;       //清标志位 
      }  
      P0IF = 0;  
      SysPowerMode(4); //正常工作模式 
 } 

2.定时器唤醒  

24bit 定时器::ST0 ,ST1 ,ST2

唤醒时间寄存器有以下配置方法:

   UINT32 sleepTimer = 0; 

   sleepTimer |= ST0; 

   sleepTimer |= (UINT32)ST1 <<  8; 

   sleepTimer |= (UINT32)ST2 << 16; 

   sleepTimer += ((UINT32)sec * (UINT32)32768)   //低速晶振; 

   ST2 = (UINT8)(sleepTimer >> 16); 

   ST1 = (UINT8)(sleepTimer >> 8); 

   ST0 = (UINT8) sleepTimer;

配置完毕后 sleepTimer 与 ST2<<16|ST1<<8|ST0 相差 sec 秒时间(低速晶振)

 

七、看门狗

具体配置可如下:

Init_Watchdog: 

  WDCTL  = 0x00;    //这是必须的,打开 IDLE 才能设置看门狗

  WDCTL |= 0x08;   //时间间隔一秒,看门狗模式  

FeedDog:

  WDCTL  = 0xa0;    //按寄存器描述来喂狗

  WDCTL  = 0x50;

源程序代码(全) 
/**************************************/ 
程序描述:打开看门狗后,得记得喂狗,不然 
          系统就会不停地复位了。把喂狗注 
释掉观察 LED1 现象 
**************************************/ 
#include <ioCC2530.h> 
 
#define uint unsigned int 
#define uchar unsigned char 
 
//定义控制 LED 灯的端口 
#define LED1 P1_0 
#define LED2 P1_1       //定义 LED2 为 P11 口控制 
 
//函数声明 
void Delayms(uint xms);  //延时函数 
void InitLed(void);     //初始化 P1 口 
 
/**************************** 
//延时函数 
*****************************/ 
void Delayms(uint xms)     //i=xms 即延时 i 毫秒 
{ 
 uint I,j; 
 for(i=xms;i>0;i--) 
   for(j=587;j>0;j--); 
}  
 
/**************************** 
//初始化程序 
*****************************/ 
void InitLed(void) 
{ 
 P1DIR |= 0x03;    //P1_0、P1_1 定义为输出 
   P1INP |= 0X03;    //打开下拉  
 LED1 = 0;         //LED1 灯熄灭 
 LED2 = 0;        //LED2 灯熄灭 
} 
 
void Init_Watchdog(void)  
{  
  WDCTL = 0x00;   //这是必须的,打开 IDLE 才能设置看门狗 
  WDCTL |= 0x08;    //时间间隔一秒,看门狗模式   
} 
void FeetDog(void)  
{  
  WDCTL = 0xa0;  
  WDCTL = 0x50;  
} 
/*************************** 
//主函数 
***************************/ 
void main(void) 

{ 
 InitLed();               //调用初始化函数 
        Init_Watchdog(); 
        LED1=1; 
 while(1) 
 {          
          LED2=~LED2;           //仅指示作用。 
          Delayms(300); 
          LED1=0;         
          //通过注释测试,观察 LED1,系统在不停复位。 
          FeetDog();   //喂狗,防止程序跑飞 
 } 
} 

 

 

 

 

 

展开阅读全文

没有更多推荐了,返回首页