我用的是MC9S12XDT256,后来用了MC9S12XDP512,也有这个问题。下面贴上源程序,
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#define LEDCPU PORTK_PK4
#define LEDCPU_dir DDRK_DDRK4
#define LED PORTB
#define LED_dir DDRB
#define BUS_CLOCK 32000000 //总线频率
#define OSC_CLOCK 16000000 //晶振频率
unsigned int delaytime;
unsigned int time1;
unsigned int time2;
unsigned int data = 0x01;
/*************************************************************/
/* 初始化锁相环 */
/*************************************************************/
void INIT_PLL(void)
{
CRGINT = 0; //关中断
CLKSEL_PLLSEL = 0; //在未初始化PLL前不使用PLL的输出作为CPU时钟
#if(BUS_CLOCK == 40000000)
SYNR = 4;
#elif(BUS_CLOCK == 32000000)
SYNR = 3;
#elif(BUS_CLOCK == 24000000)
SYNR = 2;
#endif
REFDV = 1; //PLLCLK=2×OSCCLK×(SYNR+1)/(REFDV+1)=64MHz ,fbus=32M
PLLCTL_PLLON = 1; //开PLL
PLLCTL_AUTO = 1; //选取自动模式
while (CRG标志寄存器_LOCK == 0); //等待PLL锁定频率
CLKSEL_PLLSEL = 1; //选择系统时钟由PLL产生
}
/*************************************************************/
/* 延时函数 */
/*************************************************************/
void delay(void)
{
unsigned int i,j;
for(j=0;j<2;j++)
for(i=0;i<60000;i++)
;
}
/************************************************************/
/* 初始化ECT模块 */
/************************************************************/
void initialize_ect(void){
TSCR1_TFFCA = 1; // 定时器标志位快速清除
TSCR1_TEN = 1; // 定时器使能位. 1=允许定时器正常工作; 0=使主定时器不起作用(包括计数器)
TIOS = 0xfe; //指定通道0为输入捕捉方式
//TCTL4 = 0x01; // 设置通道0为捕捉上升沿方式
TCTL4 = 0x02; // 设置通道0为捕捉下降沿方式
DLYCT = 0x00; // 延迟控制功能禁止
ICOVW = 0x00; // 对应的寄存器允许被覆盖; NOVWx = 1, 对应的寄存器不允许覆盖
ICSYS = 0x00; // 禁止IC及PAC的保持寄存器
TIE = 0x01; // 允许通道0定时中断
TSCR2 = 0x07; // 预分频系数pr2-pr0:111,时钟周期为4us,
T标志寄存器1 = 0xff; // 清除各IC/OC中断标志位
T标志寄存器2 = 0xff; // 清除自由定时器中断标志位
}
/*************************************************************/
/* 输入捕捉中断函数 */
/*************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void capture(void)
{
// DisableInterrupts;
if(T标志寄存器1_C0F == 1)
T标志寄存器1_C0F = 1;
time1 = time2;
time2 = TC0;
delaytime = time2-time1;
LEDCPU = ~LEDCPU;
// EnableInterrupts;
}
/*************************************************************/
/* 主函数 */
/*************************************************************/
void main(void) {
DisableInterrupts;
// INIT_PLL();
//initialize_ect();
//init_pwm();
LEDCPU_dir = 1;
LED_dir = 1;
LED=~data; //点亮LED1
EnableInterrupts;
for(;;)
{ }
}
还请大家帮忙看看,ECT初始化用的是例程的,我觉得没什么问题的啊。后来,接入光栅尺信号,也不会再自动进入输入捕捉中断了。
|