1、stm32f10x_it.c文件
/*******************************************************************************
* Function Name : RTC_IRQHandler RTC中断
* Description :
* Input : None
* Output : None
* Return : None
*******************************************************************************/
extern volatile bool Sec; //1S标志
extern volatile int flag;
void RTC_IRQHandler(void)
{
if(RTC_GetITStatus(RTC_IT_SEC) != RESET) //RTC发生了秒中断(也有可能是溢出或者闹钟中断)
{
RTC_ClearITPendingBit(RTC_IT_SEC);
flag=1;
Sec ;
/*
//以免RTC计数溢出,这里限制了RTC计数值的大小.0x0001517f实际就是一天的秒数
if(RTC_GetCounter() >= 0x0001517f)
{
RTC_SetCounter(0x0);
}*/
}
}
/*******************************************************************************
* Function Name : RTC_IRQHandler RTC中断
* Description :
* Input : None
* Output : None
* Return : None
*******************************************************************************/
extern volatile bool Sec; //1S标志
extern volatile int flag;
void RTC_IRQHandler(void)
{
if(RTC_GetITStatus(RTC_IT_SEC) != RESET) //RTC发生了秒中断(也有可能是溢出或者闹钟中断)
{
RTC_ClearITPendingBit(RTC_IT_SEC);
flag=1;
Sec ;
/*
//以免RTC计数溢出,这里限制了RTC计数值的大小.0x0001517f实际就是一天的秒数
if(RTC_GetCounter() >= 0x0001517f)
{
RTC_SetCounter(0x0);
}*/
}
}
2、rtc.c文件
/*****************************************************
**RTC.C实时时钟部分,包含初始化RTC硬件,
**获取时间,设置时间函数.
**
*****************************************************/
/*****************************************************
**RTC.C实时时钟部分,包含初始化RTC硬件,
**获取时间,设置时间函数.
**
*****************************************************/
#include "STM32Lib\\stm32f10x.h"
#include "hal.h"
#include "hal.h"
static u8 RTC_Blank=0;
/***********************************
**函数名:RTC_Configuration
**功能:RTC设置
**注意事项:要根据是否是第一次设置,才进入下面的RTC设定
判断是否第一次设置,只需要判断RTC后备寄存器1的值是否为事先写入的0XA5A5,如果不是,则
RTC是第一次上电,需要初始化RTC,并把实际时间转化为RTC计数值,这里没有设置实际时间,只是简单地初始化了RTC
************************************/
void RTC_Configuration(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
PWR_BackupAccessCmd(ENABLE);
if(BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
{
/* Reset Backup Domain */
BKP_DeInit();
/* Enable LSE */
RCC_LSEConfig(RCC_LSE_ON);
/* Wait till LSE is ready */
//等待外部晶振震荡 需要等待比较长的时间
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
//使用外部晶振32768
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
//允许RTC
RCC_RTCCLKCmd(ENABLE);
//等待RTC寄存器同步
RTC_WaitForSynchro();
RTC_WaitForLastTask();
//允许RTC的秒中断(还有闹钟中断和溢出中断可设置)
RTC_ITConfig(RTC_IT_SEC, ENABLE);
RTC_WaitForLastTask();
//32768晶振预分频值是32767,不过一般来说晶振都不那么准
RTC_SetPrescaler(32776); //如果需要校准晶振,可修改此分频值
RTC_WaitForLastTask();
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
//允许RTC
RCC_RTCCLKCmd(ENABLE);
//等待RTC寄存器同步
RTC_WaitForSynchro();
RTC_WaitForLastTask();
//允许RTC的秒中断(还有闹钟中断和溢出中断可设置)
RTC_ITConfig(RTC_IT_SEC, ENABLE);
RTC_WaitForLastTask();
//32768晶振预分频值是32767,不过一般来说晶振都不那么准
RTC_SetPrescaler(32776); //如果需要校准晶振,可修改此分频值
RTC_WaitForLastTask();
//写入RTC后备寄存器1 0xa5a5
BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
RTC_Blank=1; //这个标志代表RTC是没有预设的(或者说是没有上纽扣电池)
BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
RTC_Blank=1; //这个标志代表RTC是没有预设的(或者说是没有上纽扣电池)
}
//如果RTC已经设置
else
{
//等待RTC与APB同步
RTC_WaitForSynchro();
RTC_WaitForLastTask();
//使能秒中断
RTC_ITConfig(RTC_IT_SEC, ENABLE);
RTC_WaitForLastTask();
}
//清除标志
RCC_ClearFlag();
}
//如果RTC已经设置
else
{
//等待RTC与APB同步
RTC_WaitForSynchro();
RTC_WaitForLastTask();
//使能秒中断
RTC_ITConfig(RTC_IT_SEC, ENABLE);
RTC_WaitForLastTask();
}
//清除标志
RCC_ClearFlag();
}
/**************************************************************
** 函数名:TestRtc
** 功能:测试RTC用
** 注意事项:用于显示RTC是否已经设置过.
***************************************************************/
void TestRtc(void)
{
if(RTC_Blank)
{
USART1_Puts("系统之前没设置时间\r\n");
}
else
{
USART1_Puts("系统已设置时间\r\n");
}
}
** 函数名:TestRtc
** 功能:测试RTC用
** 注意事项:用于显示RTC是否已经设置过.
***************************************************************/
void TestRtc(void)
{
if(RTC_Blank)
{
USART1_Puts("系统之前没设置时间\r\n");
}
else
{
USART1_Puts("系统已设置时间\r\n");
}
}
3、main.c文件
#include "STM32Lib\\stm32f10x.h"
#include "hal.h"
#include "hal.h"
volatile bool Sec=FALSE;
volatile int flag=0;
void send_2_pc(unsigned int str)
{
char sec[2];
sec[0]=str/10 '0';
sec[1]=str '0';
USART1_Puts(sec);
USART1_Puts("\r\n");
}
int main(void)
{
ChipHalInit(); //片内硬件初始化
ChipOutHalInit(); //片外硬件初始化
TestRtc(); //测试RTC
for(;;)
{
if(flag==1)
{
flag=0;
send_2_pc(Sec);
}
}
}
volatile int flag=0;
void send_2_pc(unsigned int str)
{
char sec[2];
sec[0]=str/10 '0';
sec[1]=str '0';
USART1_Puts(sec);
USART1_Puts("\r\n");
}
int main(void)
{
ChipHalInit(); //片内硬件初始化
ChipOutHalInit(); //片外硬件初始化
TestRtc(); //测试RTC
for(;;)
{
if(flag==1)
{
flag=0;
send_2_pc(Sec);
}
}
}
效果图: