文章
博客 网店

 STM8L用RTC做唤醒定时器时的注意点


以下是设置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总是得不到准确的唤醒延时,最终找到原因了。


芯艺工作室    蒙ICP备06005492号
Copyright© 2004-2023 ChipArt Studio All Rights Reserved