利用RTC时钟完成显示日期
RTC时钟实验(复习rtc)
今天周日休息时间,复习下了RTC,想在买的开发板做个时钟出来
直接上rtc部分代码,不发原理图
配置NVIC中断函数
。
static void RTC_NVIC_Config(void)
{ NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; //RTC全局中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级1位,从优先级3位NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //先占优先级0位,从优先级4位NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能该通道中断NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
}
配置rtc
。
u8 RTC_Init(void)
{//检查是不是第一次配置时钟u8 temp=0;RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟 PWR_BackupAccessCmd(ENABLE); //使能后备寄存器访问 if (BKP_ReadBackupRegister(BKP_DR1) != 0x5050) //从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎{ BKP_DeInit(); //复位备份区域 RCC_LSEConfig(RCC_LSE_ON); //设置外部低速晶振(LSE),使用外设低速晶振while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET&&temp<250) //检查指定的RCC标志位设置与否,等待低速晶振就绪{temp++;delay_ms(10);}if(temp>=250)return 1;//初始化时钟失败,晶振有问题 RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟 RCC_RTCCLKCmd(ENABLE); //使能RTC时钟 RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成RTC_WaitForSynchro(); //等待RTC寄存器同步 RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成RTC_EnterConfigMode();/// 允许配置 RTC_SetPrescaler(32767); //设置RTC预分频的值RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成RTC_Set(2020,4,12,17,42,55); //设置时间 RTC_ExitConfigMode(); //退出配置模式 BKP_WriteBackupRegister(BKP_DR1, 0X5050); //向指定的后备寄存器中写入用户程序数据}else//系统继续计时{RTC_WaitForSynchro(); //等待最近一次对RTC寄存器的写操作完成RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成}RTC_NVIC_Config();//RCT中断分组设置 RTC_Get();//更新时间 return 0; //ok}
配置rtc中断条件
。
//RTC时钟中断
//每秒触发一次
//extern u16 tcnt;
void RTC_IRQHandler(void)
{ if (RTC_GetITStatus(RTC_IT_SEC) != RESET)//秒钟中断{ RTC_Get();//更新时间 }if(RTC_GetITStatus(RTC_IT_ALR)!= RESET)//闹钟中断{RTC_ClearITPendingBit(RTC_IT_ALR); //清闹钟中断 RTC_Get(); //更新时间 printf("Alarm Time:%d-%d-%d %d:%d:%d\n",calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);//输出闹铃时间 } RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW); //清闹钟中断RTC_WaitForLastTask();
}
//判断是否是闰年函数
月份 1 2 3 4 5 6 7 8 9 10 11 12
闰年 31 29 31 30 31 30 31 31 30 31 30 31/非闰年 31 28 31 30 31 30 31 31 30 31 30 31
输入:
u8 Is_Leap_Year(u16 year)
{ if(year%4==0) //必须能被4整除{ if(year%100==0) { if(year%400==0)return 1;//如果以00结尾,还要能被400整除 else return 0; }else return 1; }else return 0;
}
//设置时钟
//把输入的时钟转换为秒钟
//以1970年1月1日为基准
//1970~2099年为合法年份
//返回值: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 seccount=0;if(syear<1970||syear>2099)return 1; for(t=1970;t<syear;t++) //把所有年份的秒钟相加{if(Is_Leap_Year(t))seccount+=31622400;//闰年的秒钟数else seccount+=31536000; //平年的秒钟数}smon-=1;for(t=0;t<smon;t++) //把前面月份的秒钟数相加{seccount+=(u32)mon_table[t]*86400;//月份秒钟数相加if(Is_Leap_Year(syear)&&t==1)seccount+=86400;//闰年2月份增加一天的秒钟数 }seccount+=(u32)(sday-1)*86400;//把前面日期的秒钟数相加 seccount+=(u32)hour*3600;//小时秒钟数seccount+=(u32)min*60; //分钟秒钟数seccount+=sec;//最后的秒钟加上去RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟 PWR_BackupAccessCmd(ENABLE); //使能RTC和后备寄存器访问 RTC_SetCounter(seccount); //设置RTC计数器的值RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成 return 0;
}//初始化闹钟
//以1970年1月1日为基准
//1970~2099年为合法年份
//syear,smon,sday,hour,min,sec:闹钟的年月日时分秒
//返回值:0,成功;其他:错误代码.
u8 RTC_Alarm_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec)
{u16 t;u32 seccount=0;if(syear<1970||syear>2099)return 1; for(t=1970;t<syear;t++) //把所有年份的秒钟相加{if(Is_Leap_Year(t))seccount+=31622400;//闰年的秒钟数else seccount+=31536000; //平年的秒钟数}smon-=1;for(t=0;t<smon;t++) //把前面月份的秒钟数相加{seccount+=(u32)mon_table[t]*86400;//月份秒钟数相加if(Is_Leap_Year(syear)&&t==1)seccount+=86400;//闰年2月份增加一天的秒钟数 }seccount+=(u32)(sday-1)*86400;//把前面日期的秒钟数相加 seccount+=(u32)hour*3600;//小时秒钟数seccount+=(u32)min*60; //分钟秒钟数seccount+=sec;//最后的秒钟加上去 //设置时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时
利用RTC时钟完成显示日期相关推荐
- STM32 RTC时钟掉电日期不更新 STM32 HAL库RTC时钟配置
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 STM32 RTC时钟掉电日期不更新 & STM32 HAL库RTC时钟配置 一.STM32CubeMX RTC配置 二.RT ...
- STM32 RTC时钟掉电日期不更新
RTC(Real-Time Clock)实时时钟,是一个独立的定时器.拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能.修改计数器的值可以重新设置系统当前的时间和日期. RTC 模块和 ...
- 【正点原子FPGA连载】 第二十四章 RTC实时时钟LCD显示实验-摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0
1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...
- 【正点原子FPGA连载】第三十二章RTC实时时钟LCD显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1
1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...
- Python制作一个简易时钟(可显示日期,星期)
源代码: # coding=utf-8 import turtle from datetime import *# 由于表盘刻度不连续,需频繁抬起画笔,放下画笔 def skip(step):turt ...
- RTC实时时钟(LCD显示)
目录 RTC简介 RTC时钟框图 RTC工作原理图 RTC相关寄存器(详细配置过程参考STM32参考手册) 部分代码分析 附录 RTC简介 实时时钟(RTC)是一个独立的定时器.RTC模块拥有一组连续 ...
- 51单片机LCD的数字时钟,实现修改和显示日期
仿真图的数码锁存器和温度传感器不用加,这是学校板 #include<reg52.h> #define uchar unsigned char #define uint unsigned ...
- RTC时钟学习总结附带其他小总结
RTC时钟 一.RTC时钟的简介 二.RTC的具体配置 1.对应的时钟图 2.RTC配置一般步骤 3.RTC特征 ①闹钟中断 ②秒中断(常用) ③溢出中断(应该不常用) 3.主函数中的使用 未解决的问 ...
- MAX7219数码管+RTC时钟——stm32
rtc.c文件如下:具体请查看原子哥正点原子RTC实时时钟例程,发现BUG , 求解决.-OpenEdv-开源电子网 #include "sys.h" #include " ...
最新文章
- Notepad++V6.8.1.0中文版
- OpenGL背景照明
- spring cloud gateway 深入了解 - Predicate
- iOS开发针对对Masonry下的FPS优化讨论
- mongodb模糊查询_MongoDB技术从0到1+
- Linux软件安装的几种方法 (三)—— 源码安装
- session原理及实现共享
- Java9 jar兼容_java9新特性-6-多版本兼容jar包
- sqlalchemy Column Elements
- 冷藏温度范围_机械式、干冰式、冷板式、液氮式等冷藏车制冷方式横向对比
- java中的文件操作:读取写入byte[]字节流、string字符串、list列表
- Java字节码浅析(二)
- devexpress ajax demo,DevExpress Demo示例展示:多功能站点插件 附在线演示
- 【优化算法】人工鱼群优化算法(AFSA)【含Matlab源码 1078期】
- 浅析近场通信技术特点及未来可能的应用与发展
- 性格测试系统v1.0
- 头文件中extern “C”的理解
- 阿里云服务器默认登录密码是什么?
- elasticSearch(二)springboot与es的整合
- 2019暑假牛客多校赛第九场H.Cutting Bamboos (主席树+二分)
热门文章
- MD5中使用16进制
- PHP接口开发加密技术实例原理与例子
- dell计算机的硬盘如何分区,win10系统戴尔笔记本给硬盘分区的具体技巧
- python零基础入门教程免费版_毫无基础的人如何入门 Python ?Python入门教程拿走不谢啦!...
- 如何快速计算生成模型的FID、IS、sFID、Precision、Recall等关键评价指标?
- 1655_MIT 6.828 JOS存储分页映射的实现分析
- 软件测试精品在线开放课程申报书,精品在线开-放课程申报书.pdf
- PDF文件自带的密码,如何删除?
- JS异步加载及解决方式
- 简陋的CNN实现手写数字识别