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