我是靠谱客的博主 细心冰淇淋,最近开发中收集的这篇文章主要介绍cc2530 睡眠定时器串口显示功能描述,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

功能描述

cc2530 睡眠定时器串口显示

//第12次次课    (睡眠定时器方式唤醒)

//体会1:切换系统主时钟16MHz和32MHz
//体会2:当串口波特率比较高时候(19200),乱码多,降低后(9600)稳定,
//       主要是因为双方硬件时钟不精确

#include <ioCC2530.h>
typedef unsigned char uchar;
typedef unsigned int  uint;
typedef unsigned long ulong;
#define LED1 P1_0            //P1.0口控制LED1
#define LED2 P1_1            //P1.1口控制LED2

void init_xtal()
{//初始化系统所用的主时钟
  CLKCONCMD &=~0X40;   //选择32MHz的外部晶体振荡器
  while(CLKCONSTA & 0X40);//等待振荡器开启且稳定下来
  CLKCONCMD &= ~0X07;//设置为时钟速度不分频=32MHZ  
}

//延时函数msec 延时参数,值越大,延时越久
void DelayMS(uint msec)
{   
  uint i,j;
  for (i=0; i<msec; i++)
    for (j=0; j<535; j++);
}

void initU0()
{//初始化串口0,
 //P72,备用位置1优先,P0_2=RX  P0_3=TX.  位置2:P1_4=RX  P1_5=TX
   PERCFG&=~(1<<0); 
   
   //说明书P79,  设置串口0优先,
   P2DIR&=~(3<<6);     
   
  //设置为外设功能,P0_2=RX  P0_3=TX,必须配置这两个引脚为输出 
   P0SEL|=0X0C; //0000 1100   
   
 //串口模式  第7位:0=SPI同步串口模式   1=UART通用异步模式 
   U0CSR  |=(1<<7);   
   U0CSR  |=0X40;  //使能接收器
   
/*时钟为32MHz时的波特率设置表,当为16MHz时BAND_E加1即可
   波特率     BAND_M(UxBAND)     BAND_E(UxGCR[4:0])
   2400       59                 6
   4800       59                 7
   9600       59                 8
   14400      216                8
   19200      59                 9
   28800      216                9
   38400      59                 10
   57600      216                10
   76800      59                 11
   115200     216                11
   230400     216                12
*/   
   U0BAUD|=59;        //波特率=9600,小数部分BAND_M
   U0GCR|=8;       //波特率指数部分BAND_E,  U0GCR |=10;时钟=32MHz时  ,若时钟为16MHz时,BAND_E加1.

   UTX0IF=0;       //p41, 清除串口0发送中断标志位   
   URX0IF=0;       //p40,清除串口0接收中断标志位
   
   IEN2 |=0X40;      //p39,打开串口0发送中断开关
   URX0IE =1;      //P38,打开串口0接收中断开关
   
   EA     =1;      //开总中断  
}

void U0SendString(uchar *data)
{
   while(*data!='')
   {
      U0DBUF= *data++;
      while(UTX0IF==0);  //  (U0CSR & 0X02)//等待发送完毕
      UTX0IF=0;//清除发送中断标志
   }
}

//设置LED灯相应的IO口
void InitLed(void)
{   
  P1SEL &=0X03;            //两个LED灯设置为普通端口
  P1DIR |= 0x03;           //P1_0  P1_1定义为输出口
  LED1 = 0;
  LED2 = 0;                //LED1灯上电默认为打开 
}
//设置系统工作模式mode等于0为PM0 1为PM1 2为PM2 3为PM3 
void SysPowerMode(uchar mode) 
{ 
    if(mode>0 && mode < 4) 
    {  
        SLEEPCMD |= mode;    //设置系统睡眠模式 
        PCON = 0x01;         //进入睡眠模式 ,通过中断唤醒
    } 
    else 
    {
      SLEEPCMD &= ~0x03;    //设置系统进入PM0 
      PCON = 0x00;         //通过中断唤醒系统 
      DelayMS(10);
    }
}

//初始化休眠定时器,设定后经过指定时间自行唤醒
void InitSleepTimer(void) 
{ 
    ST2 = 0X00; //设置睡眠定时器初始值 ST2:ST1:ST0   必须按照这个顺序来写入
    ST1 = 0X00; //定时时钟为32K(rc或者xosc)
    ST0 = 0X00; //设置时间
    
    STIF = 0;   //睡眠定时器中断标志 0: 无中断未决   1: 中断未决
    STIE = 1;   //睡眠定时器中断使能 0: 中断禁止     1: 中断使能
    EA = 1;     //开中断 
}

//设置睡眠时间sec 睡眠时间 
void Set_ST_Period(uint sec) 
{ 
    ulong sleepTimer = 0; //临时变量,取得当前睡眠定时器的计数值
    
    sleepTimer |= ST0; //取得计数值的低8位
    sleepTimer |= (ulong)ST1 <<  8; //取得中级8位
    sleepTimer |= (ulong)ST2 << 16; //取得高8位
    
    //在现在的基础上,计算出应该计数到多少
    sleepTimer += ((ulong)sec * (ulong)32768); 
    
    ST2 = (uchar)(sleepTimer >> 16); //写入高8位
    ST1 = (uchar)(sleepTimer >> 8); //写入中级8位
    ST0 = (uchar) sleepTimer;       //写入低8位,开始计时
}

//中断处理函数 
#pragma vector = ST_VECTOR 
__interrupt void ST_ISR(void) 
{ 
    EA=0;//关闭中断开关  
    STIF = 0;          //清标志位
    
    //醒过来了,此时进入工作状态,发送心跳包
    LED2=0;
    //向串口发送数据包,比如GPS位置,温湿度、烟雾等等传感器数据
    U0SendString("Get DATAn");
    U0SendString("...n");
    EA=1;
} 

void main(void)
{  
  uchar i=0;  
  InitLed();                 //设置LED灯相应的IO口     
  InitSleepTimer();        //初始化休眠定时器
  initU0();//初始化串口0,设置波特率57600
  init_xtal();//选择系统主时钟为32MHz
  
    //现在是清醒状态,PM0模式,LED1闪烁3次提醒用户将进入睡眠模式
    for (i=0; i<6; i++)  
    {
      LED1 = ~LED1;
      LED2 = ~LED2;
      DelayMS(500);
    }
    
  while(1)
  {    
    LED2 = 1;           //关闭LED灯,表示要进入睡眠模式了
    Set_ST_Period(5);   //设置睡眠时间,睡眠5秒后唤醒系统
    
    U0SendString("Sleep for 5s.n");
    U0SendString("...n");
    
    //进入睡眠模式PM2=关闭高频振荡器,关闭稳压器,低功耗模式,等待睡眠定时器或者外部中断
    SysPowerMode(2);        
  }
}

最后

以上就是细心冰淇淋为你收集整理的cc2530 睡眠定时器串口显示功能描述的全部内容,希望文章能够帮你解决cc2530 睡眠定时器串口显示功能描述所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部