[资料分享与下载] 【转】飞思卡尔单片机DZ60---TPM1\TPM2溢出中断

[复制链接]
2091|6
niuyaliang 发表于 2015-2-27 19:12 | 显示全部楼层 |阅读模式
  1. [cpp] view plaincopy
  2. #include <hidef.h> /* for EnableInterrupts macro */  
  3. #include "derivative.h" /* include peripheral declarations */  
  4.   
  5. //TPM中断实验,LED1灯每一秒钟闪烁一次?  
  6. //1:时钟来源选择 TPM1SC中的 CLKS[B:A]  
  7. //2:可编程的时钟分频器,通过设置TPM1SC中的PS位。  
  8. //3:开中断。TPM1SC中的TOIE位?  
  9. //4:16位的计数器与比较器设置。即TPM1CNTH与 TPM1MOD?  当两者相等时产生中断置位标志进入中断函数。  
  10.   
  11. #define LED1 PTDD_PTDD0  
  12. #define LED2 PTDD_PTDD1  
  13.   
  14. #define LED1_dir PTDDD_PTDDD0  
  15. #define LED2_dir PTDDD_PTDDD1  
  16.   
  17.   
  18.   
  19. /*************************************************************/  
  20. /*                  初始化总线时钟PEE模式                    */  
  21. /*              外部晶振频率为4MHz,总线频率16MHz            */  
  22. /*************************************************************/  
  23. void INIT_MCG(void)   
  24. {  
  25.   MCGC2=0x36;         
  26.   while(!MCGSC_OSCINIT);      
  27.   MCGC1=0xb8;  
  28.   while(MCGSC_IREFST);  
  29.   while(MCGSC_CLKST!=0b10);  
  30.   MCGC2_LP = 1;  
  31.   MCGC1 = 0x90;  
  32.   MCGC3 = 0x48;      
  33.   MCGC2_LP = 0;  
  34.   while(!MCGSC_PLLST);  
  35.   while(!MCGSC_LOCK);  
  36.   MCGC1 = 0x10;  
  37.   while(MCGSC_CLKST!=0b11);  
  38. }   
  39.   
  40.   
  41. /*************************************************************/  
  42. /*                        初始化LED                          */  
  43. /*************************************************************/  
  44. void INIT_LED(void)   
  45. {  
  46. LED1_dir=1;       //I/O方向为输出  
  47. LED1 = 0;     
  48.    
  49. LED2_dir=1;       //I/O方向为输出  
  50. LED2 = 1;      
  51. }  
  52.   
  53.   
  54. /*************************************************************/  
  55. /*                        初始化TPM1                         */  
  56. /*************************************************************/  
  57. void INIT_TPM1(void)  
  58. {  
  59.   TPM1SC = 0X4F;// TOF = 0; TOIE = 1; CPWMS = 0;  CLKS[B:A] = 01( 总线速率时钟  ); PS = 1111;  
  60.                 // 分频系数128,溢出允许中断,脉冲周期8us  
  61.   TPM1CNTH = 0;//任意时刻对TPM1CNTH或TPM1CNTL的写操作将计数寄存器的计数值复位(清零?  
  62.    
  63.   TPM1MOD = 62500 - 1; //每62500个脉冲周期计数器溢出一次,溢出周期为62500 * 8us = 500 000us,即0.5s     
  64. }  
  65.   
  66.   
  67.   
  68.   
  69.   
  70.   
  71.   
  72. void main(void) {  
  73.   
  74.   DisableInterrupts;  
  75.   SOPT1 = 0;  
  76.   EnableInterrupts; /* enable interrupts */  
  77.   /* include your code here */  
  78.    
  79.   INIT_MCG();  
  80.   INIT_LED();  
  81.   INIT_TPM1();  
  82.    
  83.   while(1);  
  84.    
  85. }  
  86.   
  87.   
  88.   
  89. /*************************************************************/  
  90. /*                   TPM1溢出中断函数                        */  
  91. /*************************************************************/  
  92. void interrupt 11 TPM1_OVERFLOW(void)   
  93. {  
  94.    
  95.     //TPM1SC_TOF == 1,引发中断  
  96.   
  97.     TPM1SC_TOF = 0;//清除溢出标志位  
  98.     LED1 = ~LED1;//改变LED1的亮灭状态  
  99.    
  100. }  


powerful1 发表于 2015-2-27 20:34 | 显示全部楼层
谢谢分享
Vitality1 发表于 2015-2-27 21:00 | 显示全部楼层
学习一下
ccw1986 发表于 2015-2-28 08:40 | 显示全部楼层
谢谢分享,赞
focus_447 发表于 2015-4-23 11:03 | 显示全部楼层
挺清晰的,同时,我有一个问题,如果在溢出中断处理函数里面,对TPM1MOD重新赋值,是否可以起到改变定时时间的效果???
xiaoyaapple 发表于 2015-11-21 22:08 | 显示全部楼层
TPM1MOD = 62500 - 1;请问为什么要减1?????
quray1985 发表于 2015-11-22 17:14 | 显示全部楼层
麻烦问一下,这个溢出中断有什么用处呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

212

主题

2427

帖子

7

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