OpenEdv-开源电子网

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

RTC_Set()函数执行不了

[复制链接]

10

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2012-2-21
在线时间
1 小时
发表于 2014-4-11 19:12:41 | 显示全部楼层 |阅读模式
在下面的函数中调用了一条RTC_Get()函数,此处的可以执行,整个程序都正常,但在main()函数中的RTC_Init()之后,再加一条RTC_Set(2014,4,11,20,1,1)函数,编译然后下载执行,结果整个程序就执行不了。不知什么原因,请大家帮帮忙,解答一下吧。
 u8 RTC_Init(void)
 {
 //检查是不是第一次配置时钟
 u8 temp=0;
 
 //if(BKP->DR1!=0X5050)//第一次配置
 if (BKP_ReadBackupRegister(BKP_DR1) != 0x5051)  //从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎
  {     
  /* Enable PWR and BKP clocks */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟  
  
  /* Allow access to BKP Domain */
  WR_BackupAccessCmd(ENABLE); //使能RTC和后备寄存器访问
  
  /* Reset Backup Domain */
  BKP_DeInit(); //将外设BKP的全部寄存器重设为缺省值  
  
  
  /* Enable LSE */
  RCC_LSEConfig(RCC_LSE_ON); //设置外部低速晶振(LSE),使用外设低速晶振
  /* Wait till LSE is ready */
  while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) //检查指定的RCC标志位设置与否,等待低速晶振就绪
   {
   temp++;
   delay_ms(10);
   }
  if(temp>=250)return 1;//初始化时钟失败,晶振有问题    
  /* Select LSE as RTC Clock Source */
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);  //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟   
  /* Enable RTC Clock */
  RCC_RTCCLKCmd(ENABLE); //使能RTC时钟 
  /* Wait for RTC registers synchronization */
  RTC_WaitForSynchro();  //等待最近一次对RTC寄存器的写操作完成
  /* Wait until last write operation on RTC registers has finished */
  RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
  /* Enable the RTC Second */
  RTC_ITConfig(RTC_IT_SEC, ENABLE);  //使能RTC秒中断
  /* Wait until last write operation on RTC registers has finished */
  RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
  /* Set RTC prescaler: set RTC period to 1sec */
  /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */
  RTC_SetPrescaler(32767); //设置RTC预分频的值
  /* Wait until last write operation on RTC registers has finished */
  RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
  RTC_Set(2014,4,11,18,54,55);  //设置时间  
  BKP_WriteBackupRegister(BKP_DR1, 0X5050); //向指定的后备寄存器中写入用户程序数据
  }
 else//系统继续计时
  {
  /* Check if the Power On Reset flag is set */
  if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET) //检查指定的RCC标志位设置与否OR/PDR复位
   {
   //printf("\rPower On Reset occurred....");
   }
  /* Check if the Pin Reset flag is set */
  else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET) //检查指定的RCC标志位设置与否:管脚复位
   {
   //printf("\rExternal Reset occurred....");
   }
  
  //printf("\rNo need to configure RTC....");
  /* Wait for RTC registers synchronization */
  RTC_WaitForSynchro(); //等待最近一次对RTC寄存器的写操作完成
  
  /* Enable the RTC Second */
  RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断
  /* Wait until last write operation on RTC registers has finished */
  RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
  }              
 RTC_Get();//更新时间
 
 /* Clear reset flags */
 RCC_ClearFlag(); //清除RCC的复位标志位
 
 return 0; //ok
 }
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165558
金钱
165558
注册时间
2010-12-1
在线时间
2118 小时
发表于 2014-4-12 00:05:34 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2012-2-21
在线时间
1 小时
 楼主| 发表于 2014-4-12 14:59:51 | 显示全部楼层
谢谢站长关心!今上传文件,请给我测试一下吧

test2.rar

1.36 MB, 下载次数: 69

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165558
金钱
165558
注册时间
2010-12-1
在线时间
2118 小时
发表于 2014-4-12 20:12:54 | 显示全部楼层
回复【3楼】ZXCZKY8181:
---------------------------------
代码木有问题,是你板子有问题。
RTC没起振吧。。。
你下载我们原版例程测试下。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2012-2-21
在线时间
1 小时
 楼主| 发表于 2014-4-13 11:20:19 | 显示全部楼层
代码是移植你们的代码。板子我有三块,可以用其他的试试。RTC没有起振吧,也不像,因为只要在main函数中删除RTC_Set(2014,4,12,10,1,1)语句就一切正常。你们的原版例程测试是对的,我上传的那个程序只要把main函数中的RTC_Set(2014,4,12,10,1,1)语句去掉就一切正常。就是想不通。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165558
金钱
165558
注册时间
2010-12-1
在线时间
2118 小时
发表于 2014-4-13 14:07:59 | 显示全部楼层
回复【5楼】ZXCZKY8181:
---------------------------------
我在战舰板硬件仿真,你的代码,可以执行过去的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2012-2-21
在线时间
1 小时
 楼主| 发表于 2014-4-27 19:34:38 | 显示全部楼层
问题找到了。
在站长的寄存器版的RTC_Ret()函数中有如下三句指令:“
//设置时钟
RCC->APB1ENR|=1<<28;//使能电源时钟
RCC->APB1ENR|=1<<27;//使能备份时钟
PWR->CR|=1<<8;    //取消备份区写保护
//上面三步是必须的!”
而在库函数版的RTC_Set()函数中没有以上三句的功能。把以下语句加上后,一切正常。

 /* Enable WR and BKP clocks */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟   
  
  /* Allow access to BKP Domain */
  WR_BackupAccessCmd(ENABLE); //使能RTC和后备寄存器访问
回复 支持 反对

使用道具 举报

6

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2016-12-13
在线时间
42 小时
发表于 2017-2-23 12:33:08 | 显示全部楼层
支持,刚也遇到RTC_Ret()无法执行的问题。解决
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-23 23:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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