库文件提供的
uint32_t TIMER_Open(TIMER_T *timer, uint32_t u32Mode, uint32_t u32Freq)
{
uint32_t u32Clk = TIMER_GetModuleClock(timer);
uint32_t u32Cmpr = 0, u32Prescale = 0;
// Fastest possible timer working freq is (u32Clk / 2). While cmpr = 2, pre-scale = 0.
if(u32Freq > (u32Clk / 2))
{
u32Cmpr = 2;
}
else
{
if(u32Clk > 64000000)
{
u32Prescale = 7; // real prescaler value is 8
u32Clk >>= 3;
}
else if(u32Clk > 32000000)
{
u32Prescale = 3; // real prescaler value is 4
u32Clk >>= 2;
}
else if(u32Clk > 16000000)
{
u32Prescale = 1; // real prescaler value is 2
u32Clk >>= 1;
}
u32Cmpr = u32Clk / u32Freq;
}
timer->CTL = u32Mode | u32Prescale;
timer->CMP = u32Cmpr;
return(u32Clk / (u32Cmpr * (u32Prescale + 1)));
}
这个函数的u32Freq参数官方解释为目标工作频率。这个是如何定义的。比如我目标工作频率72M,是不是这样设置:TIMER_Open(TIMER0, TIMER_PERIODIC_MODE, 72000000);
我的本意是想设置一个2.5ms的定时中断。但好像不行。我的设置如下:
void IMR0_Init(void)
{
//Timer0选择HXT做时钟源,并且不除频
CLK_SetModuleClock(TMR0_MODULE, CLK_CLKSEL1_TMR0SEL_HXT,0);
//使能Timer0的时钟
CLK_EnableModuleClock(TMR0_MODULE);
//初始化Timer0,周期模式,每秒发生一次中断
TIMER_Open(TIMER0, TIMER_PERIODIC_MODE, 72000000);
TIMER_SET_CMP_VALUE(TIMER0, 180000);//修改比较寄存器的值 180000-2.5ms prescale/72*cmp = 25000(us)
TIMER_SET_PRESCALE_VALUE(TIMER0, 0x0);//修改预分频的值
//使能中断
TIMER_EnableInt(TIMER0);
NVIC_EnableIRQ(TMR0_IRQn);
//启动Timer0
TIMER_Start(TIMER0);
}
不知道为啥就是没有实现? |