完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
|
|
相关推荐
1个回答
|
|
|
UTC:世界标准时间,用来在全球范围内同步时间的方法,通过非常精准的原子钟维护,为抵消地球自转变慢参数的影响,需要不规则的加入闰秒,所以会出现闰年来弥补人为规定的纪年与地球公转产生的差异。
UNIX时间:用来记录时间的流逝,定义为从UTC时间1970年1月1日0时0分0秒开始流逝的秒数,无论身处何地,时间都一样,UNIX系统中计算机内部的时间都是使用这种时间,但是为方便观察,需要转换为年-月-日-时-分-秒的格式。 该代码用于STM32开发板,初始化RTC时钟后,通过UART串口设置并显示时间,此代码仅为部分代码。 #define year_days(a) (((a%100!=0)&&(a%4==0))||(a%400==0)) #define days_in_year(i) (year_days(i) ? 366 : 365) //判断i年是否为闰年 unsigned long days_in_month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //一年中各月份天数 struct date_time { unsigned long year; unsigned long month; unsigned long day; unsigned long hour; unsigned long min; unsigned long sec; }; //时间结构体 void Time_Display(u32 ticks) //显示时间函数,ticks表示当前时间秒数 { struct date_time now; //当前时间 unsigned long days; //天数 unsigned long hms; //时分秒 int i; days = ticks / 86400; //当前时间秒数对应的天数 hms = ticks % 86400; //当前时间秒数对应的不足一天的秒数 now.hour = hms / 3600; //转换所得小时 now.min = (hms % 3600) / 60; //转换所得分钟 now.sec = (hms % 3600) % 60; //转换所得秒 for(i = 1970; days > days_in_year(i); i++) //当天数大于这一年的天数时,年份加1 days -= days_in_year(i); now.year = i; //转换所得年份 if(year_days(i)) //判断当前年份是否为闰年,得到二月份天数 days_in_month[2] = 29; else days_in_month[2] = 28; for(i = 1; days > days_in_month; i++) //当天数大于这一个月的天数时,月份加1 days -= days_in_month; now.month = i; //转换所得月份 now.day = days + 1; //转换所得日,因没有0日,所以加1 printf("%ld-%ld-%ld %ld:%ld:%ldn", now.year, now.month, now.day, now.hour, now.min, now.sec); } void Set_RTC_Time() //通过UART串口直接设置时间,输入格式为年月日时分秒 { struct date_time time; //日期结构体 unsigned long days = 0; //天数初始化0 unsigned long ticks; //秒数 int i; printf("please input the time of now:n"); scanf("%ld%ld%ld%ld%ld%ld", &time.year,&time.month,&time.day,&time.hour,&time.min,&time.sec); for(i = 1970; i < time.year; i++) //当年份小于设置年份时,递增 days += days_in_year(i); //天数增加该年天数 if(year_days(i)) //判断当前年份是否为闰年,得到二月份天数 days_in_month[2] = 29; else days_in_month[2] = 28; for(i = 1; i < time.month; i++) //当月份小于设置月份时,递增 days += days_in_month; //天数增加该月天数 days += time.day - 1; //天数增加设置日,且要比设置日少1天 ticks = days * 86400 + time.hour * 3600 + time.min * 60+ time.sec; //计算设置日期相对于标准日期的秒数 RTC_SetCounter(ticks); //设置RTC寄存器秒数 } int main(void) { unsigned int n; int i, j; SysTick_Configure(); Uart1_Configuration(); RTC_Configuration(); RTC_NVIC_Config(); Buzzer_Configuration(); //外设初始化 while(1) { Time_Display(RTC_GetCounter()); Delay_us(1000000); //显示所设置时间,间隔一秒 } } |
|
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
4130 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
3221 浏览 1 评论
2747 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
2175 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
14939 浏览 2 评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
3084浏览 4评论
stm32f4下spi+dma读取数据不对是什么原因导致的?
1894浏览 3评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
2064浏览 3评论
1976浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
2165浏览 3评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 23:52 , Processed in 0.609224 second(s), Total 72, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
458