历史上的今天

今天是:2024年09月10日(星期二)

正在发生

2018年09月10日 | STM32L151C8周期性从待机模式唤醒(RTC Wakeup Timer)

发布者:zhihua 来源: 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低功耗相关

推荐阅读

当过老师,喜欢当老师,以后还想当老师的JACK MA,也就是马云先生,突然宣布要“退休”,似乎非要在这个“教师节”来临时再凑凑热闹,涨涨粉,也用这种方式为自己庆祝一下生日。动脉网记者不算太健忘,还记得,这可不是马云第一次要和阿里巴巴说再见了。2013年5月,马云辞任阿里巴巴CEO,还弄了个告别会,并宣布“我以后不回来了。要回也不回来。因为我回...
重定向使用MicroLib 串口波特率设置为115200单个字符发送,大部分操作无反馈,少部分操作有正确反馈;1.修改串口波特率为9600 有所改善,但并未解决问题2.修改串口中断优先级为抢占有限级 1 子优先级 3 无改善3.停止使用串口中断,使用查询标志位方式完成接收 问题解决
常见的机器人视觉伺服中要实现像素坐标与实际坐标的转换,首先就要进行标定,对于实现视觉伺服控制,这里的标定不仅包括摄像机标定,也包括机器人系统的手眼标定。以常见的机器人系统为例,有两种构型,如下: 即:摄像机固定于机器手和摄像机固定于外部场景; 本文针对前一种构型:摄像机固定于机器手。 1、摄像机标定技术 (1)理论部分: 以张...
实验设备:干耦合探头、超声波脉冲发生接收仪、前置放大器、数字存储示波卡、探头工装、功率放大器、信号发生器、示波器、电脑实验内容:为了解决超声检测过程中不能在固体火箭发动机壳体粘接结构表面涂抹耦合剂的问题,首先构建了一套干耦合超声检测系统,设计了具有特殊结构形式压电振子和传声杆的干耦合探头。然后提出基于时间反转的干耦合超声成像方法...

史海拾趣

问答坊 | AI 解惑

屏蔽的概念及屏蔽的原理

屏蔽就是对两个空间区域之间进行金属的隔离,以控制电场、磁场和电磁波由一个区域对另一个区域的感应和辐射。具体讲,就是用屏蔽体将元部件、电路、组合件、电缆或整个系统的干扰源包围起来,防止干扰电磁场向外扩散;用屏蔽体将接收电路、设备或系 ...…

查看全部问答∨

vivi编程

贡献一vivi编程资料!…

查看全部问答∨

EPSON TSP700 打印位置设置的问题

    我在用EPSON TSP700的ESC\\POS 指令编程时只要碰到打印位置设置的指令就出不来,不是打印出奇怪字符就是没效果,比如在页模式下打印区域的设置就老出不来,很是郁闷。     请哪位做过的高手给我提示一二,最好能给个例子 ...…

查看全部问答∨

工程师请进,送分

05年上海211本科电子专业毕业,独自成功设计两款仪器产品(主要单片机控制),包括内部电气连线,pcb板(控制板加驱动板模式),全部独自与机械工程师合作设计完毕直至成功投产。。。两台仪器市价分别2至4万左右。。。powerpcb,orcad,keil c 熟练用于 ...…

查看全部问答∨

[求助]WINCE5 实现 HIVE注册表问题01:filesys.exe运行出错:无法mount boot.hv。检查后结果——boot.hv为何不在core

一、环境描述: CPU: PXA270 RAM: 64MB SDRAM ROM: Intel 2M Nor Flash(Boot)      Samsung 1GB Nand Flash(BINFS+FATFS)     说明:系统镜像文件xip.bin会烧录到NAND的开始区域,此区域是BINFS格式;NAND剩下 ...…

查看全部问答∨

Stellaris的片内外设中断是如何实现的?

想请教下坛友, Stellaris系列cortex-M3的片内外设的中断是怎么实现的?希望能以IO口中断为例子,说下代码运行的过程,希望能具体点。还有ARM内核的中断又是怎么个跳转过程,比如SysTick的的中断。 后来找到了一本讲解CM3很好的书,具体见附 ...…

查看全部问答∨

对STM32F系列软件资料的看法

                                 TI提供了基于位域定义的许多芯片寄存器文件,在操作寄存器的时候只要直接对对应的位域赋值就可以,一目了然,非常 ...…

查看全部问答∨

请教STM32USB组合设备(compositedevice)的问题。

想用STM32 USB实现MASS STORAGE与 VIRTUAL COM,请教下面的这个初始化函数如何合并才能同时对两个应用初始化呢? DEVICE_PROP Device_Property =   {     MASS_init,     MASS_Reset,     MASS_ ...…

查看全部问答∨

ccs_v3.3_sr8_3.7.77.exe

我用的是DEC F28335的板子,向flash里烧写程序时要用到ccs_v3.3_sr8_3.7.77.exe这个文件,但是在配套的文件夹里没有呀,在TI网站上也找不到,有的话给发一个,谢谢…

查看全部问答∨

flash编程一个字节前要不要先擦除

flash编程一个字节前要不要先擦除?我看了数据手册没有特别的说要,也没有说不要,求高手解惑…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved