定时器堪比MCU的灵魂,现在的嵌入式系统中基本上都要用到定时器。现在我们来看看MB95F264K的定时器的使用。寄存器的设定详情参考Datasheet的第十四章。Datasheet我已经上传到EEPW网站上了。MB95F264K的8/16位多功能定时器具有7种工作模式(具体的见Datasheet),本试用手记先讲间隔定时器功能(连续模式)。
使用间隔定时器功能(连续模式)时,计数器自“00H”开始计数。计数器值与寄存器设定值匹配时,定时器输出反转。发出中断请求后,计数器返回“00H”,重新计数。重复操作使定时器输出方波。
设置步骤入下:
1) 设定模式(T00CR0:[F3…F0]=0 0 0 1)(见Datasheet P212)
2) 设定计数器时钟(T00CR0:[C2…C0])
3) 设定计数器值(T00DR)
4) 必要时设定中断级(ILR1)
5) 使能定时器输出(T00CR1:OE=1)
6) 启动定时器(T00CR1:STA=1)
然后在中断服务函数里清楚ISR标志。(T00CR1:IF=0)
接下来看看具体的程序。为了验证定时器是否工作正常,我们可以在中断服务函数里设置断点观察,也可以利用EVB上的LED来进行观察。
先定义用到的变量:
int i=0;
int LED=1;
有用到的IO初始化:
void IOinit()
{
DDR6_P62 = 1;
PDR6_P62 = 1;
}
接下来是定时器的初始化:
void InitCompTimer (void)
{
T01DR = 0xF1; // 设定计数器高8位
T00DR = 0xFF; // 设定计数器低8位
TMCR0 = 0x10; // 16-bit, 无滤波
T00CR0 = 0x81; //间隔定时器功能(连续模式)
// 溢出中断使能
T00CR1 = 0xA1; // 使能中断,使能输出
// 启动定时器
}
再来是中断服务函数:
__interrupt void CompTimer (void)
{
i++;
LED=~LED;
PDR6_P62 = LED;//实现LED灯的闪烁
T00CR1_IE = 0; // 先关中断
T00CR1_IF = 0; // 清楚标志位
T00CR1_IE = 1; // 使能中断
}
在main()函数里只要调用相应的子函数就可以了。
void main (void)
{
IOinit();
InitCompTimer();
InitIrqLevels();
__EI();
while (1);
}
运行程序就可以看到LED闪烁了。证明定时器确实工作了。说明一下,我们只是让定时器工作,并没有精确定时,所以定时器初值只是大概设置成LED闪烁的时候人眼可以识别,并没有准确确定定时多少。想要准确定时的可以在其基础上根据需要参考Datasheet改初值即可。完整工程如下:
Timer Continuous.rar