应广单片机定时器TIME16配置,关于time16的配置
$T16M sysCLK,/64,BIT15; $T16M sysCLK,/64,BIT15;
选择(SYSCLK/64)当Timer16时钟源,每2^16个时钟周期产生一次INTRQ.2=1系统时钟 System Clock = HRC /2=8 MHz
sysclk/64=8 MHz/64=125 kHz,约每524 mS产生一次INTRQ.2=1
两个注意点的点:时钟源和BIT?记得2的BIT?+1次方,这个数是产生中断的时间
入下面的代码
#include "extern.h"
BIT LED_G : PA.3;
#define GRE_LED_FLASH {if(LED_G){LED_G=0;}else{ LED_G=1;}}
// $ LED_G toggle; //翻转SW信号
/*****************LED*******************/
word ucFlashTmrCnt;
BIT ubMsFlag;
/****************系统时钟*********************/
bit FLAG_NMS;
byte count;
word usTmrCnt;
/**************T16*************************/
void TIME16_Init(void)
{
/*设置计数值*/
usTmrCnt=0;//488;
ubMsFlag=0;
/*定时器配置*/
$ T16M IHRC, /1, BIT11; //16MHz / 1 = 16MHz : the time base of T16.
INTEN.T16 =1;/*开启定时中断*/
Intrq.T16 =0;/*清除中断请求*/
}
void FPPA0 (void)
{
.ADJUST_IC SYSCLK=IHRC/8, IHRC=16MHz, VDD=3.3V;
$ CLKMD IHRC/8,En_IHRC,En_ILRC;
/*上电延时*/
.delay 40000;
/*端口配置*/
$ LED_G OUT,HIGH;
/*定时器配置*/
TIME16_Init();
ENGINT //全局中断开启
while (1)
{
}
}
void Interrupt ( void )
{
pushaf;
if ( Intrq.T16 )
{
Intrq.T16 = 0;
/*重新设置计数值*/
STT16 usTmrCnt;
$ LED_G toggle;
}
popaf;
}
计算方式:
$ T16M IHRC, /1, BIT11;
IHRC = 16M
BIT11 -> 2的11+1次方 = 4096
所以中断的频率 = 16M (分频系数1如果是其他 除以相对应的数值 )除以4096 = 0.00390M
= 3.9K 大概是这个频率
因为我们再中断函数里面做gpio翻转,所以可以使用示波器进行测试核对。
另外计定时计数器的数值一直向上计数,计数的储值也可以设置,使用stt16 ,这样可以更灵活的设置定时中断的时间。
/****************系统时钟*********************/
bit FLAG_NMS;
byte count;
word usTmrCnt;
/**************T16*************************/
void TIME16_Init(void)
{
/*设置计数值*/
usTmrCnt=488;
ubMsFlag=0;
/*定时器配置*/
$ T16M IHRC, /1, BIT11; //16MHz / 1 = 16MHz : the time base of T16.
INTEN.T16 =1;/*开启定时中断*/
Intrq.T16 =0;/*清除中断请求*/
}
void Interrupt ( void )
{
pushaf;
if ( Intrq.T16 )
{
Intrq.T16 = 0;
/*重新设置计数值*/
STT16 usTmrCnt;
}
popaf;
}
第一次使用这款单片机,有可能理解有误,如果是朋友们看待错误,希望留言指出,大家一起学习用好这款单片机。