赞
踩
请参照第二章第一节新建工程
——》第二章 点亮第一个LED灯
简易型 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输出。
本章我们将用到中断,这里使用的是硬件中断(Hardware Interrupt),下面简单的介绍一下中断的逻辑。
中断是指MCU运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。
下图为HT66F1085的中断结构。我们将使用TIM0,所以我们需要根据下图查找到TIM0的中断向量(0x0C)
我们实现的功能: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){ //无任何执行 } }
工程链接—》定时器
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。