当前位置:   article > 正文

HT合泰单片机入门教程(第四章 定时器)_合泰输入捕获

合泰输入捕获


系列文章目录

第一章 HT单片机环境搭建

第二章 点亮第一个LED灯

第三章 按键

第四章 定时器

第五章 PWM

第六章 时基中断

第七章 LCD


前言

定时器是单片机的基本配置,其主要作为时间的控制和量测,或时间次数的计数。提供以下功能:定时器/计数器、输入捕获、比较匹配输出、单脉冲输出以及PWM信号产生。 这里我们先实现定时计数功能。其他的功能我们后面再详细介绍。

一、新建工程

请参照第二章第一节新建工程
——》第二章 点亮第一个LED灯

二、定时器计数功能实现

1.定时器了解

简易型 TM 核心是一个由用户选择的内部或外部时钟源驱动的 16 位向上计数器,它还包括两个内部比较器即比较器 A 和比较器 P。这两个比较器将计数器的值与 CCRP 和 CCRA 寄存器中的值进行比较。CCRP 是 8 位的,与计数器的高 8 位比较;而 CCRA 是 16 位的,与计数器的所有位比较。 通过应用程序改变 16 位计数器值的唯一方法是使 TnON 位发生上升沿跳变清除 计数器。此外,计数器溢出或比较匹配也会自动清除计数器。上述条件发生时, 通常情况会产生 TM 中断信号。简易型 TM 可工作在不同的模式,可由包括来自输入脚的不同时钟源驱动,也可以控制输出脚。所有工作模式的设定都是通过设置相关寄存器来实现的。
定时器

其中n代表是哪一个定时器。
例如使用TIM0,那么上述的n就应该替换为0。TIM1对应的寄存器为:TM0C0\TM0C1\TM0DL\TM0CH。定时器
本章实验使用的比较器A,很多人分不清比较器A和比较器P的区别,这里总结一下两者的区别。
比较器A:在计数过程中,TM会将TMnD的计数值与TMnA寄存器的设定值进行比对(TMnA由TMnAH、TMnAL寄存器组成);一般用作定时功能。
比较器P:在计数过程中,TM会将TMnD的计数值与TMnRP寄存器的设定值进行比对;使用时搭配TMnRPH、TMnRPL寄存器,用作PWM输出。

2.中断了解

本章我们将用到中断,这里使用的是硬件中断(Hardware Interrupt),下面简单的介绍一下中断的逻辑。
中断是指MCU运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。
中断
下图为HT66F1085的中断结构。我们将使用TIM0,所以我们需要根据下图查找到TIM0的中断向量(0x0C)
中断结构

三、定时器实现

1.代码实现

我们实现的功能:1sLED状态发生一次翻转。

#include "HT66F0185.h"


/*******************************************************************************
 * @fn		delayMs	
 * @brief	延时函数
 * @param	延时时间 单位为ms
 * @return	无
 *******************************************************************************/
void delayMs(unsigned long int ms){
	
	while(ms--)
		GCC_DELAY(2000);//主频8Mhz,执行一条指令为0.5us。一条指令周期等于四条机器周期——》 1/8Mhz * 4 = 0.5us
}

/*******************************************************************************
 * @fn		tim0Init	
 * @brief	TIM0初始化
 * @param	无
 * @return	无
 *******************************************************************************/
void tim0Init(void){
	
	_tm0c0 = 0x30;//TIM0时钟 = sys / 64; TIM0时钟 = 8MHz / 64 = 125kHz;
	_tm0c1 = 0xc1;//定时器模式、比较计数器A匹配清0计数器 计数器计数一次为0.0008ms
	_tm0al = 625 & 0xff;//0.0008ms * 625 = 5ms
	_tm0ah = 625 >> 8;//tm0ah寄存器为8位,625 = 0000 0010 0111 0001; tm0ah填入值,右移取高八位,即 0000 0010
	
	_mf0e = 1;//多功能中断使能
	_t0ae = 1;//比较计数器A匹配中断使能
	_emi = 1;//使能总中断
	
	_t0on = 1;//打开定时器
}


/*******************************************************************************
 * @fn		t0isr	
 * @brief	TIM0中断函数,t0isr为函数名称(自定义即可)0x0c为中断向量(需根据中断表查找)
 * @param	无
 * @return	无
 *******************************************************************************/
DEFINE_ISR(t0isr,0x0c){
	static unsigned char sec = 0;
	if(_t0af){//比较器A匹配中断标志位置1
		_t0af = 0;//中断标志位需要软件清0
		if(++sec >= 200){
			sec = 0;
			_pa3 = ~_pa3;//LED状态翻转	
		}
	}	
	
}

/*******************************************************************************
 * @fn		main	
 * @brief	主函数
 * @param	无
 * @return	无
 *******************************************************************************/
void main(){
	_wdtc = 0b10101000;//关闭看门狗。直接配置看门狗寄存器,0b代表二进制。
	
	/*LED设置*/
	_pac3 = 0;//设置PA3口为输出
	_pa3 = 1; //开机时灯亮
	_cos=1;//设置pa3管脚为IO,而不是比较器输出
		
	/*定时器初始化*/	
	tim0Init();
	
	/*死循环*/
	while(1){
		//无任何执行
	}
	
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78

工程链接—》定时器


总结

定时器和中断功能的加入,使得单片机可以执行更复杂的操作。可以根据优先级来打断当前执行的语句,执行需要立即执行的语句或功能。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/565743
推荐阅读
  

闽ICP备14008679号