datasheet

STM32小白入门(第13天)-------RTC实时时钟和闹钟事件

2019-07-10来源: eefocus关键字:STM32  RTC  实时时钟  闹钟事件

一、RTC的概述


RTC就是实时时钟,详细英文 Real Time Clock。


二、详细描述


1.使用

2. 中断配置注意事项




三、程序设计


一)RTC唤醒事件


1. RTC的初始化


void rtc_init(void)

{

/* Enable the PWR clock ,使能电源时钟*/

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

/* Allow access to RTC,允许访问RTC */

PWR_BackupAccessCmd(ENABLE);


/* Enable the LSE OSC ,使能外部低速晶振振荡器*/

RCC_LSEConfig(RCC_LSE_ON);

/* Wait till LSE is ready ,等待外部晶振振荡器准备好*/  

while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);


/* Select the RTC Clock Source ,选择外部晶振作为RTC的时钟源*/

RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

/* Enable the RTC Clock,使能RTC的时钟 */

RCC_RTCCLKCmd(ENABLE);

/* Wait for RTC APB registers synchronisation,等待所有的RTC寄存器就绪 */

RTC_WaitForSynchro();

if (RTC_ReadBackupRegister(RTC_BKP_DR0) != 0x4567)

{

/* Configure the RTC data register and RTC prescaler */

/* ck_spre(1Hz) = RTCCLK(LSE) /(uwAsynchPrediv + 1)/(uwSynchPrediv + 1)=32768/(127+1)/(255+1)=1Hz

因为RTC都是以秒作为最小的时间单位

*/

my_RTC_InitStructure.RTC_AsynchPrediv = 0x7F;

my_RTC_InitStructure.RTC_SynchPrediv = 0xFF;

my_RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24; //24小时格式

RTC_Init(&my_RTC_InitStructure);


/* Set the date: Thursday January 11th 2018,2018/01/25 星期四 */

my_RTC_DateStructure.RTC_Year = 0x18;

my_RTC_DateStructure.RTC_Month = RTC_Month_January;

my_RTC_DateStructure.RTC_Date = 0x27;

my_RTC_DateStructure.RTC_WeekDay = RTC_Weekday_Thursday;

RTC_SetDate(RTC_Format_BCD, &my_RTC_DateStructure);

/* Set the time to 10h 09mn 15s AM ,早上10:09:15*/

my_RTC_TimeStructure.RTC_H12     = RTC_H12_PM;

my_RTC_TimeStructure.RTC_Hours   = 0x21;

my_RTC_TimeStructure.RTC_Minutes = 0x57;

my_RTC_TimeStructure.RTC_Seconds = 0x33; 

RTC_SetTime(RTC_Format_BCD, &my_RTC_TimeStructure);  

}

//关闭唤醒功能

RTC_WakeUpCmd(DISABLE);

//为唤醒功能选择RTC配置好的时钟源

RTC_WakeUpClockConfig(RTC_WakeUpClock_CK_SPRE_16bits);

//设置唤醒计数值为自动重载,写入值默认是0,1->0

RTC_SetWakeUpCounter(0);

//清除RTC唤醒中断标志

RTC_ClearITPendingBit(RTC_IT_WUT);

//使能RTC唤醒中断

RTC_ITConfig(RTC_IT_WUT, ENABLE);


//使能唤醒功能

RTC_WakeUpCmd(ENABLE);

/* 配置外部中断控制线22,实现RTC唤醒*/

EXTI_ClearITPendingBit(EXTI_Line22);

EXTI_InitStructure.EXTI_Line = EXTI_Line22;

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure);

/* 使能RTC唤醒中断 */

NVIC_InitStructure.NVIC_IRQChannel = RTC_WKUP_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

/* Indicator for the RTC configuration,写备份寄存器,用于建立判断标志是否要重置RTC的日期与时间 */

RTC_WriteBackupRegister(RTC_BKP_DR0, 0x4567);

}


2、RTC中断服务程序

void RTC_WKUP_IRQHandler(void)

{

//检查是否发生了唤醒中断

if(RTC_GetITStatus(RTC_IT_WUT) != RESET)

{

//添加用户代码

//清空相应的标志位

RTC_ClearITPendingBit(RTC_IT_WUT);

      EXTI_ClearITPendingBit(EXTI_Line22);

}

//RTC时间设置

//hour,min,sec:小时,分钟,秒钟

//ampm:@RTC_AM_PM_Definitions  :RTC_H12_AM/RTC_H12_PM

//返回值:SUCEE(1),成功

//ERROR(0),进入初始化模式失败  

ErrorStatus RTC_Set_Time(u8 hour,u8 min,u8 sec,u8 ampm)

{

RTC_TimeTypeDef RTC_TimeTypeInitStructure;

RTC_TimeTypeInitStructure.RTC_Hours = hour;

RTC_TimeTypeInitStructure.RTC_Minutes = min;

RTC_TimeTypeInitStructure.RTC_Seconds = sec;

RTC_TimeTypeInitStructure.RTC_H12 = ampm;

return RTC_SetTime(RTC_Format_BCD, &RTC_TimeTypeInitStructure);

}

//RTC日期设置

//year,month,date:年(0~99),月(1~12),日(0~31)

//week:星期(1~7,0,非法!)

//返回值:SUCEE(1),成功

//ERROR(0),进入初始化模式失败 

ErrorStatus RTC_Set_Date(u8 year,u8 month,u8 date,u8 week)

{

RTC_DateTypeDef RTC_DateTypeInitStructure;

RTC_DateTypeInitStructure.RTC_Date = date;

RTC_DateTypeInitStructure.RTC_Month = month;

RTC_DateTypeInitStructure.RTC_WeekDay = week;

RTC_DateTypeInitStructure.RTC_Year = year;

return RTC_SetDate(RTC_Format_BIN,&RTC_DateTypeInitStructure);

}

二)闹钟事件


//设置闹钟时间(按星期闹铃,24小时制)

//week:星期几(1~7) @ref  RTC_Alarm_Definitions

//hour,min,sec:小时,分钟,秒钟

void RTC_Set_AlarmA(u8 week,u8 hour,u8 min,u8 sec)

EXTI_InitTypeDef   EXTI_InitStructure;

RTC_AlarmTypeDef RTC_AlarmTypeInitStructure;

RTC_TimeTypeDef RTC_TimeTypeInitStructure;

RTC_AlarmCmd(RTC_Alarm_A,DISABLE);//关闭闹钟A 

        RTC_TimeTypeInitStructure.RTC_Hours = hour;//小时

RTC_TimeTypeInitStructure.RTC_Minutes = min;//分钟

RTC_TimeTypeInitStructure.RTC_Seconds = sec;//秒

RTC_TimeTypeInitStructure.RTC_H12 = RTC_H12_AM;

  

RTC_AlarmTypeInitStructure.RTC_AlarmDateWeekDay = week; //星期

RTC_AlarmTypeInitStructure.RTC_AlarmDateWeekDaySel = RTC_AlarmDateWeekDaySel_WeekDay; //按星期闹

RTC_AlarmTypeInitStructure.RTC_AlarmMask = RTC_AlarmMask_None;    //精确匹配星期,时分秒

RTC_AlarmTypeInitStructure.RTC_AlarmTime = RTC_TimeTypeInitStructure;

        RTC_SetAlarm(RTC_Format_BIN,RTC_Alarm_A,&RTC_AlarmTypeInitStructure);

 

RTC_ClearITPendingBit(RTC_IT_ALRA);//清除RTC闹钟A的标志

        EXTI_ClearITPendingBit(EXTI_Line17);//清除LINE17上的中断标志位 

RTC_ITConfig(RTC_IT_ALRA,ENABLE);//开启闹钟A中断

RTC_AlarmCmd(RTC_Alarm_A,ENABLE);//开启闹钟A 

EXTI_InitStructure.EXTI_Line = EXTI_Line17;//LINE17

        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件

        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发 

        EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能LINE17

        EXTI_Init(&EXTI_InitStructure);//配置


NVIC_InitStructure.NVIC_IRQChannel = RTC_Alarm_IRQn; 

        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级1

        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2

        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道

        NVIC_Init(&NVIC_InitStructure);//配置

}


//RTC闹钟中断服务函数

void RTC_Alarm_IRQHandler(void)

{    

if(RTC_GetFlagStatus(RTC_FLAG_ALRAF)==SET)//ALARM A中断?

{

RTC_ClearFlag(RTC_FLAG_ALRAF);//清除中断标志

printf("ALARM A!rn");

}   

EXTI_ClearITPendingBit(EXTI_Line17); //清除中断线17的中断标志  

}


关键字:STM32  RTC  实时时钟  闹钟事件

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic467309.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32小白入门(第14天)-------Flash
下一篇:STM32小白入门(第11天)-------SPI协议

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32使用FreeRTOS中的链表创建节点与列表项

使用了STM32F103的FreeRTOS库来创建一个列表,其实FreeRTOS的list中链表是双向的循环链表,为了简单介绍,我直接说是列表了。 芯片使用的是GD32F103CBT6,该芯片兼容ST的库,不影响使用效果。 以下代码不全,仅提供思路,如有不足,请给我留言。第一步先定义变量,初始化列表及列表项nodeDevice node_t; //节点数据nodeDevice * pNode; //节点指针 xList list_t; //列表#define pList ((xList *) &list_t) //列表指针 xListItem item_t; //列表
发表于 2019-07-18

FreeRTOS学习笔记——基础知识与移植(STM32F103)

添加文件打开基础工程,新建分组FreeRTOS_CORE 和FreeRTOS_PORTABLE,然后向这两个分组中添加文件,如图2.2.1.4 所示:分组FreeRTOS_CORE 中的文件在什么地方就不说了,打开FreeRTOS 源码一目了然。重点来说说FreeRTOS_PORTABLE 分组中的port.c 和heap_4.c 是怎么来的,port.c 是RVDS 文件夹下的ARM_CM3 中的文件,因为STM32F103 是Cortex-M3 内核的,因此要选择ARM_CM3中的port.c 文件。heap_4.c 是MemMang 文件夹中的,前面说了MemMang 是跟内存管理相关的,里面有5 个c 文件:heap_1.c
发表于 2019-07-18
FreeRTOS学习笔记——基础知识与移植(STM32F103)

STM32CubeMX+FreeRTOS实验---使用两个实例,共用一个task

, 0, 128);  LED2FlashHandle = osThreadCreate(osThread(LED2Flash), NULL);只是一个定义osThreadDef只是一个定义,把相关的内容绑在一起,不是函数。osThreadCreate才是一个函数。第二个参数就是*argument,对应StartLEDFlashTask函数的输入参数。因此在osThreadDef之前加入code。/*import user code,may be changed by stm32cubeMX*//*take attention */    uint16_t led1pin,led2pin
发表于 2019-07-18
STM32CubeMX+FreeRTOS实验---使用两个实例,共用一个task

stm32 FreeRTOS中如何创建任务

#include "config.h"#include "global.h"#include "stdio.h"#include "PC.h" #include "FreeRTOS.h"#include "task.h"#include "list.h" void vLED1Task(void *pvParameters){ while(1) { GPIO_Reverse (); vTaskDelay(1000/portTICK_RATE_MS); }}void
发表于 2019-07-18

STM32CubeMX学习笔记——FreeRTOS_任务挂起与继续

Githubhttps://github.com/HaHaHaHaHaGe/Planof2019_half/tree/master/Course_Project/FreeRTOS/Class02_SuspendResume简介任务挂起与继续的作用,用于暂停运行某些任务与继续运行某些任务。就像用视频播放器看电影的播放按键与暂停按键一样简单。在STM32CubeMX上配置FreeRTOS非常的简单,几乎不需要做任何操作,只需要勾选移植FreeRTOS就成功了,关于在非Cube上的RTOS配置文件内的相关内容,也在下方的Configuration栏中给好了所有的配置都可以在这里完成任务创建有别于在没有使用Cube下的创建方式,在Cube
发表于 2019-07-18
STM32CubeMX学习笔记——FreeRTOS_任务挂起与继续

STM32 RTOS系统 学习笔记(一)

基本概念               RTOS全称为:Real Time OS,就是实时操作系统,强调的是:实时性。实时操作系统又分为硬实时和软实时。硬实时要求在规定的时间内必须完成操作 ,硬实时系统不允许超时,在软实时里面处理过程超时的后果就没有那么严格。       在实时操作系统中,我们可以把要实现的功能划分为多个任务,每个任务负责实现其中的一部分,每个任务都是一个很简单的程序,通常是一个死循环。
发表于 2019-07-18
STM32 RTOS系统 学习笔记(一)

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved