RTC应用之实时时钟实现[原创]
0赞通过前面的学习,我们知道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功能实现的时钟的程序,仅供参考。