实时时钟+闹钟

在江科大实时时钟的基础上添加闹钟的配置,参考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.768KHzwhile(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);	//时钟频率1hzRTC_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~0OLED_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);

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[保研/考研机试] KY187 二进制数 北京邮电大学复试上机题 C++实现

描述 大家都知道&#xff0c;数据在计算机里中存储是以二进制的形式存储的。 有一天&#xff0c;小明学了C语言之后&#xff0c;他想知道一个类型为unsigned int 类型的数字&#xff0c;存储在计算机中的二进制串是什么样子的。 你能帮帮小明吗&#xff1f;并且&#xff0c;小…

Redis学习笔记Day01-Redis入门

声明&#xff1a;本博客部分内容是从终极SpringBoot讲义摘抄的&#xff0c;文字是OCR识别出来的&#xff0c;有可能存在识别错误的可能&#xff0c;如有错误&#xff0c;请大胆指正&#xff0c;我马上修改&#xff01; 目录 0.官方参考手册API1.连接命令2.key相关命令3.String命…

yolov5目标检测多线程Qt界面

上一篇文章&#xff1a;yolov5目标检测多线程C部署 V1 基本功能实现 mainwindow.h #pragma once#include <iostream>#include <QMainWindow> #include <QFileDialog> #include <QThread>#include <opencv2/opencv.hpp>#include "yolov5.…

前后端分离------后端创建笔记(02)

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论&#xff0c;如有侵权请联系 源码&#xff1a;https://gitee.com/green_vegetables/x-admin-project.git 素材&#xff1a;https://pan.baidu.com/s/…

银河麒麟安装php7.1.33

银河麒麟V10兼容CentOS 8 安装过程与CentOS类似。 TencentOS3.1安装PHPNginxredis测试系统_乐大师的博客-CSDN博客 可以参考之前我写的文章。 不过有2个细节不同&#xff0c;下面说下。 问题1&#xff1a;编译错误提示“error:off_t undefined” 解决方法&#xff1a; 编…

LeetCode 1572. 矩阵对角线元素的和

【LetMeFly】1572.矩阵对角线元素的和 力扣题目链接&#xff1a;https://leetcode.cn/problems/matrix-diagonal-sum/ 给你一个正方形矩阵 mat&#xff0c;请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1&…

中介者模式(C++)

定义 用一个中介对象来封装(封装变化)一系列的对象交互。中介者使各对象不需要显式的相互引用(编译时依赖->运行时依赖)&#xff0c;从而使其耦合松散(管理变化)&#xff0c;而且可以独立地改变它们之间的交互。 应用场景 在软件构建过程中&#xff0c;经常会出现多个对象…

SpringBoot MDC全局链路解决方案

需求 在访问量较大的分布式系统中&#xff0c;时时刻刻在打印着巨量的日志&#xff0c;当我们需要排查问题时&#xff0c;需要从巨量的日志信息中找到本次排查内容的日志是相对复杂的&#xff0c;那么&#xff0c;如何才能使日志看起来逻辑清晰呢&#xff1f;如果每一次请求都…

Centos7.6 安装mysql过程全记录

在centos 7.6上 离线安装mysql 的步骤&#xff0c;可参考下文&#xff1a; 一、查看当前MySQL的安装情况并卸载 1. 查看当前MySQL的安装情况 查找之前是否安装了MySQL rpm -qa|grep -i mysql 2.卸载mysql 如果已经安装mysql&#xff0c;则需要先停止MySQL&#xff0c;再删除…

Fiddler

基础 Fiddler 相当于一个 “代理”,浏览器访问浏览器页面时&#xff0c;就会把HTTP请求先发给Fiddler&#xff0c;Fiddler 再把请求转发给浏览器的服务器&#xff0c;当浏览器服务器返回数据时&#xff0c;Fiddler拿到返回数据&#xff0c;再把数据交给浏览器。 主界面 删除…

【24择校指南】南京大学计算机考研考情分析

南京大学(A) 考研难度&#xff08;☆☆☆☆☆&#xff09; 内容&#xff1a;23考情概况&#xff08;拟录取和复试分数人数统计&#xff09;、院校概况、23初试科目、23复试详情、参考书目、各科目考情分析、各专业考情分析。 正文2178字&#xff0c;预计阅读&#xff1a;6分…

《嵌入式 - 嵌入式大杂烩》SVC和PendSV异常详解

1 操作模式 在讨论PendSV和SVC异常前,需要先了解Cortex-M的模式和两个特权等级。 Figure 1 1 操作模式和特权等级 两种模式为handler模式和线程(thread)模式,这两种模式是为了区别正在执行代码的类型;handler模式为异常处理例程的代码;线程模式为普通应用程序的代码。 两…