(Kinetis K60)RTC实时时钟
初始化RTC
#include "uart4.h" #include "LED.h" void rtc_init(U32 alarm); void main(void) { init_LED(); rtc_init(0); while(1); } void rtc_init(U32 alarm) { U32 i; SIM_SCGC6 |= SIM_SCGC6_RTC_MASK; //打开时钟 RTC_CR = RTC_CR_SWR_MASK; //复位RTC寄存器值 RTC_CR &= ~RTC_CR_SWR_MASK; RTC_CR |= RTC_CR_OSCE_MASK; //开启振荡器 for(i=0;i<0x600000;i++); //延时 RTC_TCR = RTC_TCR_CIR(0) | RTC_TCR_TCR(0); //时间间隔 c_interval+1 溢出时钟周期 32768 clock cycles RTC_TSR = 0; //TSR初始值 RTC_TAR = alarm; //TAR初始值 RTC_SR |= RTC_SR_TCE_MASK; //开计数器 enable_irq(66); }
短接电源和VBAT RTC供电
RTC中断(重定义中断号)
#include "isr.h" #include "uart4.h" U8 aa =1; void rtc_isr(void) { if((RTC_SR & RTC_SR_TIF_MASK)== 0x01) //无效 { RTC_SR &= 0x07; RTC_TSR = 0x00; } else if((RTC_SR & RTC_SR_TOF_MASK) == 0x02) //溢出 { RTC_SR &= 0x07; RTC_TSR = 0x00; //计数器关闭 可以读取或写入 } else if((RTC_SR & RTC_SR_TAF_MASK) == 0x04) //报警 { aa=!aa; LED1(aa); RTC_TAR = RTC_TSR; //TAR==TSR TSR增加触发 } else ; }