合泰单片机之定时器
本章节将介绍HT66F0185的定时器模块及其中断系统。
1. 00HT66F0185芯片定时器介绍
HT66F0185芯片配备了三个独立的定时器模块,为嵌入式应用提供了灵活的时间控制功能:
-
TM0(16位STM定时器):
- 这是一个标准16位定时器,具有较高的时间精度
- 支持定时器基本功能,可用于周期性中断触发
- 内置预分频器,可以调整计数时钟源的分频比
- 适用于需要精确时间基准的应用场景
-
TM1(10位PTM定时器):
- 10位定时器,占用较少的硬件资源
- 特别适合简单的定时任务或低精度要求的时间控制
- 支持脉冲宽度测量功能
- 典型应用包括按键消抖、简单延时等
-
TM2(16位CTM定时器):
- 高性能16位定时器
- 具备输入捕捉功能,可以精确测量外部信号的时间参数
- 支持PWM波形生成,可配置占空比和频率
- 适用于电机控制、LED调光等需要精确波形控制的应用
每个定时器模块都包含以下功能单元:
- 独立的计数寄存器
- 可编程预分频器
- 中断控制逻辑
- 多种工作模式选择寄存器
功能支持:
- 定时功能:可配置定时周期,产生定时中断
- 捕获功能:记录外部事件发生的精确时刻
- 单脉冲输出:可产生精确宽度的单个脉冲
- PWM输出:支持可调占空比的PWM波形生成
- 频率范围:从几Hz到数百kHz(具体取决于系统时钟)
- 占空比分辨率可达10位(1024级)
应用场景举例:
- 实时时钟实现(TM0)
- 按键消抖处理(TM1)
- 直流电机速度控制(TM2 PWM输出)
- 超声波测距(TM2捕获功能)
- 蜂鸣器音调控制(TM2 PWM输出)
这些定时器模块可以独立工作,也可以相互配合使用,为各种嵌入式应用提供灵活的时间控制解决方案。
本章节通过TM0模块实现定时功能,结合中断系统控制CLED实现每秒一次的闪烁效果。

TM0结构示意图
2. TM0定时器介绍
TM0是一个16位定时器模块,其核心由多个功能部件组成协同工作:
-
16位计数器结构
- 采用向上计数模式,计数范围为0x0000-0xFFFF
- 计数器位宽固定为16bit,不能分段使用
- 支持两种时钟源选择:
- 内部时钟(系统时钟分频后)
- 外部时钟(通过特定引脚输入)
-
比较器系统
- 16位比较器A(CCRA):
- 完整比较模式:与计数器的全部16位进行比较
- 匹配时可触发中断或输出特定波形
- 8位比较器P(CCRP):
- 仅与计数器的高8位(bits[15:8])进行比较
- 适用于需要快速比较的应用场景
- 16位比较器A(CCRA):
-
计数器控制机制
- 强制复位方式:
- 通过程序置位TnON控制位,在上升沿触发计数器清零
- 自动清零条件:
- 计数器溢出(0xFFFF→0x0000)
- 与CCRA发生16位全比较匹配
- 中断生成:
- 上述所有清零条件都会产生TM中断信号
- 中断标志需要软件清除
- 强制复位方式:
-
工作模式配置
- 通过配置控制寄存器实现:
- 时钟源选择寄存器
- 模式控制寄存器
- 比较值寄存器
- 中断使能寄存器
- 典型应用场景:
- 精确延时(使用内部时钟)
- 外部事件计数(使用外部时钟)
- PWM波形生成(配合比较器)
- 通过配置控制寄存器实现:
-
运行特性
- 所有配置需在计数器停止时进行
- 比较值在运行时可动态修改
- 计数器状态可实时读取
- 支持单次触发和连续工作模式
该定时器模块通过灵活的可编程性,可以满足多种定时、计数和波形生成的应用需求。在实际使用时,需要根据具体应用场景合理配置各功能寄存器参数。
3. 寄存器说明

3.1 TMnC0寄存器说明

Bit 7 TnPAU:TMn 计数器暂停位
0:运行
1:暂停
通过设置此位为高可使计数器暂停,清零此位恢复正常计数器操作。
Bit 6~ 4 TnCK2~ TnCK0 : 选 择TMn计数时钟位
000 : fS YS/ 4
001 : fS YS
010 : fH/ 16
011 : fH/ 64
100 : fT BC
101 : fH/ 8
110 : T C Kn 上 升 沿 时 钟
111 : T C Kn 下 降 沿 时 钟
此三位用于选择TMn的时钟源。外部引脚时钟源能被选择在上升沿或下降沿有效 。 fSYS是系统时钟 ,f H和fTBC是其它的内 部时钟源。
Bit 3 TnON:T Mn计数器On/Off控制位
0 : Off
1 : On
此位控制TMn的总开关功能。清 零 此位将停止计数器并关闭 TMn减少耗电 。当此位经由低到高转换时,内部计数器将复位清 零
Bit 2~ 0 未定义 ,读为 “ 0”
3.2 TMnC1寄存器说明

Bit 7~ 6 Tn M1~ Tn M0 : 选 择 T M n 工 作 模 式 位
00 : 比 较 匹 配 输 出 模 式
01 : 捕 捉 输 入 模 式
10 : P W M 模 式 或 单 脉 冲 输 出 模 式
11 : 定 时 / 计 数 器 模 式
注 意 : 这 两 位 设 置 T M n 需 要 的 工 作 模 式 。 为 了 确 保 操 作 可 靠 , T M n应 在 T n M1 和 T n M0 位 有 任 何 改 变 前 先 关 掉 。 在 定 时 / 计 数 器 模 式 , T M n输 出 脚 控 制 必 须 除 能 。
Bit 5~ 4 TnIO1~ T nIO0 : 选 择 T Pn 引 脚 输 出 功 能 位
比 较 匹 配 输 出 模 式
00 : 无 变 化
01 : 输 出 低
10 : 输 出 高
11 : 输 出 翻 转
P W M 模 式 / 单 脉 冲 输 出 模 式
00 : 强 制 无 效 状 态
01 : 强 制 有 效 状 态
10 : P W M 输 出
11 : 单 脉 冲 输 出
捕 捉 输 入 模 式
00 : 在 T Pn 上 升 沿 输 入 捕 捉
01 : 在 T Pn 下 降 沿 输 入 捕 捉
10 : 在 T Pn 双 沿 输 入 捕 捉
11 : 输 入 捕 捉 除 能
定 时 / 计 数 器 模 式
未 使 用
注 意 , 由 T nIO1 和 T nI O0 位 得 到 的 输 出 电 平 必 须 与 通 过 T n O C 位 设置 的 初 始 值 不 同 , 否 则 当 比 较 匹 配 发 生 时 , T M n 输 出 脚 将 不 会 发 生 变 化 。在 T Mn 输 出 脚 改 变 状 态 后 , 通 过 T n O N 位 由 低 到 高 电 平 的 转 换 复 位 至 初
始 值 。
Bit 3 T nO C : T M n T Pn 输 出 控 制 位
比 较 匹 配 输 出 模 式
0 : 初 始 低
1 : 初 始 高
P W M 模 式 / 单 脉 冲 输 出 模 式
0 : 低 有 效
1 : 高 有 效
Bit 2 T nPOL : T Mn T Pn 输 出 极 性 控 制 位
0 : 同 相
1 : 反 相
此 位 控 制 T Pn 输 出 脚 的 极 性 。
Bit 1 T nDP X : T M n P W M 周 期 / 占 空 比 控 制 位
0 : CC RP - 周 期 ; C C R A - 占 空 比
1 : CC RP - 占 空 比 ; C C RA - 周 期
Bit 0 T nCCL R : 选 择 T M n 计 数 器 清 零 条 件 位
0 : 比 较 器 P 匹 配
1 : 比 较 器 A 匹 配

4. 代码介绍
1.配置定时器的时钟
//clk = fh/64 = 8000000/64 = 125000,1/125000 = 0.000008,等于一个计数周期为8us
_t0ck2 = 0;
_t0ck1 = 1;
_t0ck0 = 1;
2.配置工作模式
//选择定时模式
_t0m1 = 1;
_t0m2 = 1;
//选择比较器A与计数器比较
_t0cclr = 1;
3.给比较器A赋值
//注意先后顺序,先L后H,8us*625 = 5ms
_tm0al = 625 & 0xff;
_tm0ah = 625 >> 8;
4.配置中断
_mf0e = 1; //多功能中断使能
_t0ae = 1; //比较计数器A匹配中断使能
_mei = 1; //使能总中断
5.打开定时器
_t0on = 1; //打开定时器
6.中断服务函数
DEFINE_ISR(t0isr,0x0c)
{static u8 sec=0;if(_t0af)//中断标志位需要软件清0,中断周期5ms{_t0af=0; if(++sec>=200){sec=0;CLED=~CLED;//LED灯1s闪烁 }} }
5.完整代码
/*
实验准备:连接CX-CXLED跳线帽*/#include "HT66F0185.h"
#define u8 unsigned char
#define u16 unsigned int#define CLED _pa3void delay_ms(u16 ms)
{while(ms--){GCC_DELAY(2000);//编译器自带延时指定个周期,在主频8Mhz下,一个指令周期为0.5us GCC_CLRWDT();}
}void main()
{_wdtc=0xa8;//关闭看门狗_pac3=0;//设置为输出_cos=1;//设置pa3管脚为IO,而不是比较器输出_tm0c0=0x30;//时钟=sys/64=125k t=8us_tm0c1=0xc1;//定时器模式、比较计数器A匹配清0计数器_tm0al=625&0xff;//t=1/(sys/64)*625 s =5ms_tm0ah=625>>8;//注意先后顺序,先L 后H_mf0e=1;//多功能中断使能_t0ae=1;//比较计数器A匹配中断使能_emi=1;//使能总中断_t0on=1;//打开定时器while(1);}DEFINE_ISR(t0isr,0x0c)
{static u8 sec=0;if(_t0af)//中断标志位需要软件清0,中断周期5ms{_t0af=0; if(++sec>=200){sec=0;CLED=~CLED;//LED灯1s闪烁 }} }
