RTC简介
实时时钟是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。
注意事项
-1- 要手动配置中断寄存器
-2- 需要等待写操作完成
-3- 时钟闹钟中段在同一个中断函数中
配置时钟
调用函数RTC_SetCounter();
函数里面的参数可通过计算获得如下图
配置闹钟
调用函数RTC_SetAlarm();
函数里面的参数和时钟相同
代码编写 (F1可直接拷贝使用)
#include "stm32f10x.h"
#include "usart.h"
uint32_t TimeDisplay;
u32 Set_RTCTIME(u8 Hour,u8 Minute,u8 Sec);
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* Enable the RTC Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
RTC->CRH |= 0x02;
}
void RTC_Configuration(void)
{
//使能电源和后备接口时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
//使能后备寄存器和RTC的访问
PWR_BackupAccessCmd(ENABLE);
BKP_DeInit();
RCC_LSEConfig(RCC_LSE_ON);
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
RCC_RTCCLKCmd(ENABLE);
RTC_WaitForSynchro();
RTC_WaitForLastTask();
RTC_ITConfig(RTC_IT_SEC, ENABLE);
RTC_WaitForLastTask();
RTC_SetPrescaler(32767);
RTC_WaitForLastTask();
}
void Time_Adjust(void)
{
RTC_WaitForLastTask();
RTC_SetCounter(Set_RTCTIME(16,24,50));
RTC_WaitForLastTask();
RTC_SetAlarm(Set_RTCTIME(16,24,53));
RTC_WaitForLastTask();
}
int main(void)
{
int a;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_Configuration();
uart_init(115200);
if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
{
printf("\r\n\n RTC not yet configured....");
RTC_Configuration();
printf("\r\n RTC configured....");
Time_Adjust();
BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
}
RCC_ClearFlag();
while(1)
{
if( TimeDisplay==1 )
{
TimeDisplay=0;
a=RTC_GetCounter();
printf("%d\n", a / 3600);
printf("%d\n",(a % 3600) / 60);
printf("%d\n",(a % 3600) % 60);
}
}
}
void RTC_IRQHandler(void)
{
if (RTC_GetITStatus(RTC_IT_SEC) != RESET)
{
/* Clear the RTC Second interrupt */
RTC_ClearITPendingBit(RTC_IT_SEC);
TimeDisplay = 1;
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
}
if (RTC_GetITStatus(RTC_IT_ALR) != RESET)
{
/* Clear the RTC Second interrupt */
RTC_ClearITPendingBit(RTC_IT_ALR);
RTC_WaitForLastTask();
printf("发生了闹钟的中断\r\n");
}
}
u32 Set_RTCTIME(u8 Hour,u8 Minute,u8 Sec)
{
return((Hour*3600 + Minute*60 + Sec));
}
工程获取
三连加关注后点击头像获取