Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15550387
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类:

2007-07-16 10:44:52

arm7处理器at91sam7s64省电模式idle

文章来源:http://gliethttp.cublog.cn

{uint32 PMC_MCKR;
 extern volatile boolean at91sam7s64_power_on;
  at91sam7s64_power_on = false;
  {//1.主机时钟转为slow慢时钟
      PMC_MCKR = AT91C_BASE_PMC->PMC_MCKR;
      T91C_BASE_PMC->PMC_MCKR = AT91C_PMC_CSS_SLOW_CLK | AT91C_PMC_PRES_CLK_64;//进入最省电的慢时钟64分频模式
      AT91C_BASE_PMC->PMC_MOR = 0x00;                      //禁用主振荡器
  }
  {//2.禁用所有外设时钟,停止处理器运行
   uint32 PMC_PCSR;
   uint32 PMC_SCSR;
      PMC_PCSR = AT91C_BASE_PMC->PMC_PCSR;
      PMC_SCSR = AT91C_BASE_PMC->PMC_SCSR;
      AT91C_BASE_PMC->PMC_PCDR = -1;                       //禁止除SYS和FIQ之外的所有外设时钟
      AT91C_BASE_PMC->PMC_SCDR = -1;                       //处理器进入idle空闲省电模式,注意IRQ和FIQ中断代码要区分
                                                           //在这里恢复执行的中断,如果调用与主机时钟相关的东西,如:dbgu
                                                           //串口发送数据,是不允许的,时钟不对,所以需要at91sam7s64_power_on标志的保护.
      AT91C_BASE_PMC->PMC_PCER = PMC_PCSR;                 //由IRQ或FIQ中断唤醒
      AT91C_BASE_PMC->PMC_SCER = PMC_SCSR;                 //主要配置UDP和PCKx
  }
  {//3.主机时钟转为初始值
      AT91C_BASE_PMC->PMC_MOR = (( AT91C_CKGR_OSCOUNT & (0x06 <<8) | AT91C_CKGR_MOSCEN ));
      while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS));
      AT91C_BASE_PMC->PMC_MCKR = PMC_MCKR;                 //恢复进入idle之前模式
  }
  at91sam7s64_power_on = true;
}

阅读(2018) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~