临沂专业做网站,wordpress汉化包,如何整合wordpress博客,凯里网站建设gzklyy实时时钟RTC是一个独立的定时器。RTC模块拥有一个连续计数的计数器#xff0c;在软件配置下#xff0c;可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期 RTC还包含用于管理低功耗模式的自动唤醒单元。 在掉电情况下 RTC仍可以独立运行 只要芯片的备用电源…实时时钟RTC是一个独立的定时器。RTC模块拥有一个连续计数的计数器在软件配置下可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期 RTC还包含用于管理低功耗模式的自动唤醒单元。 在掉电情况下 RTC仍可以独立运行 只要芯片的备用电源一直供电,RTC上的时间会一直走。相对于通用定时器TIM 外设它十分简单只有很纯粹的计时和触发中断的功能但从掉电还继续运行的角度来说它却是32 中唯一一个具有如此强大功能的外设。所以RTC外设的复杂之处并不在于它的定时功能而在于它掉电还继续运行的特性。 以上所说的掉电是指主电源VDD 断开的情况为了RTC 外设掉电继续运行必须接上锂电池给STM32 的RTC、备份发卡通过VBAT 引脚供电。当主电源VDD 有效时由VDD 给RTC 外设供电而当VDD 掉电后由VBAT 给RTC 外设供电。但无论由什么电源供电RTC 中的数据都保存在属于RTC 的备份域中若主电源VDD 和VBAT 都掉电那么备份域中保存的所有数据将丢失。备份域除了RTC 模块的寄存器还有42 个16 位的寄存器可以在VDD 掉电的情况下保存用户程序的数据系统复位或电源复位时这些数据也不会被复位。 RCT特征
● 可编程的预分频系数分频系数高为220。
● 32位的可编程计数器可用于较长时间段的测量。
● 2个分离的时钟用于APB1接口的PCLK1和RTC时钟(RTC时钟的频率必须小于PCLK1时钟 频率的四分之一以上)。 可以选择以下三种RTC的时钟源
● HSE时钟除以128
● LSE振荡器时钟
● LSI振荡器时钟 2个独立的复位类型
● APB1接口由系统复位
● RTC核心(预分频器、闹钟、计数器和分频器)只能由后备域复位 3个专门的可屏蔽中断
● 1.闹钟中断用来产生一个软件可编程的闹钟中断。
● 2.秒中断用来产生一个可编程的周期性中断信号(长可达1秒)。
● 3.溢出中断指示内部可编程计数器溢出并回转为0的状态。 结构框图 UNIX时间戳
由于RTC_CNT是32位寄存器可存储的最大值为2^32-1即这样计时它将在136年时溢出。假如某个时刻读取到计数器的数值为X 606024*2即两天时间的秒数而假设又知道计数器是在2011 年1 月1 日的0 时0 分0 秒置0 的那么就可以根据计数器的这个相对时间数值计算得这个X 时刻是2011 年1 月3 日的0 时0 分0 秒了。而计数器则会在(2011136) 年左右溢出也就是说到了2011136年时如果我们还在使用这个计数器提供时间的话就会出现问题。在这个例子中定时器被置0 的这个时间被称为计时元年相对计时元年经过的秒数称为时间戳也就是计数器中的值。 大多数操作系统都是利用时间戳和计时元年来计算当前时间的而这个时间戳和计时元年大家都取了同一个标准——UNIX 时间戳和UNIX 计时元年。UNIX 计时元年被设置为格林威治时间1970 年1 月1 日0 时0 分0 秒大概是为了纪念UNIX 的诞生的时代吧而UNIX 时间戳即为当前时间相对于UNIX 计时元年经过的秒数。因为unix 时间戳主要用来表示当前时间或者和电脑有关的日志时间如文件创立时间log 发生时间等考虑到所有电脑文件不可能在1970 年前创立所以用unix 时间戳很少用来表示1970 前的时间。在这个计时系统中使用的是有符号的32 位整型变量来保存UNIX 时间戳的即实际可用计数位数比我们上面例子中的少了一位少了这一位UNIX 计时元年也相对提前了这个计时方法在2038 年1 月19 日03 时14 分07 秒将会发生溢出这个时间离我们并不远。由于UNIX 时间戳被广泛应用到各种系统中溢出可能会导致系统发生严重错误届时很可能会重演一次“千年虫”的问题所以在设计预期寿命较长的设备需要注意。 BKP备份寄存器 1备份寄存器是42个16位的寄存器。可用来存储84个字节数据。2它们处在备份区域,当VDD电源切断,仍然由Vear维持供 电。 3当系统在待机模式下被唤醒,或者系统复位或者电源复位,它们也 不会复位。 4执行以下操作将使能对后备寄存器和 RTC 访问: 设置寄存器RCC APB1ENR的 PWREN 和 BKPEN位,使能电源和后备时钟。 设置寄存器 PWR CR的 DBP位使能对 RTC和后备寄存器的访问。
一共有 42 个 16 位备份寄存器。常用来保存一些系统配置信息和相关标志位。 RTC相关寄存器 1 、RTC控制寄存器(RTC_CRH,RTC_CRL) 2、 RTC预分频装载寄存器(RTC_ PRLH, RTC_PRLL) 3、RTC预分频余数寄存器(RTC_ DIVH,RTC_DIVL)
4、RTC计数器寄存器(RTC_CNTH,RTC_CNTL) 5、RTC闹钟寄存器(RTC_ALRH, RTC_ALRL) RTC控制寄存器
① 修改 CRH/CRL 寄存器必须先判断 RSF 位确定已经同步。 ② 修改 CNT,ALR,PRL的时候必须先配置CNF 位进入配置模式修改完之后设置 CNF位为 0 退出配置模式 ③ 同时在对 RTC 相关寄存器写操作之前必须判断上一次写操作已经结束也就是判断 RTOFF 位是否置位。
配置RTC寄存器 必须设置RTC_CRL寄存器中的CNF位使RTC进入配置模式后才能写入RTC_PRRTC_CNT、RTC_ALR寄存器。 另外对RTC任何寄存器的写操作都必须在前一次写操作结束后进行。可以通过查询!RTC_CR寄存器中的RTOFF状态位判断RTC寄存器是否处于更新中。仅当RTOFF状态位是11!时才可以写入RTC寄存器。 配置过程: 1查询RTOFF位直到RTOFF的值变为1’2.置CNF值为1进入配置模式 3对一个或多个RTC寄存器进行写操作4清除CNF标志位退出配置模式 5查询RTOFF直至RTOFF位变为1以确认写操作已经完成。 仅当CNF标志位被清除时写操作才能进行这个过程至少需要3个RTCCLK周期。
读RTC寄存器 RTC核完全独立于RTC APB1接口。 软件通过APB1接口访问RTC的预分频值、计数器值和闹钟值。但是相关的可读寄存器只在与RTC APB1时钟进行重新同步的RTC时钟的上升沿被更新。RTC标志也是如此的。 这意味着如果APB1接口曾经被关闭而读操作又是在刚刚重新开启APB1之后则在第一次的内部寄存器更新之前从APB1上读出的RTC寄存器数值可能被破坏了(通常读到0)。下述几种情况下能够发生这种情形: 发生系统复位或电源复位 系统刚从待机模式唤醒(参见第4.3节:低功耗模式)。系统刚从停机模式唤醒(参见第4.3节:低功耗模式)。 所有以上情况中APB1接口被禁止时(复位、无时钟或断电)RTC核仍保持运行状态。因此若在读取RTC寄存器时RTC的APB1接口曾经处于禁止状态则软件首先必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1。 RTC 配置一般步骤 1、使能 PWR 和 BKP 时钟 2、使能后备寄存器访问
3、配置RTC时钟源使能RTC时钟如果使用: LSE,要打开
4、设置RTC 预分频系数 5、设置时间 6、开启相关中断如果需要)
7、编写中断服务函数
8、部分操作要等待写操作完成和同步。 等待最近一次对RTC寄存器的写操作完成等待RTC 寄存器同步
RTC的时间和闹钟寄存器都是以秒钟为计数单位的所以要把时间换算成秒钟获取时间需要把秒钟转换成日期。 判断是否是闰年 u8 Is_Leap_Year(u16 year) { if(year%40) //必须能被4整除 { if(year%1000) { if(year%4000)return 1;//如果以00结尾,还要能被400整除 else return 0; }else return 1; }else return 0; } 设置时间 u8 const table_week[12]{0,3,3,6,1,4,6,2,5,0,3,5}; const u8 mon_table[12]{31,28,31,30,31,30,31,31,30,31,30,31}; u8 RTC_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec) { u16 t; u32 seccount0; if(syear1970||syear2099)return 1; for(t1970;tsyear;t) //把所有年份的秒钟相加 { if(Is_Leap_Year(t))seccount31622400;//闰年的秒钟数 else seccount31536000; //平年的秒钟数 } smon-1; for(t0;tsmon;t) //把前面月份的秒钟数相加 { seccount(u32)mon_table[t]*86400;//月份秒钟数相加 if(Is_Leap_Year(syear)t1)seccount86400;//闰年2月份增加一天的秒钟数 } seccount(u32)(sday-1)*86400;//把前面日期的秒钟数相加 seccount(u32)hour*3600;//小时秒钟数 seccount(u32)min*60; //分钟秒钟数 seccountsec;//最后的秒钟加上去 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟 PWR_BackupAccessCmd(ENABLE); //使能RTC和后备寄存器访问 RTC_SetCounter(seccount); //设置RTC计数器的值 RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成 return 0; } 设置闹钟 u8 RTC_Alarm_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec) { u16 t; u32 seccount0; if(syear1970||syear2099)return 1; for(t1970;tsyear;t) //把所有年份的秒钟相加 { if(Is_Leap_Year(t))seccount31622400;//闰年的秒钟数 else seccount31536000; //平年的秒钟数 } smon-1; for(t0;tsmon;t) //把前面月份的秒钟数相加 { seccount(u32)mon_table[t]*86400;//月份秒钟数相加 if(Is_Leap_Year(syear)t1)seccount86400;//闰年2月份增加一天的秒钟数 } seccount(u32)(sday-1)*86400;//把前面日期的秒钟数相加 seccount(u32)hour*3600;//小时秒钟数 seccount(u32)min*60; //分钟秒钟数 seccountsec;//最后的秒钟加上去 //设置时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟 PWR_BackupAccessCmd(ENABLE); //使能后备寄存器访问 //上面三步是必须的! RTC_SetAlarm(seccount); RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成 return 0; } 获取时间 u8 RTC_Get(void) { static u16 daycnt0; u32 timecount0; u32 temp0; u16 temp10; timecountRTC_GetCounter(); temptimecount/86400; //得到天数(秒钟数对应的) if(daycnt!temp)//超过一天了 { daycnttemp; temp11970; //从1970年开始 while(temp365) { if(Is_Leap_Year(temp1))//是闰年 { if(temp366)temp-366;//闰年的秒钟数 else {temp1;break;} } else temp-365; //平年 temp1; } calendar.w_yeartemp1;//得到年份 temp10; while(temp28)//超过了一个月 { if(Is_Leap_Year(calendar.w_year)temp11)//当年是不是闰年/2月份 { if(temp29)temp-29;//闰年的秒钟数 else break; } else { if(tempmon_table[temp1])temp-mon_table[temp1];//平年 else break; } temp1; } calendar.w_monthtemp11; //得到月份 calendar.w_datetemp1; //得到日期 } temptimecount%86400; //得到秒钟数 calendar.hourtemp/3600; //小时 calendar.min(temp%3600)/60; //分钟 calendar.sec(temp%3600)%60; //秒钟 calendar.weekRTC_Get_Week(calendar.w_year,calendar.w_month,calendar.w_date);// 获取星期 return 0; } 获取星期 u8 RTC_Get_Week(u16 year,u8 month,u8 day) { u16 temp2; u8 yearH,yearL; yearHyear/100; yearLyear%100; // 如果为21世纪,年份数加100 if (yearH19)yearL100; // 所过闰年数只算1900年之后的 temp2yearLyearL/4; temp2temp2%7; temp2temp2daytable_week[month-1]; if (yearL%40month3)temp2--; return(temp2%7); } 文章转载自: http://www.morning.pfntr.cn.gov.cn.pfntr.cn http://www.morning.qnzpg.cn.gov.cn.qnzpg.cn http://www.morning.ndmbz.cn.gov.cn.ndmbz.cn http://www.morning.lwbhw.cn.gov.cn.lwbhw.cn http://www.morning.dqcpm.cn.gov.cn.dqcpm.cn http://www.morning.nspzy.cn.gov.cn.nspzy.cn http://www.morning.fglxh.cn.gov.cn.fglxh.cn http://www.morning.fzlk.cn.gov.cn.fzlk.cn http://www.morning.qbxdt.cn.gov.cn.qbxdt.cn http://www.morning.pghfy.cn.gov.cn.pghfy.cn http://www.morning.zzjpy.cn.gov.cn.zzjpy.cn http://www.morning.rsqpc.cn.gov.cn.rsqpc.cn http://www.morning.fywqr.cn.gov.cn.fywqr.cn http://www.morning.hwtb.cn.gov.cn.hwtb.cn http://www.morning.fwkjp.cn.gov.cn.fwkjp.cn http://www.morning.gjlxn.cn.gov.cn.gjlxn.cn http://www.morning.fkmyq.cn.gov.cn.fkmyq.cn http://www.morning.hfbtt.cn.gov.cn.hfbtt.cn http://www.morning.rzmzm.cn.gov.cn.rzmzm.cn http://www.morning.shinezoneserver.com.gov.cn.shinezoneserver.com http://www.morning.sqqkr.cn.gov.cn.sqqkr.cn http://www.morning.rbqlw.cn.gov.cn.rbqlw.cn http://www.morning.thxfn.cn.gov.cn.thxfn.cn http://www.morning.jzfrl.cn.gov.cn.jzfrl.cn http://www.morning.fpqsd.cn.gov.cn.fpqsd.cn http://www.morning.lgnz.cn.gov.cn.lgnz.cn http://www.morning.nyqzz.cn.gov.cn.nyqzz.cn http://www.morning.tnkwj.cn.gov.cn.tnkwj.cn http://www.morning.trsmb.cn.gov.cn.trsmb.cn http://www.morning.czxrg.cn.gov.cn.czxrg.cn http://www.morning.zqkms.cn.gov.cn.zqkms.cn http://www.morning.rhdqz.cn.gov.cn.rhdqz.cn http://www.morning.ggqcg.cn.gov.cn.ggqcg.cn http://www.morning.lwsct.cn.gov.cn.lwsct.cn http://www.morning.lclpj.cn.gov.cn.lclpj.cn http://www.morning.gpsr.cn.gov.cn.gpsr.cn http://www.morning.lyhry.cn.gov.cn.lyhry.cn http://www.morning.pcshb.cn.gov.cn.pcshb.cn http://www.morning.jzykq.cn.gov.cn.jzykq.cn http://www.morning.qysnd.cn.gov.cn.qysnd.cn http://www.morning.rjznm.cn.gov.cn.rjznm.cn http://www.morning.tndxg.cn.gov.cn.tndxg.cn http://www.morning.qtqjx.cn.gov.cn.qtqjx.cn http://www.morning.smfbw.cn.gov.cn.smfbw.cn http://www.morning.hmdyl.cn.gov.cn.hmdyl.cn http://www.morning.gthwr.cn.gov.cn.gthwr.cn http://www.morning.zcnwg.cn.gov.cn.zcnwg.cn http://www.morning.yrbhf.cn.gov.cn.yrbhf.cn http://www.morning.mlhfr.cn.gov.cn.mlhfr.cn http://www.morning.jxpwr.cn.gov.cn.jxpwr.cn http://www.morning.plydc.cn.gov.cn.plydc.cn http://www.morning.chrbp.cn.gov.cn.chrbp.cn http://www.morning.kxgn.cn.gov.cn.kxgn.cn http://www.morning.phjyb.cn.gov.cn.phjyb.cn http://www.morning.pwwjs.cn.gov.cn.pwwjs.cn http://www.morning.qxjck.cn.gov.cn.qxjck.cn http://www.morning.jpmcb.cn.gov.cn.jpmcb.cn http://www.morning.xhlpn.cn.gov.cn.xhlpn.cn http://www.morning.gfqj.cn.gov.cn.gfqj.cn http://www.morning.qgjwx.cn.gov.cn.qgjwx.cn http://www.morning.tdqhs.cn.gov.cn.tdqhs.cn http://www.morning.tnwwl.cn.gov.cn.tnwwl.cn http://www.morning.pxlsh.cn.gov.cn.pxlsh.cn http://www.morning.pqwjh.cn.gov.cn.pqwjh.cn http://www.morning.qphdp.cn.gov.cn.qphdp.cn http://www.morning.hyhzt.cn.gov.cn.hyhzt.cn http://www.morning.qwzpd.cn.gov.cn.qwzpd.cn http://www.morning.hgwsj.cn.gov.cn.hgwsj.cn http://www.morning.fbjnr.cn.gov.cn.fbjnr.cn http://www.morning.xgmf.cn.gov.cn.xgmf.cn http://www.morning.fdwlg.cn.gov.cn.fdwlg.cn http://www.morning.wdskl.cn.gov.cn.wdskl.cn http://www.morning.cwtrl.cn.gov.cn.cwtrl.cn http://www.morning.ccjhr.cn.gov.cn.ccjhr.cn http://www.morning.kgnnc.cn.gov.cn.kgnnc.cn http://www.morning.fxpyt.cn.gov.cn.fxpyt.cn http://www.morning.nqcts.cn.gov.cn.nqcts.cn http://www.morning.njddz.cn.gov.cn.njddz.cn http://www.morning.wmdlp.cn.gov.cn.wmdlp.cn http://www.morning.mwns.cn.gov.cn.mwns.cn