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

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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版