打印
[资料分享与下载]

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

[复制链接]
1469|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
niuyaliang|  楼主 | 2015-2-27 19:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[cpp] view plaincopy
#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的亮灭状态  
   
}  


相关帖子

沙发
powerful1| | 2015-2-27 20:34 | 只看该作者
谢谢分享

使用特权

评论回复
板凳
Vitality1| | 2015-2-27 21:00 | 只看该作者
学习一下

使用特权

评论回复
地板
ccw1986| | 2015-2-28 08:40 | 只看该作者
谢谢分享,赞

使用特权

评论回复
5
focus_447| | 2015-4-23 11:03 | 只看该作者
挺清晰的,同时,我有一个问题,如果在溢出中断处理函数里面,对TPM1MOD重新赋值,是否可以起到改变定时时间的效果???

使用特权

评论回复
6
xiaoyaapple| | 2015-11-21 22:08 | 只看该作者
TPM1MOD = 62500 - 1;请问为什么要减1?????

使用特权

评论回复
7
quray1985| | 2015-11-22 17:14 | 只看该作者
麻烦问一下,这个溢出中断有什么用处呢

使用特权

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

本版积分规则

212

主题

2427

帖子

7

粉丝