32单片机按键上拉电阻和rtc如何通过单片机按键上拉电阻上的按键来调整时间

ATmega8单片机万年历C程序(内部RTC)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
ATmega8单片机万年历C程序(内部RTC)
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩12页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢查看: 929|回复: 10
请教下stm32L15xx 系列的单片机可否使用rtc唤醒
请教下stm32L15xx 系列的单片机可否使用rtc来自动唤醒 单片机后又进入休眠或者停机模式,如此反复 ??
100%可以!
100%可以!
OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK,&&
绝对是没问题的,只是如何实现的问题,我也正在调试中
绝对是没问题的,只是如何实现的问题,我也正在调试中
你好,你的调好了没有啊
你好,你的调好了没有啊
没有哦,遇到了问题
没有哦,遇到了问题
遇到时间不准的问题,现在解决了
遇到时间不准的问题,现在解决了
时间不准是什么情况造成的啊 ?
时间不准是什么情况造成的啊 ?
RTC唤醒时钟配置
RTC唤醒时钟配置
你好,我这边的项目也用到RTC唤醒,不过测试过停止模式下,RTC跑LSI时钟,设置1秒中断一次,感觉它跑的时间不准,比实际时间快很多。。
LSI是37KHz,设置异步分频37,同步分频1000,理论上分出的RTC频率就1Hz了,但还是比实际时间快..
阿莫电子论坛, 原"中国电子开发网"> STM32F单片机的RTC校准功能介绍STM32F单片机的RTC校准功能介绍已有 445005个资源编辑推荐相关资源下载专区上传者其他资源嵌入式处理器热门资源本周本月全部文档信息资源大小:71.11KB上 传 者: () 上传日期:资源类型:应用文档资源积分:1分评
论:下载次数:2参与讨论:标&&&&签:分&&&&享:下载资源需要,并消耗一定的积分文档简介在STM32里面有备份寄存器(BKP),它的功能之一就是用来存储RTC校验值的校验寄存器,即具有RTC校准功能。在PC13引脚上输出RTC校准时钟,RTC闹钟或者秒脉冲。在程序中有#define&RTCClockOutput_Enable&/*RTC&Clock/64&is&output&on&tamper&pin(PC.13)*/
BKP可以用来存储84个字节的用户应用程序数据,他们处在备份域里,当Vdd电源被切断时,他们仍然由Vbat维持供电。
判断RTC后备寄存器1的值是否为事先写入的某个值,如果不是,则说明RTC是第一次上电,需要配置RTC。针对BKP也有相应的库函数。
u16&BKP_ReadBackupRegister(u16&BKP_DR)&从指定的后备寄存器中读出数据
如果不是之前写入的某个值,需要配置RTC,函数RTC_Configuration(void)
执行以下操作将使能对后备寄存器和RTC的访问:
1,设置寄存器RCC_APB1ENR的PWREN&和BKPEN位,使能电源和后备接口时钟
2,设置寄存器PWR_CR的DBP位,使能对后备寄存器和RTC的访问。
相对应的程序:
1.RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR&|&RCC_APB1Periph_BKP,&ENABLE);//对应操作1
2.PWR_BackupAccessCmd(ENABLE);//对应操作2
RTC模块用外部LSE时钟--32.768的晶振作为时钟,由寄存器控制启动和关闭,然后等待状态稳定后,寄存器指示LSE晶振振荡器是否稳定。
1.RCC_LSEConfig(RCC_LSE_ON);//使能LSE
2./*&等待外部晶振震荡稳定输出&*/
3.while&(RCC_GetFlagStatus(RCC_FLAG_LSERDY)&==&RESET)
待LSE状态稳定后,使用外部32.768KHz晶振作为RTC时钟,由库函数RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE)实现:
1.RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);&//使用LSE作为RTC时钟
2.RCC_RTCCLKCmd(ENABLE);&//使能RTC,只有在通过RCC_RTCCLKConfig选择RTC时钟后,才能调用
1.RTC_WaitForSynchro();//等待RTC寄存器与APB时钟同步??
2./*&Wait&until&last&write&operation&on&RTC&registers&has&finished&*/
3.RTC_WaitForLastTask();
4./*&使能RTC的秒中断&*/
5.RTC_ITConfig(RTC_IT_SEC,&ENABLE);//在使能中断前,必须调用RTC_WaitForLastTask();
1.RTC_SetPrescaler(32767);//设置RTC的预分频值
RTC_WaitForLastTask(&)的作用:软件通过APB1接口访问RTC的预分频值、计数器值等,但是,相关的可读寄存器只在与RTC&APB1时钟进行重新同步的RTC时钟的上升沿被更新。RTC标志也是如此。这意味着如果APB1接口曾经被关闭,而读操作又是在刚刚重新开启APB1之&后,则在第一次的内部寄存器更新之前,从APB1上读出的RTC寄存器数值可能已经被破坏了。因此,若在读取RTC寄存器时,RTC的APB1接口曾经处&于禁止状态,则软件必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置‘1’。
在RTC读取的数据是之前写入到BKP中的数据,那么会调用函数RCC_GetFlagStatus()读取状态/控制寄存器RCC_CSR中的某些位来判断启动后的状态,判断掉电/上电复位标志或者复位标志,如果相应的标志位为1,则不需要从新配置RTC。
最后清除RCC的复位标志位,void&RCC_ClearFlag(void)
在设置了秒中断后,在stm32f10x_it.c中设置了中断处理函数,中断函数中首先需要判断是否发生了秒中断,如果是,需要清除相应的中断标志位。还有一个重要的情况是在时间达到23:59:59时,则下一时刻时间为00:00:00。
1.if&(RTC_GetCounter()&==&0x)&//获取RTC计数器的值
2.RTC_SetCounter(0x0);//设置RTC计数器的值
通过读取RTC计数器的值,可以将其转化为时:分:秒的形式打印出来。&同时,如果RTC是第一次被配置,用户需要输入时间,然后调用Time_Adjust(&)将用户输入的时间转化到RTC计数值写到相应的寄存器中。相关帖子FAQ&&&&Q.为什么我点的下载下不了,但积分却被扣了A.由于下载人数众多,下载服务器做了并发的限制。若发现下载不了,请稍后再试,多次下载是不会重复扣分的。Q.我已经登录过账号,为什么还一直提示要求登录A.出现这种情况是浏览器缓存问题,建议清理浏览器缓存后重启浏览器重新登录下载资源意味着您已经同意遵守以下协议1. 资源的所有权益归上传用户所有2. 未经权益所有人同意,不得将资源中的内容挪作商业或盈利用途3. EEWORLD下载频道仅提供交流平台,并不能对任何下载资源负责4. 下载资源中如有侵权或不适当内容,请5. 本站不保证本站提供的资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。大学堂最新课程若举报审核通过,可奖励2下载分举报人:被举报人:Timson举报的资源分:1* 类型:请选择类型资源无法下载资源分类不正确资源无法使用标题与实际内容不符含有危害国家安全内容含有反动色情等内容含广告内容版权问题,侵犯个人或公司的版权其他* 详细原因:回到顶部EEWORLD下载中心所有资源均来自网友分享,如有侵权,请发送举报邮件到客服邮箱bbs_.cn 或通过站内短信息或QQ:联系管理员 高员外,我们会尽快处理。查看: 359|回复: 1
基于stm32MINI的RTC实时闹钟程序 按键+2个闹钟+触屏
基于stm32MINI的RTC实时闹钟,闹钟值可调,到时间屏幕闪烁
& & 学习STM32自带RTC的使用
& & 1,DS0(连接在PA8)
& & 2,串口1(波特率:9600,PA9/PA10连接在板载USB转串口芯片CH340上面)
& & 3,ALIENTEK 2.8/3.5/4.3/7寸TFTLCD模块(通过GPIO驱动,连接关系见lcd.h)
& & 4,RTC(实时时钟)
& & 本实验通过TFTLCD显示RTC时间,并可以通过usmart设置RTC时间,从而调节时间,以便大家验证
& & RTC功能。
注意事项:&&
& & 1,4.3寸和7寸屏需要比较大电流,USB供电可能不足,请用外部电源供电(5V电源,接VOUT2即可).
& & 2,本例程在LCD_Init函数里面(在ILI93xx.c),用到了printf,如果不初始化串口1,将导致液晶无法显示!!
& & 3,LCD模块在开发板的LCD接口上面,必须靠右插
& & 3,串口波特率为9600
单片机源程序如下:
#include &led.h&
#include &delay.h&
#include &sys.h&
#include &usart.h&
#include &lcd.h&
#include &usmart.h&
#include &rtc.h&
#include &timer.h&
#include &key.h&
#include &24cxx.h&
#include &myiic.h&
#include &touch.h&
//ALIENTEK Mini STM32开发板范例代码13
//RTC实时时钟实验&&
_calendar_obj calendar_& & & &&&//存放设置完成时的值
&&_alarm_obj alarm_& & & &&&//存放设置完成时的值
int main(void)
& & & & u8 t=0;& & & &
& & & & u8 t1=0;
& & & & u8 temp=0;
& & & & u8 move=0;& & & &&&//move为移动的偏移量
&&NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
& & & & delay_init();& & & && &&&& & & &&&//延时函数初始化& & & && &
& & & & uart_init(9600);& & & &&&& & & & //串口初始化为9600
& & & & LED_Init();& & & & & & & & & & & & & & & & //初始化与LED连接的硬件接口
& & & & LCD_Init();& & & & & & & & & & & & & & & & //初始化LCD
& & & & KEY_Init();
& & & & TIM2_Init(799,89);
& & & & TIM3_Init(799,89);
& & & & usmart_dev.init(72);& & & & //初始化USMART
& & & & tp_dev.init();& & & & & & & & & & & & //触摸屏初始
& & & & POINT_COLOR=RED;//设置字体为红色 & & & &
& & & & while(RTC_Init())& & & & & & & & //RTC初始化& & & & ,一定要初始化成功
& & & & {
& & & & & & & & LCD_ShowString(60,130,200,16,16,&RTC ERROR!& &&);& & & &
& & & & & & & & delay_ms(800);
& & & & & & & & LCD_ShowString(60,130,200,16,16,&RTC Trying...&);& & & &
& & & & }& & & & & & & && &&&& & & & & & & & & & & & & & & & & & & & & & & &
& & & & //显示时间
& & & & POINT_COLOR=BLUE;//设置字体为蓝色& & & & & & & & & & & & & & & & & & & &&&
& & & & LCD_ShowString(0,10,200,24,24,&&&Date& &&&&);& & & &&&
& & & & LCD_ShowString(0,45,200,24,24,&& && && &-& &- &);& & & &
& & & & LCD_ShowString(0,80,200,24,24,&&&Week& &&&&);& & & && &
& & & & LCD_ShowString(0,150,200,24,24,&&&Time& &&&&);& & & &
& & & & LCD_ShowString(0,185,200,24,24,&& && &&&:& &:& & &);& & & &&&
& & & & LCD_ShowString(0,220,200,24,24,&&&Alarm time&);& & & & //按键调整时间& & & &
&&LCD_ShowString(0,255,200,24,24,&& && &&&:& &:&&&);& & & &
& & & & LCD_ShowString(0,280,200,24,24,&& && &&&:& &:&&&);& & & &
& & & & while(1)
& & & & {& & & &
& & t1=& & & & & & & &
& & & & & & & & & & & & & & & & if(TIMChange1&(0x01&&7))& & & & & & & && &//每5ms读一次键值
& & & & & & & & {
& & & & & & & & & & & & TIMChange1&=(~(0x01&&7));
& & & && &&&tp_dev.scan(0);
& & & & & & & & & & & & & & & & & & & & if(tp_dev.sta&TP_PRES_DOWN)& & & & & & & & & & & & //触摸屏被按下
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & delay_ms(100);
& & & & & & & & & & & & & & & & if(tp_dev.x[0]&lcddev.width&&tp_dev.y[0]&lcddev.height)
& & & & & & & & & & & & {& & & &
& & & & & & & & & & & & & & & & & & & & if(tp_dev.x[0]&(lcddev.width-230)&&tp_dev.y[0]&290)
&&& & & & & & & & & & & &&&Press_KEY_SUB(move);& & & & //数值减(下键)
& & & & & & & & & & & & }
& & & & & & & & & & & & }
& & & & & & & & }
& & & & & & & & if(TIMChange&(0x01&&6))& & & & & & & && &//每5ms读一次键值
& & & & & & & & {
& & & & & & & & & & & & TIMChange&=(~(0x01&&6));
& & & & & & & & & & & & temp=KEY_Scan(0);& & & & & & & && &//读键值,按移动键(右键)时不支持连按
& & & & & & & & & & & & if(temp==KEY_MOVE)
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & if(move==12) move=1;& & & && &//偏移量循环
& & & & & & & & & & & & & & & & else move++;& & & & & & & && &//移动偏移量加一
& & & & & & & & & & & & & & & & timcnt=0; & & & & & & & & & & & && &//移动一次就把闪烁计数值复位
& & & & & & & & & & & & }
& & & & & & & & & & & & if(move) & & & & & & & & & & & & & & & && &//处于时间设置模式中
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & Press_KEY_MOVE(move); //调用子程序,进行闪烁和移动处理
& & & & & & & & & & & & & & & & RTC_ITConfig(RTC_IT_SEC, DISABLE);& & & & // 关闭RTC 秒中断
& & & & & & & & & & & & }
& & & & & & & & & & & & if(temp==KEY_ADD)Press_KEY_ADD(move); & & & & //按数值加键(上键),数值加一,不支持连按
& & & & & & & & & & & & //if(temp==KEY_SUB)Press_KEY_SUB(move);& & & & //数值减(下键),支持连按
& & & & & & & & & & & & & & & & & & & & if(temp==KEY_SURE&&move) & & & & & & & & & & & & & & & & & & & & & & & & //确定键(左键)
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & move=0;& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //move复位
& & & & & & & & & & & & & & & & calendar_buf=& & & & & & & & & & & & & & & & //把设置完的值放入缓冲区
& & & & & & & & & & & & & & & & alarm_buf=& & & & & & & & & & & & & & & & //把设置完的值放入缓冲区
& & & & & & & & & & & & & & & & RTC_ITConfig(RTC_IT_SEC, ENABLE);& &//使能 RTC 秒中断
& & & & & & & & & & & & & & & & delay_ms(1);& & & & & & & & & & & & & & & & & & & & & & & & //关闭秒中断时,RTC还是在走的,开启秒中断后要延时一段时间,把旧值覆盖掉
& & & & & & & & & & & & & & & & calendar=calendar_& & & & & & & & & & & & & & & & //用设置后的值覆盖旧值
& & & & & & & & & & & & & & & & alarm=alarm_& & & & & & & & & & & & & & & & //用设置后的值覆盖旧值
& & & & & & & & & & & & & & & & RTC_Set(calendar.year,calendar.month,calendar.date,calendar.hour,calendar.min,calendar.sec);//写入新值
& & & & & & & & & & & & & & & & Set_Alarm(calendar.year,calendar.month,calendar.date,alarm.hour1,alarm.min1,alarm.sec1,alarm.hour2,alarm.min2,alarm.sec2);//写入新值
& & & & & & & & & & & & }& & & &
& & & & & & & & & & & & if((t!=calendar.sec&&move==0)||t1!=move) //秒更新或者按下移位键,显示时间
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & t=calendar.
& & & & & & & & & & & & & & & & POINT_COLOR=BLUE;
& & & & & & & & & & & & & & & & LCD_ShowNum(55,45,calendar.year,4,24);& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & && &
& & & & & & & & & & & & & & & & LCD_ShowNum(125,45,calendar.month,2,24);& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & && &
& & & & & & & & & & & & & & & & LCD_ShowNum(180,45,calendar.date,2,24);& & & & & & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & switch(calendar.week)
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & case 0:
& & & & & & & & & & & & & & & & & & & & & & & & LCD_ShowString(60,115,200,24,24,&Sunday& &&);
& & & & & & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & & case 1:
& & & & & & & & & & & & & & & & & & & & & & & & LCD_ShowString(60,115,200,24,24,&Monday& &&);
& & & & & & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & & case 2:
& & & & & & & & & & & & & & & & & & & & & & & & LCD_ShowString(60,115,200,24,24,&Tuesday&&&);
& & & & & & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & & case 3:
& & & & & & & & & & & & & & & & & & & & & & & & LCD_ShowString(60,115,200,24,24,&Wednesday&);
& & & & & & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & & case 4:
& & & & & & & & & & & & & & & & & & & & & & & & LCD_ShowString(60,115,200,24,24,&Thursday &);
& & & & & & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & & case 5:
& & & & & & & & & & & & & & & & & & & & & & & & LCD_ShowString(60,115,200,24,24,&Friday& &&);
& & & & & & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & & case 6:
& & & & & & & & & & & & & & & & & & & & & & & & LCD_ShowString(60,115,200,24,24,&Saturday &);
& & & & & & & & & & & & & & & & & & & & & & & &&&
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
(5.17 MB, 下载次数: 8)
10:43 上传
点击文件名下载附件
下载积分: 黑币 -5
Powered bySTM32的RTC为什么不能重新配置时间 - 单片机/MCU论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
STM32的RTC为什么不能重新配置时间
12:48:18  
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(,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:资料里给的时间是号,我想设置成自己的时间,但是不知道怎么改。上面我试了一下,没用。哪里出问题
问题2:RTC_Set()这个函数说是把所有的秒加起来,然后在得到年月日。但是我却没有看到变量来传递,难道是放在寄存器里面了。
00:38:48  
官方有一个例程,你找找,也是关于万年历的,写的挺详细的我自己的程序就是用它改进的,仔细找找,楼主会有收获的
在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();
& & //启用PWR和BKP的时钟(from APB1)
& & RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
& & //后备域解锁
& & PWR_BackupAccessCmd(ENABLE);
Powered by
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司

我要回帖

更多关于 单片机rtc时钟 的文章

 

随机推荐