利用定时器中断实现LED灯变频闪烁
实例比较简单,直接上源码。
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
/***************************************************************************************************
**Description ** 全局变量定义
***************************************************************************************************/
volatile unsigned int timer_int_cnt;
interrupt void cpu_timer0_isr(void);
interrupt void cpu_timer1_isr(void);
interrupt void cpu_timer2_isr(void);
void Gpio_select(void);
void main(void)
{
InitSysCtrl(); // 初始化系统控制,包括看门狗、PLL、外部时钟
Gpio_select(); // 初始化使用到的GPIO口;
DINT; //禁止CPU中断
InitPieCtrl(); //初始化PIE控制寄存器到他们的默认状态,即禁止PIE中断及清除所有PIE中断标志
IER = 0x0000; // 禁止CPU中断
IFR = 0x0000; // 清除所有CPU中断标志
InitPieVectTable();//初始化PIE中断向量表,并使其指向中断服务子程序(ISR)
EALLOW; //解除寄存器保护
PieVectTable.TINT0 = &cpu_timer0_isr; //PIE组1第7个中断为定时器Timer0(外设中断)
PieVectTable.XINT13 = &cpu_timer1_isr; //TINT13为CPU定时器中断Timer1(内部中断源)
PieVectTable.TINT2 = &cpu_timer2_isr; //TINT2为CPU定时器中断Timer2(内部中断源)
EDIS; //寄存器保护
InitCpuTimers(); // 初始化CPU定时器
#if (CPU_FRQ_150MHZ) // 配置CPU定时器 0, 1, and 2 中断周期,150MHzCPU频率, 周期单位为us;
ConfigCpuTimer(&CpuTimer0, 150, 100000); //Timer0定时器中断周期为0.1s
ConfigCpuTimer(&CpuTimer1, 150, 200000); //Timer1定时器中断周期为0.2s
ConfigCpuTimer(&CpuTimer2, 150, 400000); //Timer2定时器中断周期为0.4s
#endif
CpuTimer0Regs.TCR.all = 0x4001; // 设置TIE = 1,开启定时器0中断
CpuTimer1Regs.TCR.all = 0x0001; // 设置TIE = 0,关闭定时器1中断
CpuTimer2Regs.TCR.all = 0x0001; // 设置TIE = 0,关闭定时器2中断
IER |= M_INT1; //使能CPU中断线INT1
IER |= M_INT13; //使能CPU中断线INT13
IER |= M_INT14; //使能CPU中断线INT14
PieCtrlRegs.PIEIER1.bit.INTx7 = 1; //使能PIE组1第七位的使能标志位
EINT; // 使能全局中断INTM
ERTM; // 使能全局实时中断DBGM
timer_int_cnt = 0;
for(;;);
}
interrupt void cpu_timer0_isr(void) //Timer0中断处理函数
{
CpuTimer0.InterruptCount++;
EALLOW;
if(timer_int_cnt++ >= 12)
{
timer_int_cnt = 0;
CpuTimer0Regs.TCR.all = 0x0001; // 设置TIE = 0,关闭定时器0中断
CpuTimer1Regs.TCR.all = 0x4001; // 设置TIE = 1,开启定时器1中断
CpuTimer2Regs.TCR.all = 0x0001; // 设置TIE = 0,关闭定时器2中断
}
GpioDataRegs.GPBTOGGLE.all =0x30000000;
GpioDataRegs.GPCTOGGLE.all =0x00000007;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //PIEACK标志位置位,告诉PIE可以接受本组其他中断处理
EDIS;
}
interrupt void cpu_timer1_isr(void) //Timer1中断处理函数
{
CpuTimer1.InterruptCount++;
EALLOW;
if( timer_int_cnt++ >= 12)
{
timer_int_cnt = 0;
CpuTimer0Regs.TCR.all = 0x0001; // 设置TIE = 0,关闭定时器0中断
CpuTimer1Regs.TCR.all = 0x0001; // 设置TIE = 0,关闭定时器1中断
CpuTimer2Regs.TCR.all = 0x4001; // 设置TIE = 1,开启定时器2中断
}
GpioDataRegs.GPBTOGGLE.all =0x30000000; //对应的GPIO高低电平翻转
GpioDataRegs.GPCTOGGLE.all =0x00000007; //对应的GPIO高低电平翻转
// The CPU acknowledges the interrupt.
EDIS;
}
interrupt void cpu_timer2_isr(void) //Timer2中断处理函数
{
CpuTimer2.InterruptCount++;
EALLOW;
if( timer_int_cnt++ >= 12)
{
timer_int_cnt = 0;
CpuTimer0Regs.TCR.all = 0x4001; // 设置TIE = 1,开启定时器0中断
CpuTimer1Regs.TCR.all = 0x0001; // 设置TIE = 0,关闭定时器1中断
CpuTimer2Regs.TCR.all = 0x0001; // 设置TIE = 0,关闭定时器2中断
}
GpioDataRegs.GPBTOGGLE.all =0x30000000;
GpioDataRegs.GPCTOGGLE.all =0x00000007;
EDIS;
}
void Gpio_select(void)
{
EALLOW;
GpioCtrlRegs.GPAMUX1.all = 0x00000000; // 对应的引脚复用成IO
GpioCtrlRegs.GPAMUX2.all = 0x00000000; // 对应的引脚复用成IO
GpioCtrlRegs.GPBMUX1.all = 0x00000000; // 对应的引脚复用成IO
GpioCtrlRegs.GPBMUX2.all = 0x00000000; // 对应的引脚复用成IO
GpioCtrlRegs.GPCMUX1.all = 0x00000000; // 对应的引脚复用成IO
GpioCtrlRegs.GPCMUX2.all = 0x00000000; // 对应的引脚复用成IO
GpioCtrlRegs.GPADIR.all = 0xFFFFFFFF; // 对应的引脚用作输出
GpioCtrlRegs.GPBDIR.all = 0xFFFFFFFF; // 对应的引脚用作输出
GpioCtrlRegs.GPCDIR.all = 0xFFFFFFFF; // 对应的引脚用作输出
GpioDataRegs.GPBDAT.all =0x30000000; // 设置对应引脚的高低电平
GpioDataRegs.GPCDAT.all =0x00000007; // 设置对应引脚的高低电平
EDIS;
}