超简单 STM32 RTC闹钟 时钟配置

2023-11-01

基于正点原子的RTC时钟
实验效果
LCD屏幕显示 年月日时分秒 设置任意时间 到时间蜂鸣器启动
直接上代码

主函数

简单说 就是初始化各个部件
然后让LED1 闪烁来提示系统的正常运行
显示屏显示实时时间
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"	
#include "usmart.h"	 
#include "rtc.h" 
#include "oled.h"
#include "beep.h" 
 
 int main(void)
 {	 
 	u8 t=0;	
	delay_init();	    	 	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	uart_init(115200);	 	//
 	LED_Init();			     //
	LCD_Init();
  OLED_Init();			// 
	OLED_Clear();	 
	usmart_dev.init(SystemCoreClock/1000000);	//
  BEEP_Init(); 	 
	RTC_Init();	  			//
	POINT_COLOR=RED;//
	LCD_ShowString(60,50,200,16,16,"Elite STM32");	
	LCD_ShowString(60,70,200,16,16,"RTC TEST");	
	LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
	LCD_ShowString(60,110,200,16,16,"2015/1/14");		
	//ÏÔʾʱ¼ä
	POINT_COLOR=BLUE;//
	LCD_ShowString(60,130,200,16,16,"    -  -  ");	   
	LCD_ShowString(60,162,200,16,16,"  :  :  ");		    
	while(1)
	{								    
		if(t!=calendar.sec)
		{
			t=calendar.sec;
			//LCD_ShowNum(60,130,calendar.w_year,4,16);
      OLED_ShowNum(0,2,calendar.w_year,4,16);			
			//LCD_ShowNum(100,130,calendar.w_month,2,16);
      OLED_ShowNum(0,4,calendar.w_month,2,16);		
			//LCD_ShowNum(124,130,calendar.w_date,2,16);
      OLED_ShowNum(0,6,calendar.w_date,2,16);			
			switch(calendar.week)
			{
				case 0:
					LCD_ShowString(60,148,200,16,16,"Sunday   ");
					break;
				case 1:
					LCD_ShowString(60,148,200,16,16,"Monday   ");
					break;
				case 2:
					LCD_ShowString(60,148,200,16,16,"Tuesday  ");
					break;
				case 3:
					LCD_ShowString(60,148,200,16,16,"Wednesday");
					break;
				case 4:
					LCD_ShowString(60,148,200,16,16,"Thursday ");
					break;
				case 5:
					LCD_ShowString(60,148,200,16,16,"Friday   ");
					break;
				case 6:
					LCD_ShowString(60,148,200,16,16,"Saturday ");
					break;  
			}
			LCD_ShowNum(60,162,calendar.hour,2,16);									  
			LCD_ShowNum(84,162,calendar.min,2,16);									  
			LCD_ShowNum(108,162,calendar.sec,2,16);
			LED0=!LED0;
		}	
		delay_ms(10);								  
	};  
 }

RTC配置函数
这里说明一下 我的代码是可以直接复制替换的
说下基于原子我修改了哪些
使能了时钟和闹钟中断 之前只使能了时钟(RTC_ITConfig(RTC_IT_SEC|RTC_IT_ALR, ENABLE);)
调用了设置闹钟值的函数(RTC_Alarm_Set(2021,1,13,16,39,59);)


在闹钟中断的函数中 增加了蜂鸣器 启动 BEEP=1;
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "rtc.h" 	
#include "led.h"
#include "beep.h" 

	   
_calendar_obj calendar;
 
static void RTC_NVIC_Config(void)
{	
  NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;		
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;	
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;	
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;		
	NVIC_Init(&NVIC_InitStructure);		
}


u8 RTC_Init(void)
{

    u8 temp=0;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);	
	PWR_BackupAccessCmd(ENABLE);	
	if (BKP_ReadBackupRegister(BKP_DR1) != 0x5051)		
		{	 			 
		BKP_DeInit();
		RCC_LSEConfig(RCC_LSE_ON);	
		while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET&&temp<250)	
			{
			temp++;
			delay_ms(10);
			}
		if(temp>=250)return 1;	    
		RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);		  
		RCC_RTCCLKCmd(ENABLE);	
		RTC_WaitForLastTask();	
		RTC_WaitForSynchro();		 
		RTC_ITConfig(RTC_IT_SEC|RTC_IT_ALR, ENABLE);	
		RTC_WaitForLastTask();	
		RTC_EnterConfigMode();
		RTC_SetPrescaler(32767); 
		RTC_WaitForLastTask();	
		RTC_Set(2021,1,13,16,38,59);  
        RTC_Alarm_Set(2021,1,13,16,39,59);			
		RTC_ExitConfigMode(); 
		BKP_WriteBackupRegister(BKP_DR1, 0X5051);	
		}
	else//ϵͳ¼ÌÐø¼Æʱ
		{

		RTC_WaitForSynchro();	
		RTC_ITConfig(RTC_IT_SEC, ENABLE);	
		RTC_WaitForLastTask();	
		}
	RTC_NVIC_Config();	    				     
	RTC_Get();	
	return 0; 

}		 				    
 
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);
		BEEP=1;
  	} 				  								 
	RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW);		
	RTC_WaitForLastTask();	  	    						 	   	 
}

u8 Is_Leap_Year(u16 year)
{			  
	if(year%4==0) //
	{ 
		if(year%100==0) 
		{ 
			if(year%400==0)return 1;  
			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 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;	   
	}
	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_BackupAccessCmd(ENABLE);	// 
	RTC_SetCounter(seccount);	//
	RTC_WaitForLastTask();	//	
	return 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;	   
	}
	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_BackupAccessCmd(ENABLE);	 
	RTC_SetAlarm(seccount);
	RTC_WaitForLastTask();	
	
	return 0;	    
}
u8 RTC_Get(void)
{
	static u16 daycnt=0;
	u32 timecount=0; 
	u32 temp=0;
	u16 temp1=0;	  
    timecount=RTC_GetCounter();	 
 	temp=timecount/86400; 
	if(daycnt!=temp)
	{	  
		daycnt=temp;
		temp1=1970;	
		while(temp>=365)
		{				 
			if(Is_Leap_Year(temp1))
			{
				if(temp>=366)temp-=366;
				else {temp1++;break;}  
			}
			else temp-=365;	  //ƽÄê 
			temp1++;  
		}   
		calendar.w_year=temp1;
		temp1=0;
		while(temp>=28)
		{
			if(Is_Leap_Year(calendar.w_year)&&temp1==1)
			{
				if(temp>=29)temp-=29;
				else break; 
			}
			else 
			{
				if(temp>=mon_table[temp1])temp-=mon_table[temp1];
				else break;
			}
			temp1++;  
		}
		calendar.w_month=temp1+1;	
		calendar.w_date=temp+1;  	
	}
	temp=timecount%86400;     			   
	calendar.hour=temp/3600;     	
	calendar.min=(temp%3600)/60; 	
	calendar.sec=(temp%3600)%60; 	
	calendar.week=RTC_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;
	
	yearH=year/100;	yearL=year%100;  
	if (yearH>19)yearL+=100;
	temp2=yearL+yearL/4;
	temp2=temp2%7; 
	temp2=temp2+day+table_week[month-1];
	if (yearL%4==0&&month<3)temp2--;
	return(temp2%7);
}			  


小贴士
RTC具有写保护功能 每次操作要修改掉
if (BKP_ReadBackupRegister(BKP_DR1) != 0x5051)
BKP_WriteBackupRegister(BKP_DR1, 0X5051);
这两行代码的值 最简便就是5051和5050变换
如果程序报错 很可能是以下问题
没有添加蜂鸣器源文件和头文件
main函数没有初始化蜂鸣器

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

超简单 STM32 RTC闹钟 时钟配置 的相关文章

  • 光纤光缆基础知识

    光纤介绍 光纤布线中使用光波的几个波段 800nm 900nm 短波波段 1250nm 13500nm 短波波段 1500nm 1600nm 短波波段 多模光纤运行波长为850nm或1300nm 而单模光纤运行波长则为1310nm或1550
  • 微服务网关鉴权:gateway使用、网关限流使用、用户密码加密、JWT鉴权

    点击关注 芋道源码 2022 09 05 10 32 发表于上海 收录于合集 芋道源码1000个 点击上方 芋道源码 选择 设为星标 管她前浪 还是后浪 能浪的浪 才是好浪 每天 10 33 更新文章 每天掉亿点点头发 源码精品专栏 原创

随机推荐

  • 使用BPMN和微服务进行编排 ——是好做法还是坏做法?

    马丁 Martin Fowler 在他著名的微服务文章中建议 敏捷的终端和愚笨的管道 他指出 微服务社区赞成另一种方法 敏捷的终端和愚笨的管道 从微服务构建的应用程序旨在尽可能地解耦和衔接 他们拥有自己的域逻辑 而更多地在经典的Unix意义
  • c语言指针实现冒泡排序及其优化

    冒泡排序是一个十分容易实现的算法 简单说明一下 假设数组长度为 N 要求从小到大排序 1从第一个数开始比较相邻两个元素 如果前面的数据大于后面的数据 就将二个数据交换 2对数组元素进行一次第一次遍历后 最大的数据就 沉 到了数组最后一个位置
  • 03_GCC与Makefile的使用

    windows下c语言的编译 1 预处理 把 h c展开形成一个文件 宏定义直接替换 还有头文件 库文件的展开形成 i文件 对应的GCC gcc e hello c o hello i 2 汇编 生成汇编文件 gcc s hello i o
  • 【Elasticsearch】ElasticSearch 7.8 多字段权重排序

    1 概述 转载并且补充 https mp weixin qq com s 0g86s o7kgn8ZUxA3UBc0w 请看原文 读者提问 ES 的权重排序有没有示列 参考参考 刚好之前也稍微接触过 于是写了这篇文章 可以简单参考下 在很多
  • msi文件安装MySQL

    文章目录 步骤如下 1 官网下载msi安装文件 2 运行MySQL installer 3 通过MySQL installer配置服务 4 验证 5 安装目录介绍 6 修改指定的数据文件 步骤如下 1 官网下载msi安装文件 官网地址 上述
  • 爬虫入门(三)连接mongodb

    连接mongodb 虽然说我们前面写了一个比较健壮的爬虫了 但是人生难免有意外 万一中断了 我们又要重新开始爬虫下载图片了 抓狂 那么我们想呢 怎么写一个判断图片有没有下载过呢 显然我们不能在文件夹里遍历 会慢到爆炸的 那么我们就可以借助数
  • 深度学习目标检测工具箱mmdetection,训练自己的数据

    文章目录 一 简介 二 安装教程 1 使用conda创建Python虚拟环境 可选 2 安装PyTorch 1 1 3 安装Cython 4 安装mmcv 5 安装mmdetection 6 测试Demo 7 准备自己的数据 8 训练 一
  • 一篇文章掌握整个JVM,JVM超详细解析!!!

    不懂JVM看完这一篇文章你就会非常懂了 文章很长 非常详细 先想想一些问题 1 我们开发人员编写的Java代码是怎么让电脑认识的 首先先了解电脑是二进制的系统 他只认识 01010101 比如我们经常要编写 HelloWord java 电
  • R语言-解决问题:程辑包‘xxx’是用R版本3.3.4 来建造的

    用R的时候会碰到这种情形 warning 程辑包 xxx 是用R版本3 3 4 来建造的 尽管R这样提示 但是不影响这个包的使用 因此是可以继续用的 只是它会有这样的提示而已 出现这种警告的原因是自己电脑上的R版本不是最新的了 需要更新 如
  • Java网络编程——NIO编程

    目录 第一部分 NIO介绍 1 NIO三大核心部分 2 NIO的工作机制 3 Java NIO的非阻塞模式 第二部分 NIO和BIO的比较 第三部分 NIO三大核心原理 第四部分 缓冲区 Buffer 1 缓冲区基本介绍 2 Buffer常
  • python爬虫——post方式

    1 Ajax Ajax是一种在无需重庆加载整个页面的情况下 能够更新部分页面的技术 如下 在谷歌浏览器中按F12查看抓包 点击network xhr 表示是ajax 点击其中一个可以看见是post方式 当你一个字母一个字母慢慢输入时 你会抓
  • 修复 ChatGPT 发生错误的问题

    目录 ChatGPT 发生错误 请参阅如何修复连接错误 修复 ChatGPT 发生错误的问题 基本故障排除技巧 检查 ChatGPT 的服务器状态 检查 API 限制 检查输入格式 清除浏览数据 香港DSE是什么 台湾指考是什么 王湘浩 生
  • python add argument list_python链表:TypeError: add() missing 1 required positional argument: 'item'。这个...

    展开全部 python 2 6用add很正常啊 add看起来没啥问题 到是别的函数有些小问题 1 remove前判断下这个item是不是存在 2 if curNode is head 应该是 if curNode is self head
  • Docker容器时间与宿主机差8小时

    近日测试提了个bug说是登录时间比北京时间晚了8个小时 发现是docker容器的问题 Linux下用date查看的时间与在docker容器里面用date查看的时间相差8小时 docker容器里默认是 UTC 时间 本人用一下两种方式尝试了均
  • 字符串哈希

    方法 字符串前缀哈希法 用 h 存储前缀的哈希值 将字符串转成对应的哈希值 看成p进制的数 例 ABCD 1 2 3 4 gt 1 p 3 2 p 2 3 p 1 4 p 0 mod q 技巧 p 131或1331 q 2 64 用usin
  • 深拷贝与浅拷贝的简单理解

    首先说下什么是简单数据类型 什么是复杂数据类型 简单数据类型有 number 数字型 null undfande booler 布尔值 string 字符串 复杂数据类型 有array 数组 object 对象 function 函数 等等
  • Python探索性数据分析畅销书

    探索性数据分析 探索性数据分析 EDA 是一种分析和调查数据集以了解数据特征的方法 数据集 查看数据集示例 有许多与 2009 年至 2019 年在销售的畅销书的标题和作者相关的信息 除了标题和作者之外 数据中还有其他元素 例如用户评分 评
  • 以太坊Web3.js开发基础

    简介 web3 js是一个通过RPC调用和本地以太坊节点进行通信的js库 web3 js可以与任何暴露了RPC接口的以太坊节点连接 web3中提供了eth对象 web3 eth来与以太坊区块链进行交互 在github上上获得代码 安装Tes
  • Lua--字符串操作

    str1 luaC Java str2 SQLServerOracle 一 输出字符串的长度 print str1 print string len str1 二 字符串的大小写转换 print 全大写 string upper str1
  • 超简单 STM32 RTC闹钟 时钟配置

    基于正点原子的RTC时钟 实验效果 LCD屏幕显示 年月日时分秒 设置任意时间 到时间蜂鸣器启动 直接上代码 主函数 简单说 就是初始化各个部件 然后让LED1 闪烁来提示系统的正常运行 显示屏显示实时时间 include led h in