飞思卡尔单片机DZ60---TPM1\TPM2溢出中断

#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */

//TPM中断实验,LED1灯每一秒钟闪烁一次?
//1:时钟来源选择 TPM1SC中的 CLKS[B:A]
//2:可编程的时钟分频器,通过设置TPM1SC中的PS位。
//3:开中断。TPM1SC中的TOIE位?
//4:16位的计数器与比较器设置。即TPM1CNTH与 TPM1MOD?  当两者相等时产生中断置位标志进入中断函数。

#define LED1 PTDD_PTDD0
#define LED2 PTDD_PTDD1

#define LED1_dir PTDDD_PTDDD0
#define LED2_dir PTDDD_PTDDD1



/*************************************************************/
/*                  初始化总线时钟PEE模式                    */
/*              外部晶振频率为4MHz,总线频率16MHz            */
/*************************************************************/
void INIT_MCG(void) 
{
  MCGC2=0x36;        
  while(!MCGSC_OSCINIT);     
  MCGC1=0xb8;
  while(MCGSC_IREFST);
  while(MCGSC_CLKST!=0b10);
  MCGC2_LP = 1;
  MCGC1 = 0x90;
  MCGC3 = 0x48;     
  MCGC2_LP = 0;
  while(!MCGSC_PLLST);
  while(!MCGSC_LOCK);
  MCGC1 = 0x10;
  while(MCGSC_CLKST!=0b11);
} 


/*************************************************************/
/*                        初始化LED                          */
/*************************************************************/
void INIT_LED(void) 
{
 LED1_dir=1;       //I/O方向为输出
 LED1 = 0;   
 
 LED2_dir=1;       //I/O方向为输出
 LED2 = 1;    
}


/*************************************************************/
/*                        初始化TPM1                         */
/*************************************************************/
void INIT_TPM1(void)
{
  TPM1SC = 0X4F;// TOF = 0; TOIE = 1; CPWMS = 0;  CLKS[B:A] = 01( 总线速率时钟  ); PS = 1111;
                // 分频系数128,溢出允许中断,脉冲周期8us
  TPM1CNTH = 0;//任意时刻对TPM1CNTH或TPM1CNTL的写操作将计数寄存器的计数值复位(清零?
  
  TPM1MOD = 62500 - 1; //每62500个脉冲周期计数器溢出一次,溢出周期为62500 * 8us = 500 000us,即0.5s   
}







void main(void) {

  DisableInterrupts;
  SOPT1 = 0;
  EnableInterrupts; /* enable interrupts */
  /* include your code here */
  
  INIT_MCG();
  INIT_LED();
  INIT_TPM1();
  
  while(1);
  
}



/*************************************************************/
/*                   TPM1溢出中断函数                        */
/*************************************************************/
void interrupt 11 TPM1_OVERFLOW(void) 
{
  
    //TPM1SC_TOF == 1,引发中断

    TPM1SC_TOF = 0;//清除溢出标志位
    LED1 = ~LED1;//改变LED1的亮灭状态
  
}








你可能感兴趣的:(飞思卡尔单片机DZ60---TPM1\TPM2溢出中断)