你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F072 RTC自动唤醒后STOP mode复位问题

[复制链接]
sunrun-1052972 提问时间:2017-5-18 20:24 /
大家好!我在调试F072 RTC自动唤醒程序时遇到唤醒后就自动复位,请坛友们帮忙看看是什么问题:代码如下
#include "include.h"
/*******************************************************************************
* 函数原型:void RTC_ALRIE(uint delay)
* 函数介绍:RTC闹钟唤醒
* 输入参数:ushort ms 唤醒时间
* 输出参数:无
*******************************************************************************/
void RTC_Init(uint current_time)
{
  RCC->CSR.RMVF = 1;
  RCC->APB1ENR.PWREN =1;//使能电源接口时钟
  PWR->CR.DBP = 1;//充许访问允许写入RTC和后备寄存器
  RCC->BDCR.BDRST = 1;//复位整个备份域
  __NOP();__NOP();
  RCC->BDCR.BDRST = 0;//复位整个备份域
  RCC->BDCR.LSEDRV = 3;//LSE 振荡器驱动能力:中高驱动能力
  RCC->BDCR.LSEON =1;//LSE 振荡器开启
  while(!RCC->BDCR.LSERDY);//等待LSE 振荡器就绪
  RCC->BDCR.RTCSEL = 1;//LSE 振荡器作为RTC 时钟
  RCC->BDCR.RTCEN =1;//使能RTC时钟
  //解除RTC写保护
  RTC->WPR.KEY = 0xCA;
  __NOP();__NOP();
  RTC->WPR.KEY = 0x53;
  RTC->ISR.INIT = 1;
  __NOP();__NOP();
  while(!RTC->ISR.INITF);//确保已经正式进入初始化模式
  RTC->CR.FMT = 0;//24小时
  RTC->CR.BYPSHAD = 1;
  RTC->PRER.PREDIV_A = 127;
  RTC->PRER.PREDIV_S = 255;//同步分频
  
  RTC->TR.PM = 0;//AM/24 小时制
  RTC->TR.HT = 1;
  RTC->TR.HU = 3;
  RTC->TR.MNT = 0;
  RTC->TR.MNU = 7;
  RTC->TR.ST = 5;
  RTC->TR.SU = 0;
  
  RTC->DR.YT = 1;
  RTC->DR.YU = 4;
  
  RTC->DR.WDU = 5;
  
  RTC->DR.MT = 0;
  RTC->DR.MU =4;
  
  RTC->DR.DT = 2;
  RTC->DR.DU = 1;
  RTC->ISR.INIT = 0;
  __NOP();__NOP();
  RTC->WPR.KEY = 0xFE; /* (6) */
  RTC->WPR.KEY = 0x64; /* (6) */
}
/*******************************************************************************
* 函数原型:void RTC_ALRIE(uint delay)
* 函数介绍:RTC闹钟唤醒
* 输入参数:ushort ms 唤醒时间
* 输出参数:无
*******************************************************************************/
void RTC_WUT_Init(uint time)
{
  PWR->CR.DBP = 1;//充许访问允许写入RTC和后备寄存器
  RTC->WPR.KEY = 0xCA;
  __NOP();__NOP();
  RTC->WPR.KEY = 0x53;
  RTC->CR.WUTE = 0;//关闭WUTE计数
  while (!RTC->ISR.WUTWF);
  RTC->CR.WUCKSEL = 0x00;//1/16
  RTC->WUTR.WUT = time;
  RTC->CR.WUTE = 1;
  RTC->CR.WUTIE = 1;
  RTC->WPR.KEY = 0xFE; /* (6) */
  RTC->WPR.KEY = 0x64; /* (6) */
  EXTI->IMR.MR20 = 1;//开放来自线x 上的中断请求
  EXTI->RTSR.TR20 = 1;//允许输入线上升沿触发
  NVIC->ISER[0] |= 1<<2;//开启EXTI线0~1中断中断接收
}
/*******************************************************************************
* 函数原型:void RTC_ALRIE(uint delay)
* 函数介绍:RTC闹钟唤醒
* 输入参数:ushort ms 唤醒时间
* 输出参数:无
*******************************************************************************/
void RTC_IRQHandler(void)
{
  if(RTC->CR.WUTIE&&RTC->ISR.WUTF)
  {
    RTC->ISR.WUTF = 0;
    EXTI->PR.PR20 =1;//清除中断标识
    PWR->CR.CWUF =1;
    RCC->APB2ENR.SYSCFG_COMPEN =1;//SCFG 时钟开启
  }
}

收藏 评论2 发布时间:2017-5-18 20:24

举报

2个回答
sunrun-1052972 回答时间:2017-5-18 20:36:05
在线求解
五哥1 回答时间:2018-4-29 21:04:16
寄存器程序,这个要求高了一些,建议用官方例程改,或者上正点原子的程序来改,要快一些。库函数或者CUBEMX直接生成

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版