本章节将介绍HT66F0185的定时器模块及其中断系统。

1. 00HT66F0185芯片定时器介绍

HT66F0185芯片配备了三个独立的定时器模块,为嵌入式应用提供了灵活的时间控制功能:

  1. TM0(16位STM定时器):

    • 这是一个标准16位定时器,具有较高的时间精度
    • 支持定时器基本功能,可用于周期性中断触发
    • 内置预分频器,可以调整计数时钟源的分频比
    • 适用于需要精确时间基准的应用场景
  2. TM1(10位PTM定时器):

    • 10位定时器,占用较少的硬件资源
    • 特别适合简单的定时任务或低精度要求的时间控制
    • 支持脉冲宽度测量功能
    • 典型应用包括按键消抖、简单延时等
  3. 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位定时器模块,其核心由多个功能部件组成协同工作:

  1. 16位计数器结构

    • 采用向上计数模式,计数范围为0x0000-0xFFFF
    • 计数器位宽固定为16bit,不能分段使用
    • 支持两种时钟源选择:
      • 内部时钟(系统时钟分频后)
      • 外部时钟(通过特定引脚输入)
  2. 比较器系统

    • 16位比较器A(CCRA):
      • 完整比较模式:与计数器的全部16位进行比较
      • 匹配时可触发中断或输出特定波形
    • 8位比较器P(CCRP):
      • 仅与计数器的高8位(bits[15:8])进行比较
      • 适用于需要快速比较的应用场景
  3. 计数器控制机制

    • 强制复位方式:
      • 通过程序置位TnON控制位,在上升沿触发计数器清零
    • 自动清零条件:
      • 计数器溢出(0xFFFF→0x0000)
      • 与CCRA发生16位全比较匹配
    • 中断生成:
      • 上述所有清零条件都会产生TM中断信号
      • 中断标志需要软件清除
  4. 工作模式配置

    • 通过配置控制寄存器实现:
      • 时钟源选择寄存器
      • 模式控制寄存器
      • 比较值寄存器
      • 中断使能寄存器
    • 典型应用场景:
      • 精确延时(使用内部时钟)
      • 外部事件计数(使用外部时钟)
      • PWM波形生成(配合比较器)
  5. 运行特性

    • 所有配置需在计数器停止时进行
    • 比较值在运行时可动态修改
    • 计数器状态可实时读取
    • 支持单次触发和连续工作模式

该定时器模块通过灵活的可编程性,可以满足多种定时、计数和波形生成的应用需求。在实际使用时,需要根据具体应用场景合理配置各功能寄存器参数。

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 _pa3


void 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闪烁	
		}
	}	
	
}
Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐