打印
[资料分享与下载]

飞思卡尔单片机DZ60---TPM1输出比较

[复制链接]
2194|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
niuyaliang|  楼主 | 2015-2-27 19:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[cpp] view plaincopy
#include <hidef.h> /* for EnableInterrupts macro */  
#include "derivative.h" /* include peripheral declarations */  
  
//输出比较试验   
//定时计数器寄存器(TPMxCNTH:TPMxCNTL)中的值与通道寄存器(TPMxCnVH:TPMxCnVH)相匹配时,会产生一个中断标志位  
//并且会在管理管脚强制执行所选的输出操作。输出比较可以选择用于强制将管脚设置为0或1,翻转管脚电平(本试验采用?  
//或忽略。本试验使能了TPM1中通道0(对应管理管脚为PTD2 ,led3   
//  TPM1中通道1 (对应管理管脚为PTD3?,led4  
//  通道0中断函数中闪烁led1。led3与led1同频率闪烁。  
//  通道1中断函数中闪烁led2。led4与led2同频率闪烁。  
  
#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;      
}  
  
  
/*************************************************************/  
/*                      初始化TPM1ch0                          */  
/*************************************************************/  
void INIT_TPM1ch0(void)  
{  
  TPM1SC = 0X0F;// TOF = 0; TOIE = 0; CPWMS = 0;  CLKS[B:A] = 01( 总线速率时钟  ); PS = 111;  
                // 分频系数128,溢出中断禁止,脉冲周期8us  
  
   
  TPM1C0SC = 0X54; //CHnF = 0; CHnIE = 1(通道n中断允许);[MSnB:MSnA] = 01(输出比较)  
                    //[ELSnB:ELSnA]  = 01【比较匹配时外部引脚翻转】 沿 电平控制位,  
   TPM1C0V = 62500 + TPM1CNT;  //比较输出的切换周期为0.5s  
}  
  
  
/*************************************************************/  
/*                      初始化TPM1ch1                        */  
/*************************************************************/  
void INIT_TPM1ch1(void)  
{  
   
  TPM1C1SC = 0X54;          //工作模式为切换比较输出,允许输出比较中断;  
  TPM1C1V = 15625+TPM1CNT;  //比较输出的切换周期为0.125s  
}  
  
  
  
  
  
void main(void)  
{  
  
  DisableInterrupts;  
  SOPT1 = 0;  
   
  INIT_MCG();  
  INIT_LED();  
   
  INIT_TPM1ch0();  
  INIT_TPM1ch1();  
   
  EnableInterrupts;  
   
  
   
  while(1);  
   
}  
  
  
  
  
/*************************************************************/  
/*                 TPM1ch0比较输出中断函数                   */  
/*************************************************************/  
void interrupt 5 TPM1CH0_OUTPUT(void)   
{  
  if(TPM1C0SC_CH0F == 1) //判断是否发生输出比较中断  
  {  
     TPM1C0SC_CH0F = 0; //清除标志位  
     TPM1C0V = 62500+TPM1CNT;  
     LED1 = ~LED1;       //改变LED1的亮灭状态  
  }  
}  
  
  
/*************************************************************/  
/*                 TPM1ch1比较输出中断函数                   */  
/*************************************************************/  
void interrupt 6 TPM1CH1_OUTPUT(void)   
{  
  if(TPM1C1SC_CH1F == 1) //判断是否发生输出比较中断  
  {  
    TPM1C1SC_CH1F = 0;  //清除标志位  
    TPM1C1V = 15625 + TPM1CNT;  
    LED2 = ~LED2;        //改变LED2的亮灭状态  
}  
}  


相关帖子

沙发
quray1985| | 2015-2-28 10:32 | 只看该作者
谢谢分享

使用特权

评论回复
板凳
powerful1| | 2015-2-28 13:49 | 只看该作者
也来学习学习

使用特权

评论回复
地板
cowboy2014| | 2015-2-28 16:13 | 只看该作者
谢谢楼主分享好例子

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

212

主题

2427

帖子

7

粉丝