程序如下,输出比较时间是怎么算出来的
/*---------------------------------------------------------*/
/************************************************************
飞翔科技MC9S12XS128汽车电子开发板
E-mail: 2008f.d@163.com
************************************************************/
/*---------------------------------------------------------*/
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#define LEDCPU PORTK_PK4
#define LEDCPU_dir DDRK_DDRK4
#define BUS_CLOCK 32000000 //总线频率
#define OSC_CLOCK 16000000 //晶振频率
/*************************************************************/
/* 初始化锁相环 */
/*************************************************************/
void INIT_PLL(void)
{
CLKSEL &= 0x7f; //set OSCCLK as sysclk
PLLCTL &= 0x8F; //Disable PLL circuit
CRGINT &= 0xDF;
#if(BUS_CLOCK == 40000000)
SYNR = 0x44;
#elif(BUS_CLOCK == 32000000)
SYNR = 0x43;
#elif(BUS_CLOCK == 24000000)
SYNR = 0x42;
#endif
REFDV = 0x81; //PLLCLK=2×OSCCLK×(SYNDIV+1)/(REFDIV+1)=64MHz ,fbus=32M
PLLCTL =PLLCTL|0x70; //Enable PLL circuit
asm NOP;
asm NOP;
while(!(CRGFLG&0x08)); //PLLCLK is Locked already
CLKSEL |= 0x80; //set PLLCLK as sysclk
}
/************************************************************/
/* 初始化ECT模块 */
/************************************************************/
void initialize_ect(void){
TSCR1_TFFCA = 1; // 定时器标志位快速清除
TSCR1_TEN = 1; // 定时器使能位. 1=允许定时器正常工作; 0=使主定时器不起作用(包括计数器)
TIOS = 0xff; //指定所有通道为输出比较方式
TCTL1 = 0x00; // 后四个通道设置为定时器与输出引脚断开
TCTL2 = 0x00; // 前四个通道设置为定时器与输出引脚断开
TIE = 0x00; // 禁止所有通道定时中断
TSCR2 = 0x07; // 预分频系数pr2-pr0:111,,时钟周期为4us,
TFLG1 = 0xff; // 清除各IC/OC中断标志位
TFLG2 = 0xff; // 清除自由定时器中断标志位
}
/*************************************************************/
/* 初始化LED */
/*************************************************************/
void INIT_LED(void)
{
LEDCPU_dir = 1;
LEDCPU = 0;
}
/*************************************************************/
/* 主函数 */
/*************************************************************/
void main(void) {
DisableInterrupts;
INIT_PLL();
INIT_LED();
initialize_ect();
EnableInterrupts;
for(;;)
{
TFLG1_C0F = 1; //清除标志位
TC0 = TCNT + 31250; //设置输出比较时间为0.125s
while(TFLG1_C0F == 0); //等待,直到发生输出比较事件
TFLG1_C0F = 1; //清除标志位
TC0 = TCNT + 31250; //设置输出比较时间为0.125s
while(TFLG1_C0F == 0); //等待,直到发生输出比较事件
TFLG1_C0F = 1; //清除标志位
TC0 = TCNT + 31250; //设置输出比较时间为0.125s
while(TFLG1_C0F == 0); //等待,直到发生输出比较事件
TFLG1_C0F = 1; //清除标志位
TC0 = TCNT + 31250; //设置输出比较时间为0.125s
while(TFLG1_C0F == 0); //等待,直到发生输出比较事件
LEDCPU = ~LEDCPU; //反转灯的状态
}
}
|