00. 目录

文章目录

  • 00. 目录
  • 01. RTC时钟简介
  • 02. 硬件设计
  • 03. RTC日历配置步骤
  • 04. 设置和获取日期示例
  • 05. 设置闹钟中断示例
  • 06. 设置唤醒中断示例
  • 07. 附录
  • 08. 声明

01. RTC时钟简介

STM32F4 的实时时钟(RTC)相对于 STM32F1 来说,改进了不少,带了日历功能了,STM32F4 的 RTC,是一个独立的 BCD 定时器/计数器。RTC 提供一个日历时钟(包含年月日时分秒信息)、两个可编程闹钟(ALARM A 和 ALARM B)中断,以及一个具有中断功能的周
期性可编程唤醒标志。RTC 还包含用于管理低功耗模 式的自动唤醒单元。

两个 32 位寄存器(TR 和 DR)包含二进码十进数格式 (BCD) 的秒、分钟、小时(12 或24 小时制)、星期、日期、月份和年份。此外,还可提供二进制格式的亚秒值。

STM32F4 的 RTC 可以自动将月份的天数补偿为 28、29(闰年)、30 和 31 天。并且还可以进行夏令时 补偿。

RTC 模块和时钟配置是在后备区域,即在系统复位或从待机模式唤醒后 RTC 的设置和时间维持不变,只要后备区域供电正常,那么 RTC 将可以一直运行。但是在系统复位后,会自动禁止访问后备寄存器和 RTC,以防止对后备区域(BKP)的意外写操作。所以在要设置时间之前,先要取消备份区域(BKP)写保护。

02. 硬件设计

用到的硬件资源有:
1) 指示灯 DS0
2) 串口
3) TFTLCD 模块
4) RTC

03. RTC日历配置步骤

①使能PWR时钟:RCC_APB1PeriphClockCmd();

② 使能后备寄存器访问: PWR_BackupAccessCmd()

③ 配置RTC时钟源,使能RTC时钟:

RCC_RTCCLKConfig();

RCC_RTCCLKCmd();

如果使用LSE,要打开LSE:RCC_LSEConfig(RCC_LSE_ON);

④ 初始化RTC(同步/异步分频系数和时钟格式):RTC_Init ();

⑤ 设置时间:RTC_SetTime ();

⑥设置日期:RTC_SetDate();

04. 设置和获取日期示例

rtc.h

#ifndef __RTC_H__
#define __RTC_H__#include "sys.h"//RTC初始化
u8 MY_RTC_Init(void);//RTC时间设置
ErrorStatus RTC_Set_Time(u8 hour, u8 min, u8 sec, u8 ampm);//RTC日期设置
ErrorStatus RTC_Set_Date(u8 year, u8 mon, u8 day, u8 week);#endif /*__RTC_H__*/

rtc.c

#include "rtc.h"
#include "delay.h"//RTC时间设置
ErrorStatus RTC_Set_Time(u8 hour, u8 min, u8 sec, u8 ampm)
{RTC_TimeTypeDef RTC_TimeStruct;RTC_TimeStruct.RTC_H12 = ampm;RTC_TimeStruct.RTC_Hours = hour;RTC_TimeStruct.RTC_Minutes = min;RTC_TimeStruct.RTC_Seconds = sec;return RTC_SetTime(RTC_Format_BIN,&RTC_TimeStruct);
}//RTC日期设置
ErrorStatus RTC_Set_Date(u8 year, u8 mon, u8 day, u8 week)
{RTC_DateTypeDef RTC_DateStruct;RTC_DateStruct.RTC_Year = year;RTC_DateStruct.RTC_Month = mon;RTC_DateStruct.RTC_Date = day;RTC_DateStruct.RTC_WeekDay = week;return RTC_SetDate(RTC_Format_BIN, &RTC_DateStruct);
}//RTC初始化
u8 MY_RTC_Init(void)
{u16 retry = 0x1fff;RTC_InitTypeDef RTC_InitStruct;//使能PWR时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能后备寄存器访问PWR_BackupAccessCmd(ENABLE);//判断是否第一次初始化if (RTC_ReadBackupRegister(RTC_BKP_DR0) != 0x8080){//开启LSERCC_LSEConfig(RCC_LSE_ON);//等待LSE准备就绪while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET){retry++;delay_ms(10);}//开始LSE失败if (0 ==  retry){return 1;}//设置RTC时钟为LSERCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);//使能RTC时钟RCC_RTCCLKCmd(ENABLE);//初始化RTCRTC_InitStruct.RTC_HourFormat = RTC_HourFormat_24;RTC_InitStruct.RTC_AsynchPrediv = 0x7F;RTC_InitStruct.RTC_SynchPrediv = 0xFF;RTC_Init(&RTC_InitStruct);//设置时间RTC_Set_Time(16, 06, 50, RTC_H12_AM);//设置日期RTC_Set_Date(20, 9, 9, RTC_Weekday_Wednesday);//标记已经初始化RTC_WriteBackupRegister(RTC_BKP_DR0, 0x8080);}return 0;
}

main.c

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "usmart.h"
#include "lcd.h"
#include "rtc.h"//LED状态设置函数
void led_set(u8 sta)
{LED1 = sta;
}//函数参数调用测试函数
void test_fun(void(*ledset)(u8), u8 sta)
{ledset(sta);
}int main(void)
{ u8 buf[40];u8 t = 0;RTC_TimeTypeDef RTC_TimeStruct;RTC_DateTypeDef RTC_DateStruct;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2delay_init(168);uart_init(115200);usmart_dev.init(84);LED_Init();LCD_Init();//RTC初始化MY_RTC_Init();POINT_COLOR = RED;LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");    LCD_ShowString(30,70,200,16,16,"USMART TEST");    LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");LCD_ShowString(30,110,200,16,16,"2020/09/09");  while(1){t++;//每隔100ms更新显示if (0 == t % 10){RTC_GetTime(RTC_Format_BIN, &RTC_TimeStruct);sprintf((char*)buf, "Time: %02d:%02d:%02d", RTC_TimeStruct.RTC_Hours, RTC_TimeStruct.RTC_Minutes, RTC_TimeStruct.RTC_Seconds);LCD_ShowString(30, 140, 210, 16, 16, buf);RTC_GetDate(RTC_Format_BIN, &RTC_DateStruct);sprintf((char*)buf, "Date: 20%02d-%02d-%02d", RTC_DateStruct.RTC_Year, RTC_DateStruct.RTC_Month, RTC_DateStruct.RTC_Date);LCD_ShowString(30, 160, 210, 16, 16, buf);sprintf((char*)buf, "Week: %d", RTC_DateStruct.RTC_WeekDay);LCD_ShowString(30, 180, 210, 16, 16, buf);      }if (0 == t % 20){LED1 = !LED1;}//睡眠10毫秒delay_ms(10);}
}

05. 设置闹钟中断示例

//设置闹钟时间(按星期闹铃,24小时制)
//week:星期几(1~7) @ref  RTC_Alarm_Definitions
//hour,min,sec:小时,分钟,秒钟
void RTC_Set_AlarmA(u8 week,u8 hour,u8 min,u8 sec)
{RTC_TimeTypeDef RTC_TimeStruct;RTC_AlarmTypeDef RTC_AlarmStruct;EXTI_InitTypeDef EXTI_InitStruct;NVIC_InitTypeDef NVIC_InitStruct;//关闭闹钟ARTC_AlarmCmd(RTC_Alarm_A, DISABLE);//设置闹钟参数RTC_TimeStruct.RTC_H12 = RTC_H12_AM;RTC_TimeStruct.RTC_Hours = hour;RTC_TimeStruct.RTC_Minutes = min;RTC_TimeStruct.RTC_Seconds = sec;RTC_AlarmStruct.RTC_AlarmTime = RTC_TimeStruct;RTC_AlarmStruct.RTC_AlarmMask = RTC_AlarmMask_None;RTC_AlarmStruct.RTC_AlarmDateWeekDaySel = RTC_AlarmDateWeekDaySel_WeekDay;RTC_AlarmStruct.RTC_AlarmDateWeekDay = week;RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_A, &RTC_AlarmStruct);//清除闹钟A的中断标志RTC_ClearITPendingBit(RTC_IT_ALRA);//清除中断线17上的中断标志EXTI_ClearITPendingBit(EXTI_Line17);//开启闹钟A中断RTC_ITConfig(RTC_IT_ALRA, ENABLE);//开启闹钟RTC_AlarmCmd(RTC_Alarm_A, ENABLE);//初始化中断EXTI_InitStruct.EXTI_Line = EXTI_Line17;EXTI_InitStruct.EXTI_LineCmd = ENABLE;EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_Init(&EXTI_InitStruct);//初始化中断优先级NVIC_InitStruct.NVIC_IRQChannel = RTC_Alarm_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority =  0x2;NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x2;NVIC_Init(&NVIC_InitStruct);
}//闹钟中断处理函数
void RTC_Alarm_IRQHandler(void)
{if (RTC_GetFlagStatus(RTC_FLAG_ALRAF) == SET){RTC_ClearFlag(RTC_FLAG_ALRAF);printf("ALARM A!\r\n");}//清中断EXTI_ClearITPendingBit(EXTI_Line17);
}

06. 设置唤醒中断示例


//周期性唤醒定时器设置
/*wksel:  @ref RTC_Wakeup_Timer_Definitions
#define RTC_WakeUpClock_RTCCLK_Div16        ((uint32_t)0x00000000)
#define RTC_WakeUpClock_RTCCLK_Div8         ((uint32_t)0x00000001)
#define RTC_WakeUpClok_RTCCLK_Div4         ((uint32_t)0x00000002)
#define RTC_WakeUpClock_RTCCLK_Div2         ((uint32_t)0x00000003)
#define RTC_WakeUpClock_CK_SPRE_16bits      ((uint32_t)0x00000004)
#define RTC_WakeUpClock_CK_SPRE_17bits      ((uint32_t)0x00000006)
*/
//cnt:自动重装载值.减到0,产生中断.
void RTC_Set_WakeUp(u32 wksel,u16 cnt)
{EXTI_InitTypeDef EXTI_InitStruct;NVIC_InitTypeDef NVIC_InitStruct;//关闭WakeUPRTC_WakeUpCmd(DISABLE);//配置WakeUP时钟分频系数或者来源RTC_WakeUpClockConfig(wksel);//设置WakeUP自动装载值RTC_SetWakeUpCounter(cnt);//清除中断标志RTC_ClearITPendingBit(RTC_IT_WUT);//清除中断线17上的中断标志EXTI_ClearITPendingBit(EXTI_Line22);//开启WakeUP中断RTC_ITConfig(RTC_IT_WUT, ENABLE);//使能WakeUpRTC_WakeUpCmd(ENABLE);//初始化中断EXTI_InitStruct.EXTI_Line = EXTI_Line22;EXTI_InitStruct.EXTI_LineCmd = ENABLE;EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_Init(&EXTI_InitStruct);//初始化中断优先级NVIC_InitStruct.NVIC_IRQChannel = RTC_WKUP_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority =  0x2;NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x2;NVIC_Init(&NVIC_InitStruct);}//唤醒中断处理函数
void RTC_WKUP_IRQHandler(void)
{if (RTC_GetFlagStatus(RTC_FLAG_WUTF) == SET){RTC_ClearFlag(RTC_FLAG_WUTF);LED2 = !LED2;}//清中断EXTI_ClearITPendingBit(EXTI_Line22);   }

07. 附录

7.1 【STM32】STM32系列教程汇总

网址:【STM32】STM32系列教程汇总

08. 声明

该教程参考了正点原子的《STM32 F4 开发指南》

【STM32】RTC程序示例相关推荐

  1. 【STM32】待机唤醒程序示例

    00. 目录 文章目录 00. 目录 01. 待机模式简介 02. 硬件模块 03. 相关函数 04. 程序示例一 05. 程序示例二 06. 附录 07. 声明 01. 待机模式简介 很多单片机都有 ...

  2. 【STM32】硬件随机数程序示例

    00. 目录 文章目录 00. 目录 01. 概述 02. 硬件模块 03. 相关函数 04. 程序示例 05. 结果验证 06. 附录 07. 声明 01. 概述 STM32F4 自带了硬件随机数发 ...

  3. 【STM32】ADC程序示例

    00. 目录 文章目录 00. 目录 01. ADC简介 02. 硬件资源 03. 编程思路 04. 程序示例 05. 预留 06. 附录 07. 声明 01. ADC简介 STM32F4xx 系列一 ...

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

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

  5. stm32 RTC时钟配置

    stm32--RTC实时时钟 一.关于时间 2038年问题 在计算机应用上,2038年问题可能会导致某些软件在2038年无法正常工作.所有使用UNIX时间表示时间的程序都将将受其影响,因为它们以自19 ...

  6. java聊天程序步骤解析_java网络之基于UDP的聊天程序示例解析

    基于UDP的Socket通信 UDP协议不是一种基于稳定连接的协议,是一种面向数据报包的通信协议,不需要通信双方建立稳定的连接,也没有所谓服务端和客户的概念,数据报包在传输的时候不保证一定及时到达,也 ...

  7. java web程序示例_想要建立一些有趣的东西吗? 这是示例Web应用程序创意的列表。...

    java web程序示例 Interested in learning JavaScript? Get my ebook at jshandbook.com 有兴趣学习JavaScript吗? 在js ...

  8. 第一个Mybatis程序示例 Mybatis简介(一)

    在JDBC小结中(可以参阅本人JDBC系列文章),介绍到了ORM,其中Mybatis就是一个不错的ORM框架 MyBatis由iBatis演化而来 iBATIS一词来源于"internet& ...

  9. 9.5 程序示例--推荐系统-机器学习笔记-斯坦福吴恩达教授

    程序示例–推荐系统 推荐模型 在推荐模型中,我们将暴露: 训练接口 train() 预测接口 predict(Theta, X) 获得推荐接口 getTopRecommends(Theta, X, i ...

最新文章

  1. php 正则表达式 ies,正则表达式模式修正符(/ies)
  2. 教育大数据隐私保护机制与技术研究
  3. TIDB报错statement count 5001 exceeds the transaction limitation, autocommit = false问题解决
  4. 【Android】命令行jarsigner签字和解决找不到证书链错误
  5. python语言单词接龙_[蓝桥杯][算法训练VIP]单词接龙 (C语言代码)
  6. linux oracle异常,Linux上oracle常见安装异常总结
  7. putty连接TPYBord V202开发板教程
  8. nginx root alias 文件路径配置
  9. Powershell与运维之服务器管理(一) 利用Powershell管理HP服务器
  10. Next主题美化博客
  11. android大智慧安装目录,大智慧的文件目录结构
  12. SEO网站搜索引擎优化软件
  13. 利用ffmpeg提取视频中的声音为MP3格式
  14. 酒店管理与计算机技术结合,基于TCP/IP的酒店客房管理系统解决方案
  15. 【转】我们离大排面30元一碗还有多远?
  16. win7如何设置以管理员身份运行程序
  17. 小武学fpgastep6
  18. Android开发之摇一摇
  19. sonar pdf 插件
  20. 教程:建立自己的私有云存储

热门文章

  1. HDU 2066 一个人的旅行
  2. HTTP 知识点之一:头部解释(转)
  3. 线程间操作无效: 从不是创建控件“progressBar1”的线程访问它。
  4. [LCS]LCS2005服务器应用程序
  5. pandas中drop用法_pandas中drop()函数用法
  6. 方程的根的个数C语言xtu_零度根轨迹的绘制及情况讨论、以及参数根轨迹的原理介绍...
  7. java atomicinteger_Java多线程进阶(十三)—— J.U.C之atomic框架:AtomicInteger
  8. python37安装opencv41_Vs2019+opencv4.1.0+python3.7,包安装,vs2019opencv410python37,程序包
  9. python如何离线安装第三方模块_扣丁学堂python开发之第三方模块pip离线安装
  10. python处理字符串效率_Python字符串搜索效率