打印
[STM8]

【转】stm8 RTC自动唤醒

[复制链接]
1013|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
TXQDM|  楼主 | 2016-12-24 12:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Stm8l RTC 调试心得 经过两天的摸索,终于把stm8l05b13的RCT 自动唤醒调通了。分别有库和寄存器来实现。给大家分享一下。这里只说函数,原理自己看使用手册,废话不多说,程序呈上, RTC 初始化.

void RTC_Config(uint16_t time)
{ RTC_DeInit(); //初始化默认状态
CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE); //允许RTC时钟
CLK_RTCClockConfig(CLK_RTCCLKSource_LSI, CLK_RTCCLKDiv_2); //选择RTC时钟源LSI、2=19K
RTC_WakeUpClockConfig(RTC_WakeUpClock_RTCCLK_Div16); //19k/16=1.1875KHz t=0.85ms
RTC_ITConfig(RTC_IT_WUT, ENABLE); //开启中断
RTC_SetWakeUpCounter(time); //设置RTC Weakup计算器初值
RTC_WakeUpCmd(ENABLE); //使能自动唤醒
}


RTC 中断 @far @interrupt
void RTC_CSSLSE_IRQHandler (void)
{ RTC_WakeUpCmd(DISABLE);
RTC_ClearITPendingBit(RTC_IT_WUT);
}

Main()
{ GPIO_config();
RTC_Config(2000); //2000*0.85ms=1.7s _asm("rim");
while(1)
{ if(!GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_3))
{ RTC_WakeUpCmd(ENABLE); LED(OFF); _asm("halt"); } LED(ON);; } }


PB3接一个按键到地,指示灯灭,进入active-halt.1.7s后自动唤醒,指示灯亮 使用STVD 开发环境库函数。stm8l系列容易发溢出。有时候代码没多少就已经溢出了。删除库函数中的不要的部分,可能会得到一些空间但还是不够,最直接的办法就是改用寄存器操作
void RTC_Config(uint16_t time)
{ uint16_t wutwfcount = 0;
CLK->PCKENR2 =0x04; //CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE);
CLK->CRTCR =0x24;//CLK_RTCClockConfig(CLK_RTCCLKSource_LSI, CLK_RTCCLKDiv_2);//LSI=19K RTC->WPR = RTC_WPR_DisableKey1;
RTC->WPR = RTC_WPR_DisableKey2; RTC->CR2 &=~0x04;
while (((RTC->ISR1 & RTC_ISR1_WUTWF) == RESET) && ( wutwfcount != 0xffff)) { wutwfcount ; }
RTC->CR1=0x00;
RTC->CR2 &=~0x04;
wutwfcount = 0;
while (((RTC->ISR1 & RTC_ISR1_WUTWF) == RESET) && ( wutwfcount != 0xffff))
{ wutwfcount ; } RTC->WUTRH = (uint8_t)(time>> 8);
RTC->WUTRL = (uint8_t)time;
RTC->CR2 =0x04; RTC->WPR=0xff; }


中断函数 @far @interrupt

void RTC_IRQHandler(void)
{ RTC->WPR = RTC_WPR_DisableKey1;
RTC->WPR = RTC_WPR_DisableKey2;
RTC->CR2 &=~0x04; RTC->WPR=0xff;
RTC->ISR2&=~0x04; }

关于RTC_Config中的while语句对应手册里的一句话关于RTC->ISR1中的WUTWF位 This bit is set by hardware when the wakeup timer values can be changed, after the WUTE bit has been set to 0 in RTC_CR2 0: Wakeup timer update not allowed. 1: Wakeup timer update allowed.

沙发
zhuotuzi| | 2016-12-24 13:17 | 只看该作者
定时器自动唤醒可以实现节能。

使用特权

评论回复
板凳
看不清的天空| | 2017-6-12 17:19 | 只看该作者
问一下第一次进入中断后第二次再进还要等1.7S还是直接进。我用库例程调试一直进中断,就第一次等了counter(time)时间,请问一下这是怎么回事?还是本来就这样?

使用特权

评论回复
地板
Sunriver_Yao| | 2019-5-3 20:25 | 只看该作者
设么意思:

使用特权

评论回复
5
Sunriver_Yao| | 2019-5-3 20:25 | 只看该作者
什么意思:
while (((RTC->ISR1 & RTC_ISR1_WUTWF) == RESET) && ( wutwfcount != 0xffff))
{ wutwfcount ; }

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

110

主题

593

帖子

11

粉丝