/* Configure RTC interrupts */
NVIC_DisableIRQ(RTC_IRQn);
NVIC_ClearPendingIRQ(RTC_IRQn);
NVIC_SetPriority(RTC_IRQn, 0);
NVIC_EnableIRQ(RTC_IRQn);
rtc_enable_interrupt(RTC, RTC_IER_SECEN);
此处几个函数是使能RTC中断,设置RTC在NVIC中的使能,并且设置成最高的优先级。在最后一个函数中,只是使能秒钟中断,在上图中寄存器位中还可以同时使能几个其他中断。
/**
* \brief Calculate week from year, month, day.
*/
static uint32_t calculate_week(uint32_t ul_year, uint32_t ul_month, uint32_t ul_day)
此函数是通过日期来计算星期的函数,再此函数中使用了基姆拉尔森公式,公式如下:
W=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)mod7
D是日期,m是月份,y是年数。不过一月和二月必须当成上年的十三月和十四月。
上式中的/都是计算机中的整除。具体的实现大家可以看程序的函数的源码。
通过下面2个函数初始化上图的RTC Time Register和RTC Calendar Register寄存器中相应区域。
时间设置函数
uint32_t rtc_set_time(Rtc *p_rtc, uint32_t ul_hour, uint32_t ul_minute, uint32_t ul_second)
日期设置函数
uint32_t rtc_set_date(Rtc *p_rtc, uint32_t ul_year, uint32_t ul_month, uint32_t ul_day, uint32_t ul_week)
具体的函数实体可以在程序找到,在此就不累述。
void RTC_Handler(void)
上面第一个函数是RTC中断函数。
下面是RTC中断关闭。如下程序所示。
rtc_disable_interrupt(RTC, RTC_IDR_SECDIS);
rtc_clear_status(RTC, RTC_SCCR_SECCLR);
rtc使能函数
rtc_enable_interrupt(RTC, RTC_IER_SECEN);
相关的程序部分就介绍到这里,有关程序更多详细可以看程序源码
/*Initialize the time and date*/
if (rtc_set_time(RTC, gs_ul_new_hour, gs_ul_new_minute, gs_ul_new_second)) {
puts("\n\r Time not set, invalid input!\r");
}
if (rtc_set_date(RTC, gs_ul_new_year, gs_ul_new_month, gs_ul_new_day, gs_ul_new_week)) {
puts("\n\r Date not set, invalid input!\r");
}
/* Default RTC configuration, 24-hour mode */
rtc_set_hour_mode(RTC, 0);
/* Configure RTC interrupts */
NVIC_DisableIRQ(RTC_IRQn);
NVIC_ClearPendingIRQ(RTC_IRQn);
NVIC_SetPriority(RTC_IRQn, 0);
NVIC_EnableIRQ(RTC_IRQn);
rtc_enable_interrupt(RTC, RTC_IER_SECEN);
}
/**
* \brief Interrupt handler for the RTC. Refresh the display.
*/
void RTC_Handler(void)
{
uint32_t ul_status = rtc_get_status(RTC);
/* Second increment interrupt */
if ((ul_status & RTC_SR_SEC) == RTC_SR_SEC) {
/* Disable RTC interrupt */
rtc_disable_interrupt(RTC, RTC_IDR_SECDIS);
all_screen_old(0);
//自添加代码
rtc_clear_status(RTC, RTC_SCCR_SECCLR);
rtc_enable_interrupt(RTC, RTC_IER_SECEN);
}
}