STM8L用RTC做唤醒定时器时的注意点
来源: 芯艺
本站广告
  ENC28J60+uIP DHCP动态获取IP及UDP广播服务端示例
  ENC28J60+uIP 基于TCP的MODBUS IO示例
  ENC28J60+uIP HTTP GET方式将温度数据上传到web服务器
  FM1702读写S50(也叫M1)卡相关资料
  C720H5上实现MODBUS远程IO

以下是设置STM8L051F3的示例



uint8_t RTCInit(void)
{
  uint8_t ret;
  
  //CLK->ICKCR |= CLK_ICKCR_LSION;//打开内部低速时钟(38KHz)
  //while((CLK->ICKCR & (1<<3)) == 0); //等待完成
  
  CLK->PCKENR2 |= CLK_PCKENR2_RTC;//RTC 时钟允许
  CLK->CRTCR |= (2<<1);     //时钟源LSI  
  while( (CLK->CRTCR&0x01) == 0x1 );//等待完成
  CLK->CRTCR |=(3<<6);    //分频64 (注:分频128不可用)
  while( (CLK->CRTCR&0x01) == 0x1 );//等待完成
  ret=CLK->CRTCR;
  
  //禁止RTC寄存器写保护
  RTC->WPR = 0xCA;
  RTC->WPR = 0x53;

  RTC->CR2 &= ~ RTC_CR2_WUTE; //先关闭唤醒定时器
  while(( RTC->ISR1&0x04) == 0 );  //等待写允许
  
  RTC->CR1 &=~0X07;
  
  //RTC->CR1 &= ~ RTC_CR1_WUCKSEL;  //Clear
  //RTC->CR1 |= 0x04;              //Configure 
  RTC->CR1=0; //分频16  //设置定时值
  
  //计数频率:38khz/64/16=37.1  周期 = WAKE_UP_COUNT / 37.1
  RTC->WUTRH = (uint8_t)(WAKE_UP_COUNT >> 8);
  RTC->WUTRL = (uint8_t)(WAKE_UP_COUNT);
  
  RTC->CR2 |= RTC_CR2_WUTE;  //开启定时器

  //打开中断
  RTC->CR2 |= RTC_CR2_WUTIE;

//使能RTC寄存器写保护
  RTC->WPR = 0xFF;   
  
  return ret;
}

需要注意的是,数据手册上的时钟分频128是不可用的,64及以下的是可用的。
程序调试时一开始设置了128总是得不到准确的唤醒延时,最终找到原因了。




声明:芯艺工作室(http://www.chipart.cn)保留所有权力,转载请注明出处!

芯艺工作室    蒙ICP备06005492号

Copyright© 2004-2020 ChipArt Studio All Rights Reserved