MCU

BF533应用之闹钟

0
阅读(4773)

通过前面的了解,我们知道ADSP-BF533处理器的RTC结构还可以实现闹钟功能,闹钟的实现具体分为两种形式。第一个是闹钟的时间,包括小时,分钟和秒。当启用报警中断,RTC将在每天指定的时间产生一个中断,从而实现闹钟功能。第二个报警功能是允许应用程序指定是在哪一天的某个时间报警。当某一天启用报警中断时,RTC将在指定的日期和时间产生一个中断。这两种报警功能可以独立启用或者禁用。今天准备学习如何利用BF533来实现闹钟功能。还是回看BF533的器件资料,该处理器的RTC内设专门留了一个用来设置闹钟参数的寄存器RTC_ALARM,下面先详细介绍一下该寄存器的用法。

如下图为RTC_SWCNT寄存器的具体内容。

RTC_ALARM主要用来存放闹钟的时间参数。通过软件编程可以实现闹钟的时、分、秒参数,当指定的时间到达时,处理器将产生一个中断,从而闹钟启动。在任意时刻都能对于该寄存器进行读写操作。在该寄存器的高15位,还可以设置闹钟启动的确切日期,设置后,闹钟将在指定的日期的指定时间产生中断。

下面给出一个例程,程序的具体功能是通过设定一个闹钟时间,然后开启闹钟中断使能,然后在主循环中不断地读取中断状态寄存器的值,判断闹钟中断标志位是否置1,如果是,则表示闹钟已启动。

下面先给出程序流程图:

然后是具体代码:

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

//系统时钟设置函数

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 = 2;   //中断控制寄存器初始化为2,使能时分秒闹钟中断

       *pRTC_STAT = 0x00008000; //当前时间设置为早上8点钟

}

//系统主应用程序

void main(void)

{

       unsigned int AlarmState;

       Set_PLL(16,3);//初始化系统时钟PLL

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

       RTC_Init();//初始化RTC

       *pRTC_ALARM = 0x00008780;//写入闹钟值,设置时间为早上8点30分

       while(1)

       {

             AlarmState = *pRTC_ISTAT&0x0002;//获取倒计数值     

             if(AlarmState!=0)

             {

                    printf("The Alarm is On");//将跑表值显示在上位机上

             }

       }         

}