MCU

BF533应用之倒计时器

0
阅读(2982)

通过前面的学习,我们知道ADSP-BF533处理器的RTC内设还可以实现秒表或者跑表,秒表或者跑表的功能实现起来其实就是一个倒计时器。今天准备学习如何利用BF533来实现倒计时器。回头看了一下BF533的PDF文档,发现处理器的RTC内设还专门留了一个专门用来实现倒计时计数的寄存器RTC_SWCNT,下面先详细介绍一下该寄存器的用法。

RTC_SWCNT主要用来存放秒表的倒计时值,简称秒表计数器,当秒表功能启动后,该倒计时值将以1HZ的频率不断减一,如果相关的中断功能有启用,当计数值到达0时,将会产生一个中断。而RTC_SWCNT将一直停留在0值的状态,直到有一个新的值被写入RTC_SWCNT寄存器。

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

 

RTC_SWCNT是一个16位的寄存器,实现的秒表最长可倒计时216秒,即最长可倒计时18时12分15秒。对于RTC_SWCNT寄存器的读写操作,同样必须在1HZ事件后进行最好。1秒钟后,RTC_SWCNT寄存器将变成设置的值,并且开始减一。因为倒计时值的写入需要耗1S的时间,所以为了达到精确倒计时,倒计数器在写入之前最好做减一处理。即如果你要实现20S的倒计时,那么写入19即可,因为写入操作已经用了接近1S的时间了。

下面给出一个例程,程序的具体功能是通过设定一个倒计数值,然后开启倒计时功能,然后不断地读取倒计数值,这样就可以判断倒计时功能是否实现。

#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 = 0;   //中断控制寄存器初始化为0,无中断使能

}

//程序主应用程序

void main(void)

{

    unsigned int Stopwatch;

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

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

    RTC_Init();//初始化RTC

    *pRTC_SWCNT = 59;//写入倒计数值,时间为1分钟 只需写入59即可

    while(1)

    {

         Stopwatch = *pRTC_SWCNT;//获取倒计数值

         printf("Stopwatch is %d S\n",Stopwatch);//将跑表值显示在上位机上

    }         

}