一.项目实验的内容

1.从RTC中获取时间,然后利用定时器,定时一段时间去更新时间。

这个更新时间的算法:本人采用的是万年历算法的思想实现的。

2.具体难点:需要判断是否是闰年,闰年与平年的天数不一样。

因为我使用的板子是自己公司做的,RTC电路没有装外部晶振,因此我的代码中 初始日期为 自己设定。

废话不多说,直接上代码。

二.代码实现

①参数定义与头文件引入

#include "at32f435_437_board.h"
#include "at32f435_437_clock.h"/** @addtogroup AT32F435_periph_examples* @{*//** @addtogroup 435_TMR_timer_base TMR_timer_base* @{*/void Update_time(uint32_t t);uint32_t time_s = 0;
//假设当前时间为:2023-12-31-23-59-59 (这里的时间可以读取芯片中RTC获取。)
uint32_t year = 2023;
uint32_t month = 12;
uint32_t day = 31;
uint32_t hour = 23;
uint32_t minute = 59;
uint32_t second = 59;
uint32_t yuefen[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
uint32_t yuefen1[12] = {31,29,31,30,31,30,31,31,30,31,30,31};//闰年crm_clocks_freq_type crm_clocks_freq_struct = {0};//AT32F435时钟结构体,0表示sclk

参数说明,为啥设定2023-12-31-23-59-59,因为想着这个时间比较特殊,涉及到跨年,更容易看出代码有没有问题。

uint32_t time_s = 0 ; 用于定时多长时间,更新一次时间。

②主函数中定时器的配置

int main(void)
{system_clock_config();at32_board_init();uart_print_init(115200);/* get system clock */crm_clocks_freq_get(&crm_clocks_freq_struct);/* enable tmr1 clock */crm_periph_clock_enable(CRM_TMR1_PERIPH_CLOCK, TRUE);/* tmr1 configuration *//* time base configuration */tmr_base_init(TMR1, 9999, (crm_clocks_freq_struct.apb2_freq * 2 / 10000) - 1); tmr_cnt_dir_set(TMR1, TMR_COUNT_UP);/* overflow interrupt enable */tmr_interrupt_enable(TMR1, TMR_OVF_INT, TRUE);/* tmr1 hall interrupt nvic init */nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);nvic_irq_enable(TMR1_OVF_TMR10_IRQn, 1, 0);/* enable tmr1 */tmr_counter_enable(TMR1, TRUE);while(1){Update_time(40);//40秒更新一次}
}

我们把定时器配置为1秒钟产生一次中断,计数方式是 向上计数。

我设定了40秒钟更新一次时间。

③定时器1中断函数

void TMR1_OVF_TMR10_IRQHandler(void)
{if(tmr_flag_get(TMR1, TMR_OVF_FLAG) == SET){time_s++;tmr_flag_clear(TMR1, TMR_OVF_FLAG);}
}

定时器1中断功能:每次产生中断,令time_s加1,直到time_s 等于 40的时候,更新一次时间。

④万年历算法实现时间更新

void Update_time(uint32_t t)
{uint32_t days;//天 uint32_t hours;//小时 uint32_t minutes;//分钟 uint32_t seconds;//秒 uint32_t i, q;uint32_t temp = 0;days = time_s/ (24 * 3600);//计算天数,一天24*60*60秒 time_s = time_s % (24 * 3600);//当前天的总秒数 hours =  time_s / 3600;//计算当前天的小时 time_s = time_s % 3600;//分钟的秒数+秒数 minutes = time_s / 60;//计算当前天的分钟 seconds = time_s % 60;//当前的秒数 if(time_s == t){//计算年份 for (i = days; i > 364; i--)//天数大于一整年的。{if (((year % 4 == 0) && (year % 100 != 0)) || year % 400 == 0)//闰年 {year = year + 1;i = i - 366 + 1;}else {//非闰年 year = year + 1;i = i - 365 + 1;}}//更新时间second = second + seconds;if (second >= 60){second = second - 60;minute++;}minute = minute + minutes;if (minute >= 60){minute = minute - 60;hour++;}hour = hour + hours;if (hour >= 24){hour = hour - 24;day++;}if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)//闰年情况下 更新天数{day = day + i;for (q = month - 1; q < 12; q++){temp = yuefen1[q];if (temp < day + 1){month = month + 1;day = day - yuefen1[q];}else break;}if (q >= 12 && day > 31){for (q = 0; q < 12; q++){temp = yuefen1[q];if (temp < day + 1){month = month + 1;day = day - yuefen1[q];}}}}else{day = day + i;for (q = month - 1; q < 12; q++){temp = yuefen[q];if (temp < day + 1){month = month + 1;day = day - yuefen[q];}else break;}if (q >= 12 && day > 31){for (q = 0; q < 12; q++){temp = yuefen[q];if (temp < day + 1){month = month + 1;day = day - yuefen[q];}}}}if (month > 12){month = month - 12;year++;}printf("%d年 %d月 %d日 %d时 %d分 %d秒",year,month,day,hour,minute,second);time_s = 0;}}

具体的逻辑自己去想一想 也能 想出来。

三、仿真效果。

用printf函数通过串口打印出来,通过串口调试助手可以观察到仿真效果。

完美定时40秒 更新一次时间。

AT32F435 定时器Time1实现 实时更新时间(万年历算法)相关推荐

  1. 利用js,实现网页上实时更新时间,需要时直接拿来用,不需要改动

    html文件代码 <div><span id="showNowTime"></span></div> js文件代码 <scri ...

  2. Android开发之实时更新系统时间

    实现功能跟手机的时间一样,可模仿秒钟的跳动,实时更新时间到textView中 封装的方法: /** * 时间变化handler */ @SuppressLint("HandlerLeak&q ...

  3. linux现代时间轮算法,linux2.6定时器的时间轮算法分析

    1.Overview 常用的定时器实现算法有两种:红黑树和时间轮(timing wheel). 在Linux2.6的代码中,kernel/timer.c文件实现了一个通用定时器机制,使用的是时间轮算法 ...

  4. 一文速学-时间序列分析算法之移动平均模型(MA)详解+Python实例代码

    目录 前言 一.移动平均模型(MA) 模型原理 自回归 移动平均模型 自相关系数 常用的 MA 模型的自相关系数 通用: MA(1)模型: MA(2)模型: 自协方差函数 二.Python案例实现 平 ...

  5. 实现商品秒杀成功后【前端实时更新待支付倒计时结束时间】

    此次案例是在用户秒杀下单后未支付的情况下在页面实时显示根据后端传过来的待支付结束时间倒计时 代码可完全复制粘贴! (只需修改<!-- 待支付商品实时倒计时js部分 --> buyTime变 ...

  6. echarts 时间曲线图_制作按时间每秒实时更新的echarts折线图

    有时候我们的图表需要根据后台数据每秒实时更新,那么用echarts应该如何实现呢?2020.11.27发现篇文章很多人关注,但之前写的不是很清楚,今天更新下,大家有问题可以也留言讨论.这是一个仿win ...

  7. QChart双Y轴实时更新曲线图(横坐标为当前时间)

    前言 本文属于转载,转载文章为:QChart双Y轴实时更新曲线图,只为方便记录,方便后续学习. 准备 首先,通过QT的帮助文档了解下QChart.QSplineSeries(或者其他的Series类) ...

  8. react前端面试题(实时更新)

    React前端面试题 1. 对React-Fiber的理解,他解决了什么问题 2.对webSocket的理解 4.说说你对koa中洋葱模型的理解? 5.说说package.json中版本号的规则? 6 ...

  9. web端数据实时更新是如何实现的?

    web端数据实时更新是如何实现的? 为了实现Web端数据的实时更新,我们可以使用两种方式. Ajax 轮询,通过定时器,定时刷新数据,但是实时性不够,且造成服务器的压力比较大 HTTP协议工作于客户端 ...

最新文章

  1. 黄聪:原生js的音频播放器,兼容pc端和移动端(原创)
  2. cobbler 无人值守-安装
  3. Java Spring log源代码学习
  4. 使用waitgroup控制协程退出
  5. python修改文件linux编码格式,使用python的chardet库获得文件编码并修改编码
  6. 前端 获取当前页面服务器ip_fiddler获取响应时间以及服务器IP
  7. Cmake构建_设置全局编译选项
  8. Redis持久化 - 邱乘屹的个人技术博客
  9. ubuntu安装docker + 配置国内源和加速器
  10. 量子计算(十五):半导体量子芯片
  11. *微信开发内置浏览器JS自动关闭当前页面回到微信对话窗口
  12. 电容降压主要是用在直流稳压电源电路里
  13. php开启sockets模块,php开启php_sockets扩展
  14. python tensorflow学习笔记(六)最小二乘法
  15. 机器学习画图神器来啦!
  16. Python实现——依次计算一系列给定字符串的字母值,字母值为字符串中每个字母对应的编号值(A对应1,B对应2,以此类推,不区分大小写字母,非字母字符对应的值为0)的总和。
  17. APS系统如何选型?(下)
  18. 深析SpringCloud与Docker微服务架构
  19. 【笑话】网络上的经典马屁回贴~~~
  20. Windows Server 2012 R2配置IIS搭载PHP发生HTTP500解决办法

热门文章

  1. 基于百度LBS的APP开发
  2. 互联网广告系统综述二业务背景
  3. 服务器更换桌面壁纸,实时更换桌面背景工具
  4. Base64、Unicode、URL编解码加解密
  5. 一小时电动力学 03 静电学
  6. 第二届天元编程邀请赛(提高组)B 石老板腾云驾雾【唯一分解定理】
  7. MasterAlign单目双mark自对位系统调试说明书
  8. Bootstrap 自定义
  9. 【电子学会】2021年03月图形化三级 -- 小鸡吃虫
  10. 常用的 Rapidshare 搜索引擎