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