RTC_WakeUp中断唤醒STM32F4停止模式_rtc_wakeup_irqn_-FunVee-的博客-程序员秘密

技术标签: stm32  唤醒  RTC-WakeUp  STM32停止模式  

RTC_WakeUp唤醒STM32F4停止模式(借鉴的是原子哥写的代码):
首先我们先初始化RTC配置:

//RTC初始化
u8 MyRTC_Init(void)
{
    RTC_InitTypeDef RTC_InitStructrue;
    u16 retry=0x1FFF;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//使能PWR时钟
    PWR_BackupAccessCmd(ENABLE);//使能后备寄存器
    if(RTC_ReadBackupRegister(RTC_BKP_DR0)!=0x5050)
    {
        RCC_LSEConfig(RCC_LSE_ON);//开启低速外部时钟
        if(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET)//读取外部低速时钟是否准备就绪
        {
            retry++;
            delay_ms(10);
        }
        if(retry==0)
            return 1;//LSE开启失败
        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);//选择LSE作为RTC时钟
        RCC_RTCCLKCmd(ENABLE);//使能RTC时钟

        RTC_InitStructrue.RTC_AsynchPrediv=0x7F;//RTC异步分频系数127
        RTC_InitStructrue.RTC_SynchPrediv=0xFF;//RTC同步分频系数255
        RTC_Init(&RTC_InitStructrue);//RTC初始化函数
        RTC_WriteBackupRegister(RTC_BKP_DR0,0x5050);
    }
    return 0;
}

然后配置RTC_WakeUp:

void RTC_Set_WakeUp(u16 waketime)
{
    EXTI_InitTypeDef EXTI_InitStruct;
    NVIC_InitTypeDef NVIC_InitStruct;

    RTC_WakeUpCmd(DISABLE);//关闭Wake Up
    RTC_WakeUpClockConfig(RTC_WakeUpClock_CK_SPRE_16bits);//时钟选择1Hz
    RTC_SetWakeUpCounter(waketime);//设置WakeUp自动重装载值
    RTC_ClearITPendingBit(RTC_IT_WUT);//清除WakeUp中断标志
    EXTI_ClearITPendingBit(EXTI_Line22);//清除Line22中断标志
    RTC_ITConfig(RTC_IT_WUT,ENABLE);//开启WakeUp中断标志
    RTC_WakeUpCmd(ENABLE);//开启WakeUp

    EXTI_InitStruct.EXTI_Line=EXTI_Line22;//LINE22
    EXTI_InitStruct.EXTI_LineCmd=ENABLE;
    EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
    EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;//上升沿触发
    EXTI_Init(&EXTI_InitStruct);

    NVIC_InitStruct.NVIC_IRQChannel=RTC_WKUP_IRQn;//选择WakeUp中断
    NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0x01;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority=0x02;
    NVIC_Init(&NVIC_InitStruct);
}

编写RTC_WakeUp中断函数(记得初始化系统时钟):

void RTC_WKUP_IRQHandler()
{
    while(RTC_GetFlagStatus(RTC_FLAG_WUTF)!=RESET)
    {
        RTC_ClearFlag(RTC_FLAG_WUTF);
        SystemInit();
        LED1=!LED1;
    }
    EXTI_ClearITPendingBit(EXTI_Line22);
}

然后就是main函数了:

int main(void)
{ 
    u8 t=0;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
    delay_init(168);      //初始化延时函数
    uart_init(9600);        //初始化串口波特率为9600

    LED_Init();                   //初始化LED         
    KEY_Init();
    MyRTC_Init();
    while(1)
   {
        LED0=!LED0;
        RTC_Set_WakeUp(5);//时钟频率选的1Hz,5S产生一次RTC_WakeUp中断
        printf("t=%d\n\r",t);
        PWR_EnterSTOPMode(PWR_LowPowerRegulator_ON,PWR_STOPEntry_WFI);
        t++;
        if(t>30)
         t=0;
    }

把USART1接串口调试助手上,变量t从0开始每5秒加1,同时LED每5秒反转一次状态.
**注意哈:
停止模式是烧录不进程序的,要烧录程序的话,要先按住RESET键,点download后,松手就能下进去了.**

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/oFunVeeo/article/details/78782874

智能推荐

cocos2d-x的初步学习二_wang_daren的博客-程序员秘密

好了,上一篇文章中我们介绍了如何创建一个精灵,那么现在我们给他加点动作(action)。下面我总结了一下一些基本的动作函数。 CCPoint p=ccp(size.width/2+100, size.height/2); //放置 其实就相当于setposition CCPlace *ac1=CCPlace::create(p); //隐藏 CC

记录在docker中安装Jenkins持续集成配置_yung3216的博客-程序员秘密

记录在docker中完成Jenkins持续集成配置记录在docker中完成Jenkins持续集成配置这里直接从安装docker中jenkins开始1.安装jenkins1.1 在下载docker中jenkins//下载jenkins的命令docker pull jenkins/jenkins1.2 创建jenkins目录挂载点创建Jenkins挂载目录并授权权限(我们在服务器上先创建一个jenkins工作目录 /docker/jenkins,修改文件的权限,稍后我们将jenkins容器目录

火狐隐藏滚动条_AKIRAZXX的博客-程序员秘密

只需要添加scrollbar-width: none;效果如图

Phoenix FD(火凤凰全能流体动力学3Dmax插件)_phoenixfd安装教程-程序员秘密

Phoenix FD是专为艺术家打造的全能流体动力学插件,可以模拟真实的火焰,烟雾,液体,海洋,泼溅,雾气等等效果。使用方便的参数来完善,调整并渲染各种基于物理的流体效果。与行业最主流的工具兼容,如: OpenVDB, Alembic, Krakatoa 和 thinkingParticles。与 3ds Max 无缝整合,并针对 V-Ray 渲染做了优化。支持Vray 5安装教程1、选择要安装的插件版本2、勾选我接受,点击安装3、安装完成4、拷贝phoenix_4000

实现月全食效果-android自定义控件_让开,我要吃人了的博客-程序员秘密

实现方式想实现月亮发光效果需要使用的Paint类的setMaskFilter()方法,传入BlurMaskFilter对象实现高斯模糊发光。思路分析首先我们知道发生月全食的时候,月亮是完全被挡住的,但是他的周围会有一层光晕,这层光晕应该是一个黄色的渐变效果,通过MaskFilter我们可以设置光晕的半径和颜色,为了使效果更加逼真我们的demo给光晕加上一层透明度变化的动态效果代码思路变量的声明var vWidth = 0f var vHeight = 0f var

Sql Server2008之关于”***对象无效“错误_躬匠的博客-程序员秘密

我们在sql server2008中编写sql语言时,经常会遇到这样的提示:***对象无效。这是什么错误,为什么在2000版本中就不存在这样的情况呢?其实这主要是sql server 2005/2008版本中新增了架构的概念。下面就结合网上的查询说一下我对sql server2008中架构的理解。可能有一些东西理解的不到位,欢迎各位指出,共同学习、改进。

随便推点

想骂人!开发语言不能统一成一个么?_小姐姐味道的博客-程序员秘密

原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。有时候,写TypeScript写多了,写Java的时候就老容易出错。而当陷入某个项目一段时间之后,自我感觉老熟悉...

只要UEFI+MBR_syaka007的博客-程序员秘密

之前发了一篇“实战WIN10+UEFI引导装系统(不重装不格盘100%成功)”的文章,今天在朋友那制作时候,发现漏了一步(重建引导部分,之前有人卡WINDOWS标徽那,估计就是引导指向错误了!),晕……现在重新发布一次!这次肯定没问题了!----------------------------------一般想要用UEFI,必须将BIOS+MBR格式转UEFI+GPT格式才可以,可是要将MBR...

js动态添加html元素绑定事件,为js动态创建的元素绑定事件_Liou Siaocing的博客-程序员秘密

请注意,本文编写于 1410 天前,最后修改于 810 天前,其中某些信息可能已经过时。问题描述handsome主题评论的时候,如果是子评论,评论内容前面会有一个@某人的锚点链接。由于主题顶部的导航占用了50px的高度,所以点击锚点链接的时候必须向下偏移原来的位置50px,才能正常显示。但是,对于ajax生成的评论,如果不刷新页面的话,点击子评论左边的锚点链接却不会向下偏移。即:以前写的js对动态...

error: undefined reference to `__imp__ZN11QSerialPortC1EP7QObject'_Chamico的博客-程序员秘密

Qt出现error: undefined reference to `__imp__ZN11QSerialPortC1EP7QObject'解决方法:在pro文件中加入QT += serialport重新构建即可。

旋转数组中的最小数字 java_小小白的成长之路的博客-程序员秘密

旋转数组中的最小数字 java题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。代码1:import java.util.ArrayList;publ...

Java -- springboot 配置 ckfinder_com.ckfinder_@程序员的博客-程序员秘密

基于 SpringBoot 下配置 ckfinder,提供图片的上传、选取等资源管理功能

推荐文章

热门文章

相关标签