最近在学习Z-STACK,我在程序中使用到了定时器,但是自己又不想去写定时器驱动程序,于是想去试试协议栈自带的定时器驱动,我在定时器的回调函数中让它从串口中输出一些调试信息,但是程序执行后我并没有从串口助手中发现我加的调试信息。
我在APP初始化函数中调用定时器的初始化函数,如下所示:
HalTimerConfig(HAL_TIMER_0,HAL_TIMER_MODE_NORMAL,HAL_TIMER_CHANNEL_SINGLE,HAL_TIMER_CH_MODE_OVERFLOW,1,(halTimerCBack_t)&TIMER0_ISR_Handler);
HalTimerStart(HAL_TIMER_0,1000);
我试着连上仿真器看看能发现什么,我在定时器回调中设了断点,然而程序没有执行到那里,我查看了定时器的寄存器信息发现定时器是开启的,定时器的中断标识也是置位的,那么问题就能锁定在定时器中断上面了,我查看了定时器的中断使能寄存器发现定时器的中断使能位并没有置位,那么问题的原因就明了了,是定时器在初始化的时候没有开启定时器中断使能位导致定时器的回调函数没有执行。
我调试了开启定时器中断的那段代码,代码如下:
uint8 HalTimerInterruptEnable (uint8 hwtimerid, uint8 channelMode, bool enable)
{
switch (channelMode)
{
case HAL_TIMER_CH_MODE_OVERFLOW:
if (enable)
{
*(halTimerChannel[hwtimerid].TxOVF) |= halTimerChannel[hwtimerid].ovfbit;
}
else
{
*(halTimerChannel[hwtimerid].TxOVF) &= ((halTimerChannel[hwtimerid].ovfbit) ^ 0xFF);
}
break;
case HAL_TIMER_CH_MODE_OUTPUT_COMPARE:
case HAL_TIMER_CH_MODE_INPUT_CAPTURE:
if (enable)
{
*(halTimerChannel[hwtimerid].TxCCTL) |= T134CCTL_IM;
}
else
{
*(halTimerChannel[hwtimerid].TxCCTL) &= ~(T134CCTL_IM);
}
break;
default:
return HAL_TIMER_INVALID_CH_MODE;
}
if (halTimerRecord[hwtimerid].intEnable)
{
IEN1 |= halTimerChannel[hwtimerid].intbit;
}
else
{
IEN1 &= ((halTimerChannel[hwtimerid].intbit) ^ 0xFF);
}
return HAL_TIMER_OK;
}
当程序执行在IEN1 |= halTimerChannel[hwtimerid].intbit;
的时候定时器的中断使能标志位并没有置位,于是我试着修改了这个程序,修改后的代码如下:
uint8 HalTimerInterruptEnable (uint8 hwtimerid, uint8 channelMode, bool enable)
{
uint8 timer_isr_param[HW_TIMER_MAX] = {IEN1_T1IE,IEN1_T3IE,IEN1_T4IE};
switch (channelMode)
{
case HAL_TIMER_CH_MODE_OVERFLOW:
if (enable)
{
*(halTimerChannel[hwtimerid].TxOVF) |= halTimerChannel[hwtimerid].ovfbit;
}
else
{
*(halTimerChannel[hwtimerid].TxOVF) &= ((halTimerChannel[hwtimerid].ovfbit) ^ 0xFF);
}
break;
case HAL_TIMER_CH_MODE_OUTPUT_COMPARE:
case HAL_TIMER_CH_MODE_INPUT_CAPTURE:
if (enable)
{
*(halTimerChannel[hwtimerid].TxCCTL) |= T134CCTL_IM;
}
else
{
*(halTimerChannel[hwtimerid].TxCCTL) &= ~(T134CCTL_IM);
}
break;
default:
return HAL_TIMER_INVALID_CH_MODE;
}
if (halTimerRecord[hwtimerid].intEnable)
{
// IEN1 |= halTimerChannel[hwtimerid].intbit;
IEN1 |= timer_isr_param[hwtimerid];
}
else
{
// IEN1 &= ((halTimerChannel[hwtimerid].intbit) ^ 0xFF);
IEN1 &= ~timer_isr_param[hwtimerid];
}
return HAL_TIMER_OK;
}
然后我讲编译好的程序写到单片机中,发现串口有输出调试信息。