[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的亮灭状态
}
|