凌阳61单片机之定时器
时间基准信号,简称时基信号,来自于32768Hz实时时钟,通过频率选择组合而成。时基信号发生器的选频逻辑TMB1,为TimerA的时钟源B提供各种频率选择信号,并为中断系统提供中断源(IRQ6)信号。此外,时基信号发生器还可以通过分频产生2Hz、4Hz、1024Hz、2048Hz以及4096Hz的时基信号,为中断系统提供各种实时中断源(IRQ4和IRQ5)信号。
时基信号发生器通过对P_Timebase_Setup(写)($700EH)单元的编程写入来进行选频操作。
定时器/计数器:
SPCE061A提供了两个16位的定时/计数器:TimerA和TimerB。TimerA为通用计数器;TimerB为多功能计数器。TimerA的时钟源由时钟源A和时钟源B进行“与”操作而形成;TimerB的时钟源仅为时钟源A。
定时器发生溢出后会产生一个溢出信号(TAOUT/TBOUT)。一方面,它会作为定时器中断信号传输给CPU中断系统;另一方面,它又会作为4位计数器计数的时钟源信号,输出一个具有4位可调的脉宽调制占空比输出信号APWMO或BPWMO(分别从IOB8 和IOB9输出),可用来控制马达或其它一些设备的速度。此外,定时器溢出信号还可以用于触发ADC输入的自动转换过程和DAC输出的数据锁存。
向定时器的P_TimerA_Data(读/写)($700AH)单元或P_TimerB_Data(读/写)($700CH)单元写入一个计数值N后,选择一个合适的时钟源,定时器/计数器将在所选的时钟频率下开始以递增方式计数N,N+1,N+2,…0xFFFE,0xFFFF。当计数达到0xFFFF后,定时器/计数器溢出,产生中断请求信号,被CPU响应后送入中断控制器进行处理。同时,N值将被重新载入定时器/计数器并重新开始计数。
时钟源A和时钟源C是高频时钟源(从图中可以看出,时钟源A和时钟源C的结构是相同的),来自带锁相环的晶体振荡器输出Fosc;时钟源B的频率来自32768Hz实时时钟系统,也就是说,时钟源B可以作为精确的计时器。例如,2Hz定时器可以作为实时时钟的时钟源。
时钟源A和时钟源B的组合,为TimerA提供了多种计数速度。若以ClkA作为门控信号,‘1’表示允许时钟源B信号通过,而‘0’则表示禁止时钟源B信号通过。例如,如果时钟源A为“1”,TimerA时钟频率将取决于时钟源B;如果时钟源A为“0”,将停止TimerA的计数。EXT1和EXT2为外部时钟源。
定时/计数器控制的寄存器:
这是最重要的,单片机的操作说白了就是对寄存器的操作,不管是8位、16位还是32位。
P_Timebase_Setup(写)($700EH)
时基信号发生器通过对P_Timebase_Setup(写)($700EH)单元的编程写入来进行选频操作。
P_Timebase_Clear(写)($700FH)
TimerA的数据单元,用于向16位预置寄存器写入数据(预置计数初值)或从其中读取数据。在写入数值以后,计数器便会在所选择的频率下进行加一计数,直至计数到0xFFFF产生溢出。溢出后P_TimerA_Data中的值将会被重置,再以置入的值继续加一计数。
P_TimerA_Data(读/写)($700AH)
TimerA的数据单元,用于向16位预置寄存器写入数据(预置计数初值)或从其中读取数据。在写入数值以后,计数器便会在所选择的频率下进行加一计数,直至计数到0xFFFF产生溢出。溢出后P_TimerA_Data中的值将会被重置,再以置入的值继续加一计数。
P_TimerA_Ctrl(写)($700BH)
TimerA的控制单元如表5.3所示。用户可以通过设置该单元的第0~5位来选择TimerA的时钟源(时钟源A、B)。设置该单元的第6~9位(如表2.13所示),TimerA将输出不同频率的脉宽调制信号,即对脉宽占空比输出APWMO进行控制。
P_TimerB_Data(读/写)($700CH)
TimerB的数据单元,用于向16位预置寄存器写入数据(预置计数初值)或从其中读取数据。写入数据后,计数器就会以设定的数值往上累加直至溢出。计数初值的计算方法和TimerA相同。
P_TimerB_Ctrl(写)($700DH)
TimerB的控制单元(如表5.7所示)。用户可以通过设置该单元的第0~2位来选择TimerB的时钟源。设置第6~9位,TimerB将输出不同频率的脉宽调制信号,即对脉宽占空比输出BPWMO进行控制。
定时/计数器设置的C函数:
SPCE061.lib中提供了相应的API函数如下所示:
函数原型:
void Set_TimerA_Data(unsigned int);
void Set_TimerB_Data(unsigned int);
功能说明 预置计数器初值
用法
Set_TimerA_Data(TimerA_Data);
Set_TimerB_Data(TimerB_Data);
参数
TimerA_Data = 0xFFFF – (Source A & Source B Frequency) / Desired Frequency
TimerB_Data = 0xFFFF – (Source C Frequency) / Desired Frequency
函数原型
unsigned int Get_TimerA_Data(void);
unsigned int Get_TimerB_Data
凌阳61单片机定时 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)