MCU

RTC应用之实时时钟实现[原创]

0
阅读(3457)

通过前面的学习,我们知道ADSP-BF533处理器的RTC功能只要供给其电源和时钟源,便可自动计时行走。今天决定编个小程序实现时钟功能,首先分析一下实现一个时钟所需完成的步骤,一般的时钟至少具备时分秒三大参数,并且每走60秒分加一,每走60分则时加一,当走至23时59分59秒,则重新回到0时0分0秒。通过前面的了解,我们知道,实际上RTC功能已经具备了以上特性,要实现时钟功能,只需将当前时间转化后写入RTC的状态寄存器RTC_STAT,这样RTC将在当前时间的基础上以1Hz的频率计时,我们只需在每个1Hz事件中将其读出并显示出来即可。

根据以上分析,先画出系统主程序的流程图:

 

下面是具体的实现程序,附有详细解释:

#include <cdefBF533.h>//BF533头文件

//PLL初始化函数 

void Set_PLL(unsigned int pmsel,unsigned int pssel)

{

       unsigned int new_PLL_CTL;

       *pPLL_DIV = pssel;

       asm("ssync;");

       new_PLL_CTL = (pmsel & 0x3f) << 9;             

       *pSIC_IWR |= 0xffffffff;

       if (new_PLL_CTL != *pPLL_CTL)

       {

              *pPLL_CTL = new_PLL_CTL;

              asm("ssync;");

              asm("idle;");

       }

}

//EBIU接口初始化

void Init_EBIU(void)

{

       *pEBIU_AMBCTL0      = 0x7bb07bb0;

       *pEBIU_AMBCTL1      = 0xffc07bb0;

       *pEBIU_AMGCTL       = 0x000f;

}

//RTC功能初始化

void RTC_Init(void)

{    

       *pRTC_PREN = 1;//使能预分频功能

       *pRTC_ISTAT = 0;//中断状态寄存器初始化为0

       *pRTC_ICTL = 0;   //中断控制寄存器初始化为0,无中断使能

}

//系统主应用程序

void main(void)

{

       unsigned int i;

       unsigned long times;

       int day = 0;

       int hours = 10;//设置时

       int min = 10;//设置分

       int sec = 10;//设置秒

       Set_PLL(16,3);//初始化系统时钟PLL  设置系统时钟为133MHZ

       Init_EBIU();//初始化EBIU接口              

       RTC_Init();//初始化RTC

       *pRTC_STAT = (day<<17)|(hours<<12)|(min<<6)|(sec);//写入时间参数

       while(1)

       {

             times = *pRTC_STAT;//获取总的计数值

             day = (times>>17)&0x7fff;//获取天数值

             hours = (times>>12)&0x1f;//获取时

             min = (times>>6)&0x3f;//获取分

             sec = times &0x3f;//获取秒

             printf("time is %d day %d:%d:%d\n",day,hours,min,sec);//将时钟参数值打印出来

       }         

}

以上便是通过BF533的RTC功能实现的时钟的程序,仅供参考。