STM32L151C8周期性从待机模式唤醒(RTC Wakeup Timer)

发布者:zhihua最新更新时间:2018-09-10 来源: eefocus关键字:STM32L151C8  待机模式  唤醒 手机看文章 扫描二维码
随时随地手机看文章

#include "stm32l1xx.h"

#include "system_stm32l1xx.h"

#include "OLED.h"

#include "delay.h"


void RtcWakeUpConfig(void);

u8 RtcInit(void);

u8 RtcConfig(void);


int main()

{

    DelayInit();    //延时初始化

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能PWR时钟

    if(PWR_GetFlagStatus(PWR_FLAG_SB))  //从待机模式唤醒 

    {

        PWR_ClearFlag(PWR_FLAG_SB);

        PWR_ClearFlag(PWR_FLAG_WU);

    }

    OLED_Init();

    RtcInit();


    while(1)    

    {

        OLED_8x16StrP(0,0,"Runing...");         //液晶提示在运行中

        DelayS(2);                              //延时2秒

        RtcWakeUpConfig();                      //RTC wakeup 配置:间隔500ms自动唤醒

//      PWR_WakeUpPinCmd(PWR_WakeUpPin_1,ENABLE);  //Periodic auto-wakeup不需要外部唤醒管脚,故不需要这句

        PWR_EnterSTANDBYMode();   //进入待机(STANDBY)模式     

    }

}


void RtcWakeUpConfig(void)

{

    RTC_WakeUpCmd(DISABLE);

    RTC_ClearFlag(RTC_FLAG_WUTF);

    RTC_WakeUpClockConfig(RTC_WakeUpClock_RTCCLK_Div8);     //选择时钟为外部32.768KHz 8分频

    RTC_SetWakeUpCounter(2047);         //间隔500ms

    RTC_ClearITPendingBit(RTC_IT_WUT);

    RTC_ITConfig(RTC_IT_WUT,ENABLE);    //需要使能中断,不需要中断函数

    RTC_WakeUpCmd(ENABLE);

}



u8 RtcInit(void)

{

    //检查是不是第一次配置时钟

    u8 flag = 0;

    if (RTC_ReadBackupRegister(RTC_BKP_DR0) != 0x32F2)      //从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎

    {

        /* RTC configuration  */

        flag = RtcConfig();

        if(flag == 0)

        {

            RTC_WriteBackupRegister(RTC_BKP_DR0, 0x32F2);

        }

        else

            return flag;

    }

    else

    {

        /* Enable the PWR clock */

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);


        /* Allow access to RTC */

        PWR_RTCAccessCmd(ENABLE);


        /* Wait for RTC APB registers synchronisation */

        RTC_WaitForSynchro();

    }

    return 0; //ok

}   


/**

  * @brief  Configure the RTC peripheral by selecting the clock source.

  * @param  None

  * @retval None

  */

u8 RtcConfig(void)

{

    /* Enable the PWR clock */

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);


    /* Allow access to RTC */

    PWR_RTCAccessCmd(ENABLE);


    /* Enable the LSE OSC */

    RCC_LSEConfig(RCC_LSE_ON);


    /* Wait till LSE is ready */ 

    u32 temp = 0;

    while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)

    {

        temp++;

        delay_ms(10);

        if(temp >= 250) return 1;//初始化时钟失败,晶振有问题,32768晶振起振极限时间1-5S 

    }


    /* Select the RTC Clock Source */

    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);


    /* Enable the RTC Clock */

    RCC_RTCCLKCmd(ENABLE);


    /* Wait for RTC APB registers synchronisation */

    RTC_WaitForSynchro();


    /* Configure the RTC data register and RTC prescaler */

    RTC_InitTypeDef RTC_InitStructure;

    RTC_InitStructure.RTC_AsynchPrediv = 0x7F;

    RTC_InitStructure.RTC_SynchPrediv = 0xFF;

    RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;

    RTC_Init(&RTC_InitStructure);


    return 0;

}

这里写图片描述

非待机模式,RTC Wakeup timer中断配置及中断处理

void RTC_IRQConfig(void)

{

    NVIC_InitTypeDef NVIC_InitStructure; 

    EXTI_InitTypeDef EXTI_InitStructure;

    /* EXTI configuration *******************************************************/

    EXTI_ClearITPendingBit(EXTI_Line20);

    EXTI_InitStructure.EXTI_Line = EXTI_Line20;

    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;

    EXTI_InitStructure.EXTI_LineCmd = ENABLE;

    EXTI_Init(&EXTI_InitStructure);


    /* Enable the RTC Wakeup Interrupt */

    NVIC_InitStructure.NVIC_IRQChannel = RTC_WKUP_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);  

}


void RTC_WKUP_IRQHandler(void)

{

    if(RTC_GetITStatus(RTC_IT_WUT) != RESET) 

    {

        EXTI_ClearITPendingBit(EXTI_Line20); 

        PWR_RTCAccessCmd(ENABLE);//如果之前禁止了,要重新打开

        RTC_ClearITPendingBit(RTC_IT_WUT);

        PWR_RTCAccessCmd(DISABLE);//可以再关上

        GPIO_ToggleBits( GPIOB, GPIO_Pin_4 );

    }

}


关键字:STM32L151C8  待机模式  唤醒 引用地址:STM32L151C8周期性从待机模式唤醒(RTC Wakeup Timer)

上一篇:STM32L系列低功耗调试《实用篇》
下一篇:无线路灯项目——STM32L低功耗相关

推荐阅读最新更新时间:2024-03-16 16:13

STM8S 中断唤醒,定时唤醒,窗口看门狗
一、 STM8S 外部中断进行唤醒 先了解一下STM8S的中断资源 再看看STM8S的中断管理。STM8S采用软件优先级和硬件优先级来控制一个中断的响应,先比较软件优先级只有当软件优先级一致时才会比较硬件优先级,由于硬件优先级具有唯一性,这样便保证了某一时刻定会只有一个中断被处理。 要使用外部中断,只需简单的配置一下EXTI_CR1寄存器,并将主程序main的软件优先级置为0即可。默认情况下自复位开始,主程序的软件优先级被设置为3,处于最高软件优先级,仅有TRAP,TLI,RESET中断能够打断,其余的中断都是不会被响应的。 为了防止中断过程中被别的优先级高的中断所打断,可以将当前优先级置为最高3级。 代
[单片机]
STM8S 中断<font color='red'>唤醒</font>,定时<font color='red'>唤醒</font>,窗口看门狗
STM32F3实时时钟RTC-闹钟和唤醒
STM32RTC使用步骤: 打开PWR时钟和Backup区数据访问 若使用外部低速时钟(LSE),打开LSE并等待起振 选择和打开RTC时钟,等待时钟同步 配置时间格式,分频系数等 根据需要配置时钟,日期,闹钟,唤醒,输出,时间戳,备份寄存器等模块 根据需要配置和打开中断,其中 RTC Alarm ——EXTI line 17 RTC tamper and Timestamps——EXTI line 19 RTC wakeup——EXTI line 20 下面的代码配置日期,时间,当前时间设置为 15年05月31日,星期日(7),15:50:40,打开闹钟A和唤醒中断,每一秒钟来一次中断,15:50:45
[单片机]
基于STM32战舰V3开发板的“待机低功耗唤醒实验”
低功耗模式为何而来? 在系统或者电源复位后,微控制器出于运行状态之下,HCLK为CPU内核提供时钟,CPU内核执行代码。当CPU不需要继续运行时,可以利用多种低功耗模式来节省功耗。 三种低功耗模式运行时都具备哪些功能? ① 睡眠模式 只有CPU停止工作,各个外设正常工作,依靠任何中断/事件唤醒。 ② 停止模式(深度睡眠模式) 所有时钟都已停止,但是1.8V内核电源工作。PLL,HIS和HSE等外部时钟源功能禁止,同时电压检测器也可进入低功耗模式,但是用于保存数据的寄存器,例如SRAM存储器中的内容被保留。此时只能依靠外部中断(EXTI)和RTC时钟才能唤醒。 ③ 待机模式 1.8V供电区域被时钟停止,内
[单片机]
基于STM32战舰V3开发板的“<font color='red'>待机</font>低功耗<font color='red'>唤醒</font>实验”
为什么32的嘀嗒定时器在低功耗stop模式唤醒后会比较缓慢
首先我们看到M4的编程手册,里面有systick的时钟来源介绍,可以看到systick的计数源的AHB或者AHB/8。 systick的配置函数如下,可以看到选择的时钟源时AHB。 __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) { if ((ticks - 1) SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ SysTick- LOAD = ticks - 1; /* set reload register */ NVI
[单片机]
为什么32的嘀嗒定时器在低功耗stop<font color='red'>模式</font><font color='red'>唤醒</font>后会比较缓慢
用户侧可调节资源亟待唤醒
中国储能网讯: 新型电力系统的一次能源主体将由可存储、运输的化石能源变为不可存储、运输且与气象环境密切相关的风能和太阳能,其供应面临着高度不确定性,仅靠电源调节难以实现电力平衡,需要唤醒用户侧沉睡的调节能力。对此,可通过发展需求响应、虚拟电厂、主动配电网等新技术,聚合并协调需求侧灵活资源参与电力系统运行,大幅提升电力系统的可靠性、灵活性和经济性。 进一步完善分时电价机制 随着电力市场化改革逐渐深化,需求响应作为电力系统重要的互动资源,可基于价格或激励措施,有效引导用户用电,提高电力系统的经济性和可靠性。其中,分时电价机制是价格型需求响应的一种实现方式,早期被大力推行的主要原因是,电源建设跟不上负荷需求增速,造成
[新能源]
小米汽车新专利 可根据用车习惯提前唤醒车辆
日前,我们从国家知识产权局网站公告中发现,小米汽车科技有限公司在9月12日公布了一份“车辆唤醒方法、装置、存储介质及车辆”专利。 描述如下: 本公开涉及一种车辆唤醒方法、装置、存储介质及车辆,涉及车辆技术领域。 所述方法包括获取用户使用车辆的记录;根据记录从时间周期中确定用户的用车时间段;在到达当前时间周期的用车时间段之前,唤醒车辆。 最终用户在使用车辆时,车辆已经处于唤醒状态,从而能够快速地对用户的操作进行响应,提升用户的用车体验,解决相关场景中车辆响应速度较慢的问题。 由于是在用车时间段前唤醒车辆,相对于全程唤醒车辆的方式,能够起到降低车辆能耗的效果。 小米汽车该专利在背景技术中指出,当前用户可通过手机
[汽车电子]
小米汽车新专利 可根据用车习惯提前<font color='red'>唤醒</font>车辆
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved