1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
u8 RTC_Init(void)
{ //检查是不是第一次配置时钟 u8 temp=0; RTC_NVIC_Config(); BKP->DR1=0Xa5a5;//??这个地方是不是要重置,这句是我加的 ,但是没用 if(BKP->DR1!=0X5050)//第一次配置 {if (BKP_ReadBackupRegister(BKP_DR1) != 0x5a5a) //从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎 { RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟 PWR_BackupAccessCmd(ENABLE); //使能RTC和后备寄存器访问 BKP_DeInit(); //将外设BKP的全部寄存器重设为缺省值 RCC_LSEConfig(RCC_LSE_ON); //设置外部低速晶振(LSE),使用外设低速晶振 while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) //检查指定的RCC标志位设置与否,等待低速晶振就绪 { temp++; delay_ms(10); } if(temp>=250)return 1;//初始化时钟失败,晶振有问题 RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟 RCC_RTCCLKCmd(ENABLE); //使能RTC时钟 RTC_WaitForSynchro(); //等待最近一次对RTC寄存器的写操作完成 RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成 RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断 RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成 RTC_SetPrescaler(32767); //设置RTC预分频的值 RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成 Auto_time_Set(); RTC_Set(2014,12,2,10,0,55); //设置时间 BKP_WriteBackupRegister(BKP_DR1, 0x0000); //向指定的后备寄存器中写入用户程序数据 } } else//系统继续计时 { RTC_WaitForSynchro(); //等待最近一次对RTC寄存器的写操作完成 RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断 RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成 } RTC_Get();//更新时间 RCC_ClearFlag(); //清除RCC的复位标志位 return 0; //ok } 问题1:资料里给的时间是2004-13-30号,我想设置成自己的时间,但是不知道怎么改。上面我试了一下,没用。哪里出问题 问题2:RTC_Set()这个函数说是把所有的秒加起来,然后在得到年月日。但是我却没有看到变量来传递,难道是放在寄存器里面了。 |
|
相关推荐
3个回答
|
|
官方有一个例程,你找找,也是关于万年历的,写的挺详细的我自己的程序就是用它改进的,仔细找找,楼主会有收获的
在RTC初始化程序中,我们一般要查看BKP寄存器中的数据,判断后备电源是否掉电过。 如果掉电过,则初始化。没有在不执行。 但要设置时钟的话,必需允许PWR和BKP时钟,并允许读取BKP。 而如果仅电源掉电而后备电池不掉电的话,PWR和BKP时钟是没有开放的。 这样就等不到RTC指令执行完成的标志,停在那了。 解决方法就是在RTC初始化中判断判断掉电标志位的else分支中加入 //启用PWR和BKP的时钟(from APB1) RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //后备域解锁 PWR_BackupAccessCmd(ENABLE); 即 if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5) { //重新配置RTC RTC_Configuration(); ... ... } else { //启用PWR和BKP的时钟(from APB1) RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //后备域解锁 PWR_BackupAccessCmd(ENABLE); ... ... } |
|
|
|
要给后备寄存器写入一个值,以此判断RTC是否为第一次执行,在后备寄存器写入数据后,不更改此数据,只更改RTC计数器的值,是不会进入if条件语句的,即并没有更改RTC计数器初值。
要更改初值,必须重新设置后备寄存器的值,才能将新值写入RTC计数器。 void clockinit_RTC() { RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP|RCC_APB1Periph_PWR,ENABLE); PWR_BackupAccessCmd(ENABLE); if(BKP_ReadBackupRegister(BKP_DR1)!=0XA5A6)//从指定的后备寄存器读取数据,此数据是判断是否写入RTC寄存器初值的标志 { rtc_init(); //RTC初始化 RTC_WaitForLastTask();//等待最后一次写操作完成 RTC_SetCounter(0xee98);//给RTC计数器赋初值 RTC_WaitForLastTask(); BKP_WriteBackupRegister(BKP_DR1,0xA5A6); //0xA5A6标志值 } else { RTC_WaitForSynchro(); RTC_WaitForLastTask(); RTC_ITConfig(RTC_IT_SEC,ENABLE); RTC_WaitForLastTask(); } |
|
|
|
BKP_ReadBackupRegister(BKP_DR1) != 0x5050 0x5050是个标志值 当等于0x5050时意味着rtc已经初始化或者未初始化 0x5050可以自己设定
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
205 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1253 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
848 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
853 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1073 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12013 浏览 31 评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 06:04 , Processed in 2.142209 second(s), Total 74, Slave 57 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号