BF533应用之倒计时器
0赞通过前面的学习,我们知道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);//将跑表值显示在上位机上
}
}
