(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
      ;
  
}

 

posted @ 2013-06-29 10:54  默默地EEer  阅读(1694)  评论(0编辑  收藏  举报