RTC时钟实验(复习rtc)

今天周日休息时间,复习下了RTC,想在买的开发板做个时钟出来

直接上rtc部分代码,不发原理图

  1. 配置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寄存器
}
  1. 配置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}
  1. 配置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时钟完成显示日期相关推荐

  1. STM32 RTC时钟掉电日期不更新 STM32 HAL库RTC时钟配置

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 STM32 RTC时钟掉电日期不更新 & STM32 HAL库RTC时钟配置 一.STM32CubeMX RTC配置 二.RT ...

  2. STM32 RTC时钟掉电日期不更新

    RTC(Real-Time Clock)实时时钟,是一个独立的定时器.拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能.修改计数器的值可以重新设置系统当前的时间和日期. RTC 模块和 ...

  3. 【正点原子FPGA连载】 第二十四章 RTC实时时钟LCD显示实验-摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0

    1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...

  4. 【正点原子FPGA连载】第三十二章RTC实时时钟LCD显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

  5. Python制作一个简易时钟(可显示日期,星期)

    源代码: # coding=utf-8 import turtle from datetime import *# 由于表盘刻度不连续,需频繁抬起画笔,放下画笔 def skip(step):turt ...

  6. RTC实时时钟(LCD显示)

    目录 RTC简介 RTC时钟框图 RTC工作原理图 RTC相关寄存器(详细配置过程参考STM32参考手册) 部分代码分析 附录 RTC简介 实时时钟(RTC)是一个独立的定时器.RTC模块拥有一组连续 ...

  7. 51单片机LCD的数字时钟,实现修改和显示日期

    仿真图的数码锁存器和温度传感器不用加,这是学校板 #include<reg52.h> #define uchar unsigned char  #define uint unsigned ...

  8. RTC时钟学习总结附带其他小总结

    RTC时钟 一.RTC时钟的简介 二.RTC的具体配置 1.对应的时钟图 2.RTC配置一般步骤 3.RTC特征 ①闹钟中断 ②秒中断(常用) ③溢出中断(应该不常用) 3.主函数中的使用 未解决的问 ...

  9. MAX7219数码管+RTC时钟——stm32

    rtc.c文件如下:具体请查看原子哥正点原子RTC实时时钟例程,发现BUG , 求解决.-OpenEdv-开源电子网 #include "sys.h" #include " ...

最新文章

  1. Notepad++V6.8.1.0中文版
  2. OpenGL背景照明
  3. spring cloud gateway 深入了解 - Predicate
  4. iOS开发针对对Masonry下的FPS优化讨论
  5. mongodb模糊查询_MongoDB技术从0到1+
  6. Linux软件安装的几种方法 (三)—— 源码安装
  7. session原理及实现共享
  8. Java9 jar兼容_java9新特性-6-多版本兼容jar包
  9. sqlalchemy Column Elements
  10. 冷藏温度范围_机械式、干冰式、冷板式、液氮式等冷藏车制冷方式横向对比
  11. java中的文件操作:读取写入byte[]字节流、string字符串、list列表
  12. Java字节码浅析(二)
  13. devexpress ajax demo,DevExpress Demo示例展示:多功能站点插件 附在线演示
  14. 【优化算法】人工鱼群优化算法(AFSA)【含Matlab源码 1078期】
  15. 浅析近场通信技术特点及未来可能的应用与发展
  16. 性格测试系统v1.0
  17. 头文件中extern “C”的理解
  18. 阿里云服务器默认登录密码是什么?
  19. elasticSearch(二)springboot与es的整合
  20. 2019暑假牛客多校赛第九场H.Cutting Bamboos (主席树+二分)

热门文章

  1. MD5中使用16进制
  2. PHP接口开发加密技术实例原理与例子
  3. dell计算机的硬盘如何分区,win10系统戴尔笔记本给硬盘分区的具体技巧
  4. python零基础入门教程免费版_毫无基础的人如何入门 Python ?Python入门教程拿走不谢啦!...
  5. 如何快速计算生成模型的FID、IS、sFID、Precision、Recall等关键评价指标?
  6. 1655_MIT 6.828 JOS存储分页映射的实现分析
  7. 软件测试精品在线开放课程申报书,精品在线开-放课程申报书.pdf
  8. PDF文件自带的密码,如何删除?
  9. JS异步加载及解决方式
  10. 简陋的CNN实现手写数字识别