Chinaunix首页 | 论坛 | 博客
  • 博客访问: 43306
  • 博文数量: 59
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2015-05-31 10:42
文章分类
文章存档

2015年(59)

我的朋友

分类: 嵌入式

2015-05-31 10:48:01

   在PM0功耗模式下,可配置32MHz晶体振荡器或16MHzRC振荡器作为系统的时钟。设置系统时钟需要操作两个寄存器:CLKCON(时钟控制寄存器)和SLEEP(睡眠模式控制寄存器)。
   本程序功能就是主函数不断切换XTAL和RC为系统时钟,并在中间插入LED闪烁函数,由于系统时钟速率不同,LED闪烁的频率也不同。

void initClockmodes(void)
{
   DISABLE_ALL_INTERRUPTS();
   P1SEL &= ~0x01;
   INIT_GLED();
}
 
void blinkLeds(void)
{
  UINT16 timeOut = 0xffff;
  while(timeOut--);
  GLED ^=1;
}

void main(void)
{
 unsigned char i;
 initClockmodes();
 while(1)
 {
  Set_Main_Clock_Source(RC);
  for(i=0;i<20;i++)
  {
   blinkLeds();
  }
  Set_Main_Clock_Source(CRYSTAL);
   for(i=0;i<20;i++)
  {
    blinkLeds();
  }
 }
}


// Macro for setting the main clock oscillator source,

//turns off the clock source not used

//changing to XOSC will take approx 150 us

#define SET_MAIN_CLOCK_SOURCE(source) \
   do { \
      if(source) { \
        CLKCON |= 0x40; \
        while(!HIGH_FREQUENCY_RC_OSC_STABLE); \
        if(TICKSPD == 0){ \
          CLKCON |= 0x08; \
        } \
        SLEEP |= 0x04; \
      } \
      else { \
        SLEEP &= ~0x04; \
        while(!XOSC_STABLE); \
        asm("NOP"); \
        CLKCON &= ~0x47; \
        SLEEP |= 0x04; \
      } \
   }while (0)

LED灯一直闪烁,闪烁频率时高时低。
阅读(227) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~