飞思卡尔定时器计时
时间:10-02
整理:3721RD
点击:
我用的是MC9s12xdp512,想通过IC1的上升沿计时,算IC1的频率,可是串口发送speed1和speed2没有数据,这是什么原因啊?
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#define BUS_CLOCK 32000000 //总线频率
#define OSC_CLOCK 16000000 //晶振频率
#define BAUD 9600
#define U PTT_PTT0 //_PTT.Bits.PTT0
#define V PTT_PTT1 //_PTT.Bits.PTT1
#define W PTT_PTT2 //_PTT.Bits.PTT2
#define Z PTT_PTT3 //_PTT.Bits.PTT3
unsigned char count=0,speed1,speed2;
unsigned int speed;
float time;
unsigned char *send,data_receive;
/*************************************************************/
/* 初始化锁相环 */
/*************************************************************/
void INIT_PLL(void)
{
CRGINT = 0; //关中断
CLKSEL_PLLSEL = 0; //在未初始化PLL前不使用PLL的输出作为CPU时钟
#if(BUS_CLOCK == 88000000)
SYNR = 10;
#elif(BUS_CLOCK == 80000000)
SYNR = 9;
#elif(BUS_CLOCK == 72000000)
SYNR = 8;
#elif(BUS_CLOCK == 64000000)
SYNR = 7;
#elif(BUS_CLOCK == 56000000)
SYNR = 6;
#elif(BUS_CLOCK == 48000000)
SYNR = 5;
#elif(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 (CRGFLG_LOCK == 0); //等待PLL锁定频率
CLKSEL_PLLSEL = 1; //选择系统时钟由PLL产生
}
/************************************************************/
/* 初始化ECT模块 */
/************************************************************/
void initialize_ect(void)
{
TSCR1 = 0x80; // 定时器使能位. 1=允许定时器正常工作; 0=使主定时器不起作用(包括计数器)
TIOS = 0x00; //指定通道0为输入捕捉方式
TCTL3 = 0x01;
TCTL4 = 0x95; // 设置通道0为捕捉上升沿方式
//DLYCT = 0x00; // 延迟控制功能禁止
//ICOVW = 0x00; // 对应的寄存器允许被覆盖; NOVWx = 1, 对应的寄存器不允许覆盖
//ICSYS = 0x0a; // 禁止IC及PAC的保持寄存器
PACTL = 0x00; // PAC2和PAC3级联,1代表级联
PBCTL = 0x00; // PAC0和PAC1级联,1代表级联
TIE = 0xf7; // 允许通道0定时中断
TSCR2 = 0x80; // 预分频系数pr2-pr0:111,时钟周期为4us,
TFLG1 = 0xff; // 清除各IC/OC中断标志位
TFLG2 = 0xff; // 清除自由定时器中断标志位
}
/*************************************************************/
/* 初始化SCI */
/*************************************************************/
void INIT_SCI(void)
{
SCI0BD = BUS_CLOCK/16/BAUD; //设置SCI0波特率为9600
SCI0CR1 = 0x00; //设置SCI0为正常模式,八位数据位,无奇偶校验
//SCI0CR2 = 0x2c; //允许发送数据,允许发送中断功能
}
/*************************************************************/
/* 串口发送函数 */
/*************************************************************/
void SCI_send(unsigned char data)
{
while(!SCI0SR1_TDRE); //等待发送数据寄存器(缓冲器)为空
SCI0DRL = data;
}
/*************************************************************/
/* 串口接收函数 */
/*************************************************************/
unsigned char SCI_receive(void)
{
while(!SCI0SR1_RDRF); //等待发送数据寄存器满
return(SCI0DRL);
}
/*************************************************************/
/* 串口中断发送字符串函数 */
/*************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 20 send_string(void)
{
data_receive = SCI_receive();
if(data_receive!=0x00)
{
speed1=speed/256;
speed2=speed%256;
SCI_send(speed1);
SCI_send(speed2);
SCI0CR2 = 0x00;
TSCR1_TEN = 1;
}
}
void interrupt 9 capture1(void)
{
TFLG1_C1F = 1;
time =(count*65535+TC1-TC1H)/32000000*1000000;
speed =(int)(128*60/1024/time);
count=0;
SCI0CR2 = 0x2c;
TSCR1_TEN = 0;
}
void interrupt 16 TOI(void)
{
count++;
TFLG2_TOF=1;
}
#pragma CODE_SEG DEFAULT
/*************************************************************/
/* 主函数 */
/*************************************************************/
void main(void) {
DisableInterrupts;
INIT_PLL();
INIT_SCI();
initialize_ect();
EnableInterrupts;
for(;;)
{
}
}
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#define BUS_CLOCK 32000000 //总线频率
#define OSC_CLOCK 16000000 //晶振频率
#define BAUD 9600
#define U PTT_PTT0 //_PTT.Bits.PTT0
#define V PTT_PTT1 //_PTT.Bits.PTT1
#define W PTT_PTT2 //_PTT.Bits.PTT2
#define Z PTT_PTT3 //_PTT.Bits.PTT3
unsigned char count=0,speed1,speed2;
unsigned int speed;
float time;
unsigned char *send,data_receive;
/*************************************************************/
/* 初始化锁相环 */
/*************************************************************/
void INIT_PLL(void)
{
CRGINT = 0; //关中断
CLKSEL_PLLSEL = 0; //在未初始化PLL前不使用PLL的输出作为CPU时钟
#if(BUS_CLOCK == 88000000)
SYNR = 10;
#elif(BUS_CLOCK == 80000000)
SYNR = 9;
#elif(BUS_CLOCK == 72000000)
SYNR = 8;
#elif(BUS_CLOCK == 64000000)
SYNR = 7;
#elif(BUS_CLOCK == 56000000)
SYNR = 6;
#elif(BUS_CLOCK == 48000000)
SYNR = 5;
#elif(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 (CRGFLG_LOCK == 0); //等待PLL锁定频率
CLKSEL_PLLSEL = 1; //选择系统时钟由PLL产生
}
/************************************************************/
/* 初始化ECT模块 */
/************************************************************/
void initialize_ect(void)
{
TSCR1 = 0x80; // 定时器使能位. 1=允许定时器正常工作; 0=使主定时器不起作用(包括计数器)
TIOS = 0x00; //指定通道0为输入捕捉方式
TCTL3 = 0x01;
TCTL4 = 0x95; // 设置通道0为捕捉上升沿方式
//DLYCT = 0x00; // 延迟控制功能禁止
//ICOVW = 0x00; // 对应的寄存器允许被覆盖; NOVWx = 1, 对应的寄存器不允许覆盖
//ICSYS = 0x0a; // 禁止IC及PAC的保持寄存器
PACTL = 0x00; // PAC2和PAC3级联,1代表级联
PBCTL = 0x00; // PAC0和PAC1级联,1代表级联
TIE = 0xf7; // 允许通道0定时中断
TSCR2 = 0x80; // 预分频系数pr2-pr0:111,时钟周期为4us,
TFLG1 = 0xff; // 清除各IC/OC中断标志位
TFLG2 = 0xff; // 清除自由定时器中断标志位
}
/*************************************************************/
/* 初始化SCI */
/*************************************************************/
void INIT_SCI(void)
{
SCI0BD = BUS_CLOCK/16/BAUD; //设置SCI0波特率为9600
SCI0CR1 = 0x00; //设置SCI0为正常模式,八位数据位,无奇偶校验
//SCI0CR2 = 0x2c; //允许发送数据,允许发送中断功能
}
/*************************************************************/
/* 串口发送函数 */
/*************************************************************/
void SCI_send(unsigned char data)
{
while(!SCI0SR1_TDRE); //等待发送数据寄存器(缓冲器)为空
SCI0DRL = data;
}
/*************************************************************/
/* 串口接收函数 */
/*************************************************************/
unsigned char SCI_receive(void)
{
while(!SCI0SR1_RDRF); //等待发送数据寄存器满
return(SCI0DRL);
}
/*************************************************************/
/* 串口中断发送字符串函数 */
/*************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 20 send_string(void)
{
data_receive = SCI_receive();
if(data_receive!=0x00)
{
speed1=speed/256;
speed2=speed%256;
SCI_send(speed1);
SCI_send(speed2);
SCI0CR2 = 0x00;
TSCR1_TEN = 1;
}
}
void interrupt 9 capture1(void)
{
TFLG1_C1F = 1;
time =(count*65535+TC1-TC1H)/32000000*1000000;
speed =(int)(128*60/1024/time);
count=0;
SCI0CR2 = 0x2c;
TSCR1_TEN = 0;
}
void interrupt 16 TOI(void)
{
count++;
TFLG2_TOF=1;
}
#pragma CODE_SEG DEFAULT
/*************************************************************/
/* 主函数 */
/*************************************************************/
void main(void) {
DisableInterrupts;
INIT_PLL();
INIT_SCI();
initialize_ect();
EnableInterrupts;
for(;;)
{
}
}