打印
[STM8]

Stm8l系列低功耗halt模式的自动唤醒

[复制链接]
17559|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 wzt19910506 于 2015-12-9 16:40 编辑

Stm8l系列低功耗halt模式的自动唤醒
By 赛易科技 Derrick
注:该文档适用于以下系列:STM8L051/L052 Value Line, STM8L151/L152, STM8L162,STM8AL31,STM8AL3L MCU lines
Stm8L系列单片机的低功耗有五种模式:
§ wait模式
§ Lowpower run模式
§ Lowpower wait模式
§ Active-haltwith full RTC模式
§ Halt模式
最低功耗的就是就是halt模式。这里也主要总结一下如何进入halt模式,进入以后可以通过什么方式唤醒,以及有很多客户会关心的如何自动唤醒。
Halt模式进入很简单,执行一条halt指令,调用库函数也就是halt()就行了。但是进入前要注意把所有的中断挂起标志给清除掉。要是不清零又恰巧有中断标志的时候进入该模式也会被立马唤醒。进入这种模式,所有的外设全都关闭了,所有时钟关闭。这时候它自己是醒不过来的,只能靠掐人中(给个外部中断)或者重新复活(重启复位)。当然这个在进入halt之前是要把中断引脚什么的该配置的给配置好了。
那现在有个问题就是在halt模式下只能通过外部中断和复位了,我需要它自动醒过来怎么办?那就在进入的时候定个闹铃了(打开rtc),到点了就要醒过来。既然开了闹铃了它也就不是纯halt模式了。这时候也就叫做active-halt模式。Active-halt模式下可以打开个rtc和lcd。这里要说明一下,在stm8s和stm8l101xx系列里面有AWU自动唤醒寄存器。这一系列里面却没有,它就是靠RTC来实现自动唤醒功能的。那现在就做个最简单的例程看看是如何使用rtc自动唤醒功能的:
第一步:选择RTC时钟源(使用lse或者lsi)                         CLK_RTCClockConfig(CLK_RTCCLKSource_LSI,CLK_RTCCLKDiv_1);
第二步:使能RTC的时钟                                                    CLK_PeripheralClockConfig(CLK_Peripheral_RTC,ENABLE);
第三步:选择RTC唤醒时钟源                                            RTC_WakeUpClockConfig(RTC_WakeUpClock_CK_SPRE_16bits);
第四步:RTC唤醒计数中断使能                                         RTC_ITConfig(RTC_IT_WUT,ENABLE);
第五步:使能所有中断                                                     enableInterrupts();
以上是初始化进行配置的部分。而每次要进入halt模式的时候我们还需要执行以下的步骤:        
第一步:设置唤醒的时间:                                               RTC_SetWakeUpCounter(5);
第二步:RTC唤醒使能:                                                  RTC_WakeUpCmd(ENABLE);
第三步:执行halt指令:                                                   halt();      
下面是简单测试代码总体预览:
当然还没完,要记得还有中断函数需要处理:

INTERRUPT_HANDLER(RTC_CSSLSE_IRQHandler,4)
{
RTC_ClearITPendingBit(RTC_IT_WUT); //中断标志位要清除
GPIO_WriteBit(GPIOE,GPIO_Pin_7,SET);  //测试,唤醒后led灯亮
GPIO_WriteBit(GPIOC,GPIO_Pin_7,SET);
}
该例程仅仅是简单测试,一个大概的思路。详细的应用配置需要自己添加修改。
注:唤醒后在CLK_ICKCR寄存器中的FHW位要是被至位,就使用HIS/8=2mhz的时钟源。否则就继续使用进入HALT模式之前的时钟源。

沙发
Snow7| | 2015-12-9 20:02 | 只看该作者
stm8s和stm8l101xx系列里面有AWU自动唤醒寄存器。

使用特权

评论回复
板凳
zhuotuzi| | 2015-12-9 20:55 | 只看该作者
Halt模式进入很简单,执行一条halt指令,调用库函数也就是halt()就行了。但是进入前要注意把所有的中断挂起标志给清除掉。

使用特权

评论回复
地板
迪卡| | 2015-12-9 22:22 | 只看该作者
Stm8l系列好像没有AWU,只能靠RTC来实现自动唤醒功能的

使用特权

评论回复
5
hugo0chen| | 2016-1-18 10:49 | 只看该作者
有stm8l051的固件库吗,有stm8l10x和stm8l15x的库,但是没有stm8l051的库。有的话,麻烦发我一份499528210@qq.com 谢谢~

使用特权

评论回复
6
xmshao| | 2016-2-23 20:06 | 只看该作者

使用特权

评论回复
7
yiyigirl2014| | 2016-2-24 11:53 | 只看该作者
第一步:设置唤醒的时间:                                               RTC_SetWakeUpCounter(5);
第二步:RTC唤醒使能:                                                  RTC_WakeUpCmd(ENABLE);
第三步:执行halt指令:                                                   halt();      

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
linlulu + 1 赞一个!
8
RF、龙龙| | 2016-3-30 13:00 | 只看该作者
遇到问题,求指导

使用特权

评论回复
9
wzt19910506|  楼主 | 2016-4-5 11:57 | 只看该作者
RF、龙龙 发表于 2016-3-30 13:00
遇到问题,求指导

有什么问题?

使用特权

评论回复
10
RF、龙龙| | 2016-4-5 17:12 | 只看该作者

定时时间不准,想问一下楼主,这个时间不准与唤醒之后所执行的功能时间长短有关系吗,谢谢楼主了

使用特权

评论回复
11
wzt19910506|  楼主 | 2016-4-6 22:37 | 只看该作者
RF、龙龙 发表于 2016-4-5 17:12
定时时间不准,想问一下楼主,这个时间不准与唤醒之后所执行的功能时间长短有关系吗,谢谢楼主了 ...

没有的,rtc时钟走动是不需要占用cpu的,所以也没关系

使用特权

评论回复
12
RF、龙龙| | 2016-4-8 10:28 | 只看该作者
wzt19910506 发表于 2016-4-6 22:37
没有的,rtc时钟走动是不需要占用cpu的,所以也没关系

感觉很奇怪啊    谢谢楼主

使用特权

评论回复
13
PLAMAN| | 2016-4-11 19:35 | 只看该作者
遇见以下问题,附上代码,请帮忙看一下。按照程序设计, RTC_SetWakeUpCounter(2047);定时应该是1S,把2047修改为8191应该是4S,但是实际情况是,修改该参数后,中断时间无变化,还是为1S左右。请帮忙看一下问题出在哪里。谢谢。
void RTC_Config(void)
{
        CLK_LSEConfig(CLK_LSE_ON);//RTC时钟源选择
        CLK_RTCClockConfig(CLK_RTCCLKSource_LSE, CLK_RTCCLKDiv_1);//RTC时钟分频
        while (CLK_GetFlagStatus(CLK_FLAG_LSERDY) == RESET);//等待时钟源就绪
        
        RTC_WakeUpCmd(DISABLE);//关闭RTC唤醒
        CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE);//RTC时钟门控使能
        RTC_WakeUpClockConfig(RTC_WakeUpClock_RTCCLK_Div16);//RTC唤醒时钟分频
        RTC_ITConfig(RTC_IT_WUT, ENABLE);//RTC唤醒中断使能
        RTC_SetWakeUpCounter(2047);//1/(32.768/16)*2048=1S.
        ITC_SetSoftwarePriority(RTC_IRQn, ITC_PriorityLevel_3);//优先级
        
        enableInterrupts();//使能中断
}
INTERRUPT_HANDLER(RTC_CSSLSE_IRQHandler,4)
{  
   RTC_WakeUpCmd(DISABLE);
   Delay(0x002F);
   GPIO_ToggleBits(GPIOD,GPIO_Pin_4);
   RTC_ClearITPendingBit(RTC_IT_WUT);  
   RTC_WakeUpCmd(ENABLE);
}
int main( void )
{
     PWR_FastWakeUpCmd(ENABLE);  //快速唤醒使能
     RTC_Config();
      
    PWR_UltraLowPowerCmd(ENABLE);//超低功耗
   
    RTC_ITConfig(RTC_IT_WUT, ENABLE);//唤醒定时器中断使能
    RTC_WakeUpCmd(ENABLE);//RTC唤醒使能
   
    while(1)
    {
        halt();
    }
}

使用特权

评论回复
14
PLAMAN| | 2016-4-11 19:39 | 只看该作者
RTC_SetWakeUpCounter(5);您这个20S的时间怎么计算出来的呢?

使用特权

评论回复
15
wwchang| | 2016-5-21 16:56 | 只看该作者
PLAMAN 发表于 2016-4-11 19:35
遇见以下问题,附上代码,请帮忙看一下。按照程序设计, RTC_SetWakeUpCounter(2047);定时应该是1S,把2047 ...

我也遇到同样的问题。

使用特权

评论回复
16
dldenglu| | 2016-12-8 00:58 | 只看该作者
PLAMAN 发表于 2016-4-11 19:35
遇见以下问题,附上代码,请帮忙看一下。按照程序设计, RTC_SetWakeUpCounter(2047);定时应该是1S,把2047 ...

你好!请问这个问题你解决了没有?我也是遇到这个问题,一直解决不了!如果解决了,可以告知如何解决的吗?

使用特权

评论回复
17
aouwen| | 2017-2-24 15:14 | 只看该作者
楼主你好,请问
RTC_SetWakeUpCounter(5);这个函数定时20怎么算出来的?

使用特权

评论回复
18
goldenzjc| | 2017-2-26 17:39 | 只看该作者
有stm8s003f固件库函数么?

使用特权

评论回复
19
lostand_xxf| | 2017-8-22 09:51 | 只看该作者
请问楼主,STM8L单片机里面的RTC唤醒功能,运行起来就没办法改变唤醒时间了吗?比如第一次进入halt模式后,我想休眠100s,然后唤醒之后,主程序运行30s,在进入halt休眠100s,如此循环,这样怎么实现?

使用特权

评论回复
20
choice2005| | 2017-9-15 19:40 | 只看该作者
求回复,为什么我的进入睡眠时,用RTC来唤醒,但跑久了芯片会复位一次是怎么回事呢,求解!

使用特权

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

本版积分规则

8

主题

134

帖子

8

粉丝