OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12729|回复: 11

STM32F439的RTC

[复制链接]

21

主题

79

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2014-2-11
在线时间
0 小时
发表于 2014-4-2 12:37:35 | 显示全部楼层 |阅读模式
我现在在调439的RTC功能,参照407的一个例程,写了一下RTC的初始化代码,我希望用
RTC的Wakeup中断来产生一个秒中断,但是预期的RTC Wakeup秒钟没有产生,不知道是
怎么回事,大家有时间帮我看一下吗,代码如下

uint32_t InitRTC(void)
{
RTC_InitTypeDef RTC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
uint32_t AsynchPrediv=0,SynchPrediv=0;
RTC_TimeTypeDef RTC_TimeStructure;
RTC_AlarmTypeDef  RTC_AlarmStructure;
u32 tmp_hh = 0x01, tmp_mm = 0x01, tmp_ss = 0x01;
  if (RTC_ReadBackupRegister(RTC_BKP_DR0) != 0x32F2)//未设置时间
  {
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
PWR_BackupAccessCmd(ENABLE);//使能RTC操作
RCC_LSEConfig(RCC_LSE_ON);//使用外部晶振
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET);//等待外部晶振准备好
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);//选择RTC时钟源  
SynchPrediv=0xFF;
AsynchPrediv=0x7F; 
RCC_RTCCLKCmd(ENABLE);//使能RTC时钟
RTC_WaitForSynchro();//等待RTC APB寄存器同步
 
    RTC_InitStructure.RTC_AsynchPrediv = AsynchPrediv;//RTC 异步除数 (<0X7F)
    RTC_InitStructure.RTC_SynchPrediv = SynchPrediv;//RTC 同步除数 (<0X7FFF)
    RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;//24小时制
    if(RTC_Init(&RTC_InitStructure) == ERROR)
    return 1;
RTC_TimeStructure.RTC_H12= RTC_H12_AM;
RTC_TimeStructure.RTC_Hours = tmp_hh;
RTC_TimeStructure.RTC_Minutes = tmp_mm;
RTC_TimeStructure.RTC_Seconds = tmp_ss;
if(RTC_SetTime(RTC_Format_BIN, &RTC_TimeStructure)!=ERROR)
RTC_WriteBackupRegister(RTC_BKP_DR0,0x32F2);    
  }
  else//已设置时间
  {   
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
   WR_BackupAccessCmd(ENABLE);//使能RTC操作
   RTC_WaitForSynchro();//等待RTC APB寄存器同步
   RTC_ClearFlag(RTC_FLAG_ALRAF);//清除RTC闹钟标志
   //EXTI_ClearITPendingBit(EXTI_Line17);//清除中断线17标志(内部连接至RTC闹钟)
   EXTI_ClearITPendingBit(EXTI_Line22);//清除中断线22标志(RTC Wakeup中断)
  }

RTC_WakeUpClockConfig(RTC_WakeUpClock_CK_SPRE_16bits);
RTC_SetWakeUpCounter(1);
RTC_ITConfig(RTC_IT_WUT, ENABLE);//使能闹钟A的中断
RTC_ClearFlag(RTC_FLAG_WUTF);
RTC_WakeUpCmd(ENABLE);
/* Configure Button EXTI line */
EXTI_InitStructure.EXTI_Line = EXTI_Line22;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

EXTI_ClearITPendingBit(EXTI_Line22);
  
return 0;
}

void EnableRTCWakeupIRQ(void)
{
NVIC_InitTypeDef NVIC_InitStructure;

NVIC_InitStructure.NVIC_IRQChannel = RTC_WKUP_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-4-2 13:01:36 | 显示全部楼层
你将这两句去掉看下(红色字体的注释掉),else里面没看到你使能秒唤醒中断语句?是不是439不用使能还是。。。
else//已设置时间
  {   
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
   PWR_BackupAccessCmd(ENABLE);//使能RTC操作
   RTC_WaitForSynchro();//等待RTC APB寄存器同步
            EnableRTCWakeupIRQ();   //使能唤醒中断                          <<<<<<<<<<<<<<<<<<<< 增加这句看下行不行
   RTC_ClearFlag(RTC_FLAG_ALRAF);//清除RTC闹钟标志
   //EXTI_ClearITPendingBit(EXTI_Line17);//清除中断线17标志(内部连接至RTC闹钟)
   EXTI_ClearITPendingBit(EXTI_Line22);//清除中断线22标志(RTC Wakeup中断)
  }

你的这个是中断服务函数怎么写的???


现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

21

主题

79

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2014-2-11
在线时间
0 小时
 楼主| 发表于 2014-4-2 13:08:02 | 显示全部楼层
回复【2楼】Badu_Space:
---------------------------------
唤醒中断是在调用了函数InitRTC时候再调用的,如下:

InitRTC();
EnableRTCWakeupIRQ();

中断服务程序如下:

void RTC_WKUP_IRQHandler(void)
{
TracePrintf("RTC_WKUP_IRQHandler ==> 0\n");
if(EXTI_GetITStatus(EXTI_Line22) != RESET)
{
TracePrintf("RTC_WKUP_IRQHandler ==> 1\n");
EXTI_ClearITPendingBit(EXTI_Line22);

if (RTC_GetFlagStatus(RTC_FLAG_WUTF))
{
TracePrintf("RTC_WKUP_IRQHandler ==> 2\n");
RTC_ClearFlag(RTC_FLAG_WUTF);

// do something other

}
}
}

现在发现根本就没进中断。
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-4-2 13:23:25 | 显示全部楼层
回复【3楼】fzhYou:
---------------------------------
建议你还是不要这样TracePrintf("RTC_WKUP_IRQHandler ==> 0\n");
尤其在中断服务函数里面,如果这个函数太占用时间的话,我上次就试过这样的,发现进不了中断
还是用个LED灯来指示靠谱很多,呵呵
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

21

主题

79

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2014-2-11
在线时间
0 小时
 楼主| 发表于 2014-4-2 14:56:05 | 显示全部楼层
回复【4楼】Badu_Space:
---------------------------------
你说得对啊,暂时先用一下,定位一下问题。
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-4-2 15:09:00 | 显示全部楼层
回复【5楼】fzhYou:
---------------------------------
呵呵
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

21

主题

79

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2014-2-11
在线时间
0 小时
 楼主| 发表于 2014-4-2 15:13:36 | 显示全部楼层
回复【6楼】Badu_Space:
---------------------------------
哈哈,找到问题的原因了,要把EXTI的触发改成上升沿。

EXTI_InitStructure.EXTI_Line = EXTI_Line22;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-4-2 15:14:01 | 显示全部楼层
回复【7楼】fzhYou:
---------------------------------
呵呵,恭喜恭喜
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

21

主题

79

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2014-2-11
在线时间
0 小时
 楼主| 发表于 2014-4-2 15:38:06 | 显示全部楼层
回复【8楼】Badu_Space:
---------------------------------
但是有一个新的问题

RTC_SetWakeUpCounter(3);

这个参数我不管设的多少,结果都是2秒钟中断一次,好奇怪!
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-4-2 15:43:08 | 显示全部楼层
回复【9楼】fzhYou:
---------------------------------
这个函数操作了什么寄存器,对应看下
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-3-25
在线时间
0 小时
发表于 2015-3-25 15:46:46 | 显示全部楼层
回复【9楼】fzhYou:
---------------------------------
在你的这段代码
        RTC_WakeUpClockConfig(RTC_WakeUpClock_CK_SPRE_16bits);
RTC_SetWakeUpCounter(1);
RTC_ITConfig(RTC_IT_WUT, ENABLE);//使能闹钟A的中断
RTC_ClearFlag(RTC_FLAG_WUTF);
RTC_WakeUpCmd(ENABLE);
前面加入
       RTC_WakeUpCmd(DISABLE);
数据手册上说明这些寄存器必须在关闭时才能配置修改
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-3-25
在线时间
0 小时
发表于 2015-3-25 15:47:47 | 显示全部楼层
回复【9楼】fzhYou:
---------------------------------
同时计数器设置为0:RTC_SetWakeUpCounter(0);
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 10:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表