实时时钟+闹钟

在江科大实时时钟的基础上添加闹钟的配置,参考http://t.csdn.cn/YDlYy。

实现功能 :每隔time秒蜂鸣器响一次、设置闹钟的年月日时分秒,到时间蜂鸣器响。

前三个函数没有变,添加 

  • void RTC_AlarmInit(void)  闹钟的中断配置
  • void RTC_AlarmSet(uint16_t time) 闹钟的时间设置,实际是RTC_ALR的值
  • void RTC_IRQHandler(void)  中断函数配置,当RTC_CNT = RTC_ALR时产生中断标志位

#include "stm32f10x.h"                  // Device header
#include <time.h>
#include "MYRTC.h"

uint16_t RTC_Time[6]={2023,1,1,23,59,55};
uint8_t Flag=0;
void MyRTC_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE);
	PWR_BackupAccessCmd(ENABLE);
	
	if(BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)//借助BKP的特性,置一个数当作标志位实现复位断电不重置时间
	{
		RCC_LSEConfig(RCC_LSE_ON);     //32.768KHz
		while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)//调用函数等RCC有个标志位LSERDY置1时时钟启动完成

		RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
		RCC_RTCCLKCmd(ENABLE);
		
		RTC_WaitForSynchro();
		RTC_WaitForLastTask();
		
		//注意事项第三点。函数本身调用了进入配置模式函数,所以不用再每次调用。
		RTC_SetPrescaler(32768 - 1);	//时钟频率1hz
		RTC_WaitForLastTask();			//对RTC寄存器的写操作要等待写操作结束
		
		RTC_SetTime();			
				
		BKP_WriteBackupRegister(BKP_DR1,0XA5A5);
	}
	else     	//继续计时
	{
		RTC_WaitForSynchro();
		RTC_WaitForLastTask();
	}
	
}

void RTC_SetTime(void)		//设置时间就是对RTC_CNT进行设置
{
	time_t time_cnt;
	struct tm time_date;
	
	time_date.tm_year=RTC_Time[0] - 1900;
	time_date.tm_mon=RTC_Time[1] - 1;
	time_date.tm_mday=RTC_Time[2];
	time_date.tm_hour=RTC_Time[3];
	time_date.tm_min=RTC_Time[4];
	time_date.tm_sec=RTC_Time[5];
	
	time_cnt = mktime(&time_date) - 8*60*60;
	
	RTC_SetCounter(time_cnt);
	RTC_WaitForLastTask();
}

void RTC_ReadTime(void)
{
	time_t time_cnt;
	struct tm time_date;
	
	time_cnt=RTC_GetCounter() + 8*60*60;
	time_date = *localtime(&time_cnt);
	
	RTC_Time[0] = time_date.tm_year + 1900;
	RTC_Time[1] = time_date.tm_mon + 1;
	RTC_Time[2] = time_date.tm_mday;
	RTC_Time[3] = time_date.tm_hour;
	RTC_Time[4] = time_date.tm_min;
	RTC_Time[5] = time_date.tm_sec;
	
}	
void RTC_AlarmInit(void)
{
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    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);
//	RTC->CRH |= 0X02;				//一定要加 允许闹钟中断
	RTC_ITConfig(RTC_IT_ALR,ENABLE);

}
void RTC_AlarmSet(uint16_t time)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE);
	PWR_BackupAccessCmd(ENABLE);
	
	RTC_SetAlarm(RTC_GetCounter()+time);
	RTC_WaitForLastTask();
}
void RTC_IRQHandler(void)
{
	if(RTC_GetITStatus(RTC_IT_ALR) == SET)
	{
		Flag=1;
		RTC_AlarmSet(5);
		RTC_ClearITPendingBit(RTC_IT_ALR);
		RTC_WaitForLastTask();
	}
	
}
uint8_t RTC_GetFlag(void)
{
	uint8_t tempFlag = Flag;
    Flag = 0;
    return tempFlag;
}

主函数

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.H"
#include "Key.h"
#include "OLED.H"
#include "MYRTC.h"

int main(void)
{
	OLED_Init();
	MyRTC_Init();
	RTC_AlarmInit();
	RTC_AlarmSet(5);
	OLED_ShowString(1,1,"Date:XXXX-XX-XX");
	OLED_ShowString(2,1,"Time:XX-XX-XX");
	OLED_ShowString(3,1,"CNT:");
	OLED_ShowString(4,1,"DIV:");

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	GPIO_SetBits(GPIOA,GPIO_Pin_1);
	
	while(1)
	{
		RTC_ReadTime();
		
		OLED_ShowNum(1,6,RTC_Time[0],4);
		OLED_ShowNum(1,11,RTC_Time[1],2);
		OLED_ShowNum(1,14,RTC_Time[2],2);
		OLED_ShowNum(2,6,RTC_Time[3],2);
		OLED_ShowNum(2,9,RTC_Time[4],2);
		OLED_ShowNum(2,12,RTC_Time[5],2);
		OLED_ShowNum(3,6,RTC_GetCounter(),10);
		
		//DIV每自减一轮,cnt+1;自减范围32767~0
		OLED_ShowNum(4,6,RTC_GetDivider(),10); 
		
		if(RTC_GetFlag() == 1)
		{
			GPIO_ResetBits(GPIOA,GPIO_Pin_1);
			Delay_ms(100);
			GPIO_SetBits(GPIOA,GPIO_Pin_1);
		}
	}
}

或者定义一个闹钟的数组,在设置时间里和RTC一样对闹钟的RTC_ALR进行配置。

    time_t time_cnt;
    struct tm time_date;
    time_date.tm_year=Alarm_Time[0] - 1900;
    time_date.tm_mon=Alarm_Time[1] - 1;
    time_date.tm_mday=Alarm_Time[2];
    time_date.tm_hour=Alarm_Time[3];
    time_date.tm_min=Alarm_Time[4];
    time_date.tm_sec=Alarm_Time[5];
    time_cnt = mktime(&time_date) - 8*60*60;
    RTC_SetAlarm(time_cnt);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/70683.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【算法题】螺旋矩阵I (求解n阶螺旋矩阵问题)

一、问题的提出 螺旋矩阵是一种常见的矩阵形式&#xff0c;它的特点是按照螺旋的方式排列元素。n阶螺旋矩阵是指矩阵的大小为nn&#xff0c;其中n为正整数。 二、解决的思路 当N1时&#xff0c;矩阵为; 当N2时&#xff0c;矩阵为; 当N>2(N为偶数如N4)时&#xff0c;矩阵…

Arduino ESP32 v2 使用记录:开发环境搭建

文章目录 目的开发环境搭建程序下载测试使用VS Code进行开发批量烧录固件到模块中总结 目的 在之前的文章 《使用Arduino开发ESP32&#xff08;01&#xff09;&#xff1a;开发环境搭建》 中介绍了使用Arduino开发ESP32的开发环境搭建内容&#xff0c;只不过当时的 Arduino co…

Django进阶

1.orm 1.1 基本操作 orm&#xff0c;关系对象映射。 类 --> SQL --> 表 对象 --> SQL --> 数据特点&#xff1a;开发效率高、执行效率低&#xff08; 程序写的垃圾SQL &#xff09;。 编写ORM操作的步骤&#xff1a; settings.py&#xff0c;连…

Metasploitable2靶机漏洞复现

一、信息收集 nmap扫描靶机信息 二、弱口令 1.系统弱口令 在Kali Linux中使用telnet远程连接靶机 输入账号密码msfadmin即可登录 2.MySQL弱口令 使用mysql -h 靶机IP地址即可连接 3.PostgreSQL弱密码登录 输入psql -h 192.168.110.134 -U postgres 密码为postgres 输入\…

线性代数(二) 矩阵及其运算

前言 行列式det(A) 其实表示的只是一个值 ∣ a b c d ∣ a d − b c \begin{vmatrix} a & b\\ c & d\end{vmatrix} ad -bc ​ac​bd​ ​ad−bc&#xff0c;其基本变化是基于这个值是不变。而矩阵表示的是一个数表。 定义 矩阵与线性变换的关系 即得 ( a 11 a 12…

数据结构——单链表的实现(c语言版)

前言 单链表作为顺序表的一种&#xff0c;了解并且熟悉它的结构对于我们学习更加复杂的数据结构是有一定意义的。虽然单链表有一定的缺陷&#xff0c;但是单链表也有它存在的价值&#xff0c; 它也是作为其他数据结构的一部分出现的&#xff0c;比如在图&#xff0c;哈希表中。…

java之junit Test

JUnit测试简介 1.什么是单元测试 单元测试是针对最小的功能单元编写测试代码Java程序最小的功能单元是方法单元测试就是针对单个Java方法的测试 2.测试驱动开发 3.单元测试的好处 确保单个方法运行正常如果修改了方法代码&#xff0c;只需确保其对应的单元测试通过测试代码…

【深度学习】【风格迁移】Visual Concept Translator,一般图像到图像的翻译与一次性图像引导,论文

General Image-to-Image Translation with One-Shot Image Guidance 论文&#xff1a;https://arxiv.org/abs/2307.14352 代码&#xff1a;https://github.com/crystalneuro/visual-concept-translator 文章目录 Abstract1. Introduction2. 相关工作2.1 图像到图像转换2.2. Di…

使用chatGPT生成提示词,在文心一言生成装修概念图

介绍 家是情感的港湾&#xff0c;而家居装修则是将情感融入空间的艺术。如何在有限的空间里展现个性与美感&#xff0c;成为了现代人关注的焦点。而今&#xff0c;随着人工智能的发展&#xff0c;我们发现了一个新的创意助手——ChatGPT&#xff0c;它不仅为我们带来了更多可能…

nodejs+vue+elementui招聘求职网站系统的设计与实现-173lo

&#xff08;1&#xff09;管理员的功能是最高的&#xff0c;可以对系统所在功能进行查看&#xff0c;修改和删除&#xff0c;包括企业和用户功能。管理员用例如下&#xff1a; 图3-1管理员用例图 &#xff08;2&#xff09;企业关键功能包含个人中心、岗位类型管理、招聘信息…

C语言每日一题:16:数对。

思路一&#xff1a;基本思路 1.x,y均不大于n&#xff0c;就是小于等于n。 2.x%y大于等于k。 3.一般的思路使用双for循环去遍历每一对数。 代码实现&#xff1a; #include <stdio.h> int main() {int n 0;int k 0;//输入scanf("%d%d", &n, &k);int x…

【深度学习注意力机制系列】—— ECANet注意力机制(附pytorch实现)

ECANet&#xff08;Efficient Channel Attention Network&#xff09;是一种用于图像处理任务的神经网络架构&#xff0c;它在保持高效性的同时&#xff0c;有效地捕捉图像中的通道间关系&#xff0c;从而提升了特征表示的能力。ECANet通过引入通道注意力机制&#xff0c;以及在…

【Plex】FRP内网穿透后 App无法使用问题

能搜索到这个文章的&#xff0c;应该都看过这位同学的分析【Plex】FRP内网穿透后 App无法使用问题_plex frp无效_Fu1co的博客-CSDN博客 这个是必要的过程&#xff0c;但是设置之后仍然app端无法访问&#xff0c;原因是因为网络端口的问题 这个里面的这个公开端口&#xff0c;可…

STM32 F103C8T6学习笔记1:开发环境与原理图的熟悉

作为一名大学生&#xff0c;学习单片机有一段时间了&#xff0c;也接触过嵌入式ARM的开发&#xff0c;但从未使用以及接触过STM32C8T6大开发使用&#xff0c;于是从今日开始&#xff0c;将学习使用它~ 本文介绍STM32C8T6最小系统开发环境搭建注意问题&#xff0c;STM32C8T6单片…

WPF上位机9——Lambda和Linq

Lambda Linq 操作集合 使用类sql形式查询 Linq To SQL

微服务学习笔记-基本概念

微服务是一种经过良好架构设计的分布式架构方案。根据业务功能对系统做拆分&#xff0c;每个业务功能模块作为独立项目开发&#xff0c;称为一个服务。 微服务的架构特征&#xff1a; 单一职责&#xff1a;微服务拆分粒度更小&#xff0c;每一个服务都对应唯一的业务能力&…

Vue实现详细界面里面有一个列表

目录 Vue实现详细界面里面有一个列表 理一下思路&#xff1a; 效果如下&#xff1a; 1、 主页面正常写 2、详细界面(重点) 3、详细界面里面的列表(重点) 要点&#xff1a; Vue实现详细界面里面有一个列表 理一下思路&#xff1a; 1、首先需要这条数据的主键id&#xff…

SpringSpringBoot常用注解

目录 一、核心注解二、Spring Bean 相关2.1 Autowired2.2 Component, Repository, Service, Controller2.3 RestController 与 Controller2.4 Configuration 与 Component2.5 Scope 三、处理常见的 HTTP 请求类型3.1 GET 请求3.2 POST 请求3.3 PUT 请求3.4 DELETE 请求3.5 PATC…

【Python】背景及环境搭建

文章目录 了解计算机一、Python背景知识一、Python环境搭建 努力经营当下 直至未来明朗 了解计算机 示例&#xff1a;使用电脑访问B站 1&#xff09; 本地的计算机会给B站服务器发送一个网络请求&#xff08;如&#xff1a;谁&#xff0c;想看哪个视频&#xff09; 2&#xf…

MySQL8安装教程 保姆级(Windows))

下载 官网: mysql官网点击Downloads->MySQL Community(GPL) Downloads->MySQL Community Server(或者点击MySQL installer for Windows) Windows下有两种安装方式 在线安装 一般带有 web字样 这个需要联网离线安装 一般没有web字样 安装 下载好之后,版本号可以不一样&…