微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 飞思卡尔定时器计时

飞思卡尔定时器计时

时间: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(;;)
  {      
  }                          
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top