本帖最后由 raoxianbin 于 2013-10-11 16:07 编辑
在CCS编程环境中,关于用CPU定时器0的周期中断实现LED灯的闪烁,在这个例子中我存在几个疑问,希望大家解答一下
void InitCpuTimers(void)
{
CpuTimer0.RegsAddr = &CpuTimer0Regs; //使得CpuTimer0.RegsAddr 指向定时器寄存器
CpuTimer0Regs.PRD.all = 0xFFFFFFFF; //初始化CpuTimer0的周期寄存器
CpuTimer0Regs.TPR.all = 0; //初始化定时器预定标计数器
CpuTimer0Regs.TPRH.all = 0;
CpuTimer0Regs.TCR.bit.TSS = 1; //停止定时器
CpuTimer0Regs.TCR.bit.TRB = 1; //将周期寄存器PRD中的值装入计数器寄存器TIM中
CpuTimer0.InterruptCount = 0; //初始化定时器中断计数器
}
/****************************************************************************
*
*名 称:ConfigCpuTimer()
*
*功 能:此函数将使用Freq和Period两个参数来对CPU定时器进行配置。Freq以MHz
* 为单位,Period以us作为单位。
*
*入口参数:*Timer(指定的定时器),Freq,Period
*
*出口参数:无
*
****************************************************************************/
void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period)
{
Uint32 temp;
Timer->CPUFreqInMHz = Freq;
Timer->PeriodInUSec = Period;
temp = (long) (Freq * Period);
Timer->RegsAddr->PRD.all = temp; //给定时器周期寄存器赋值
Timer->RegsAddr->TPR.all = 0; //给定时器预定标寄存器赋值
Timer->RegsAddr->TPRH.all = 0;
// 初始化定时器控制寄存器:
Timer->RegsAddr->TCR.bit.TIF=1; //清除中断标志位
Timer->RegsAddr->TCR.bit.TSS = 1; //停止定时器
Timer->RegsAddr->TCR.bit.TRB = 1; //定时器重装,将定时器周期寄存器的值装入定时器计数器寄存器
Timer->RegsAddr->TCR.bit.SOFT = 1;
Timer->RegsAddr->TCR.bit.FREE = 1;
Timer->RegsAddr->TCR.bit.TIE = 1; //使能定时器中断
Timer->InterruptCount = 0; //初始化定时器中断计数器
}
这是对CPU定时器0的一个初始化函数
void main(void)
{
InitSysCtrl(); //初始化系统函数
DINT;
IER = 0x0000; //禁止CPU中断
IFR = 0x0000; //清除CPU中断标志
InitPieCtrl(); //初始化PIE控制寄存器
InitPieVectTable(); //初始化PIE中断向量表
InitPeripherals(); //初始化Cpu定时器模块
InitGpio(); //初始化GPIO
PieCtrl.PIEIER1.bit.INTx7 =1; //使能PIE模块中的Cpu定时器0的中断
IER|=M_INT1; //开CPU中断
EINT; //使能全局中断
ERTM; //使能实时中断
ConfigCpuTimer(&CpuTimer0, 150, 1000000); //Cpu定时器0的周期为1s
StartCpuTimer0(); //启动Cpu定时器0
for(;;)
{
}
}
这是主函数,我的疑问是
1.在初始化函数中没用对CPU定时器使能,即缺少CpuTimer0Regs.TCR.bit.TIE =1这条语句,这样还会向PIE控制器提出中断请求吗?
2.主函数也没调用CPU的初始化函数,难道不影响吗?
这是一个例子,但是能正常实现,但是我还是存在以上的疑问,希望各位解答一下,谢谢! |