[资料分享与下载] 飞思卡尔单片机DZ60---TPM1输出比较

[复制链接]
niuyaliang 发表于 2015-2-27 19:16 | 显示全部楼层 |阅读模式
  1. [cpp] view plaincopy
  2. #include <hidef.h> /* for EnableInterrupts macro */  
  3. #include "derivative.h" /* include peripheral declarations */  
  4.   
  5. //输出比较试验   
  6. //定时计数器寄存器(TPMxCNTH:TPMxCNTL)中的值与通道寄存器(TPMxCnVH:TPMxCnVH)相匹配时,会产生一个中断标志位  
  7. //并且会在管理管脚强制执行所选的输出操作。输出比较可以选择用于强制将管脚设置为0或1,翻转管脚电平(本试验采用?  
  8. //或忽略。本试验使能了TPM1中通道0(对应管理管脚为PTD2 ,led3   
  9. //  TPM1中通道1 (对应管理管脚为PTD3?,led4  
  10. //  通道0中断函数中闪烁led1。led3与led1同频率闪烁。  
  11. //  通道1中断函数中闪烁led2。led4与led2同频率闪烁。  
  12.   
  13. #define LED1 PTDD_PTDD0  
  14. #define LED2 PTDD_PTDD1  
  15.   
  16. #define LED1_dir PTDDD_PTDDD0  
  17. #define LED2_dir PTDDD_PTDDD1  
  18.   
  19.   
  20.   
  21. /*************************************************************/  
  22. /*                  初始化总线时钟PEE模式                    */  
  23. /*              外部晶振频率为4MHz,总线频率16MHz            */  
  24. /*************************************************************/  
  25. void INIT_MCG(void)   
  26. {  
  27.   MCGC2=0x36;         
  28.   while(!MCGSC_OSCINIT);      
  29.   MCGC1=0xb8;  
  30.   while(MCGSC_IREFST);  
  31.   while(MCGSC_CLKST!=0b10);  
  32.   MCGC2_LP = 1;  
  33.   MCGC1 = 0x90;  
  34.   MCGC3 = 0x48;      
  35.   MCGC2_LP = 0;  
  36.   while(!MCGSC_PLLST);  
  37.   while(!MCGSC_LOCK);  
  38.   MCGC1 = 0x10;  
  39.   while(MCGSC_CLKST!=0b11);  
  40. }   
  41.   
  42.   
  43. /*************************************************************/  
  44. /*                        初始化LED                          */  
  45. /*************************************************************/  
  46. void INIT_LED(void)   
  47. {  
  48. LED1_dir=1;       //I/O方向为输出  
  49. LED1 = 0;     
  50.    
  51. LED2_dir=1;       //I/O方向为输出  
  52. LED2 = 1;      
  53. }  
  54.   
  55.   
  56. /*************************************************************/  
  57. /*                      初始化TPM1ch0                          */  
  58. /*************************************************************/  
  59. void INIT_TPM1ch0(void)  
  60. {  
  61.   TPM1SC = 0X0F;// TOF = 0; TOIE = 0; CPWMS = 0;  CLKS[B:A] = 01( 总线速率时钟  ); PS = 111;  
  62.                 // 分频系数128,溢出中断禁止,脉冲周期8us  
  63.   
  64.    
  65.   TPM1C0SC = 0X54; //CHnF = 0; CHnIE = 1(通道n中断允许);[MSnB:MSnA] = 01(输出比较)  
  66.                     //[ELSnB:ELSnA]  = 01【比较匹配时外部引脚翻转】 沿 电平控制位,  
  67.    TPM1C0V = 62500 + TPM1CNT;  //比较输出的切换周期为0.5s  
  68. }  
  69.   
  70.   
  71. /*************************************************************/  
  72. /*                      初始化TPM1ch1                        */  
  73. /*************************************************************/  
  74. void INIT_TPM1ch1(void)  
  75. {  
  76.    
  77.   TPM1C1SC = 0X54;          //工作模式为切换比较输出,允许输出比较中断;  
  78.   TPM1C1V = 15625+TPM1CNT;  //比较输出的切换周期为0.125s  
  79. }  
  80.   
  81.   
  82.   
  83.   
  84.   
  85. void main(void)  
  86. {  
  87.   
  88.   DisableInterrupts;  
  89.   SOPT1 = 0;  
  90.    
  91.   INIT_MCG();  
  92.   INIT_LED();  
  93.    
  94.   INIT_TPM1ch0();  
  95.   INIT_TPM1ch1();  
  96.    
  97.   EnableInterrupts;  
  98.    
  99.   
  100.    
  101.   while(1);  
  102.    
  103. }  
  104.   
  105.   
  106.   
  107.   
  108. /*************************************************************/  
  109. /*                 TPM1ch0比较输出中断函数                   */  
  110. /*************************************************************/  
  111. void interrupt 5 TPM1CH0_OUTPUT(void)   
  112. {  
  113.   if(TPM1C0SC_CH0F == 1) //判断是否发生输出比较中断  
  114.   {  
  115.      TPM1C0SC_CH0F = 0; //清除标志位  
  116.      TPM1C0V = 62500+TPM1CNT;  
  117.      LED1 = ~LED1;       //改变LED1的亮灭状态  
  118.   }  
  119. }  
  120.   
  121.   
  122. /*************************************************************/  
  123. /*                 TPM1ch1比较输出中断函数                   */  
  124. /*************************************************************/  
  125. void interrupt 6 TPM1CH1_OUTPUT(void)   
  126. {  
  127.   if(TPM1C1SC_CH1F == 1) //判断是否发生输出比较中断  
  128.   {  
  129.     TPM1C1SC_CH1F = 0;  //清除标志位  
  130.     TPM1C1V = 15625 + TPM1CNT;  
  131.     LED2 = ~LED2;        //改变LED2的亮灭状态  
  132. }  
  133. }  


quray1985 发表于 2015-2-28 10:32 来自手机 | 显示全部楼层
谢谢分享
powerful1 发表于 2015-2-28 13:49 | 显示全部楼层
也来学习学习
cowboy2014 发表于 2015-2-28 16:13 | 显示全部楼层
谢谢楼主分享好例子
您需要登录后才可以回帖 登录 | 注册

本版积分规则

212

主题

2427

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部