今天对DrvTIMER_Delay()函数作了一下测试,用的是官方最新的BSP M051SeriesBSP_CMSIS.ZIP + NuTiny-SDK-M051 + 逻辑分析仪。
测试结果如下:
DrvTIMER_Delay(0); //延时0ms,死在里面了!
DrvTIMER_Delay(1); //延时1ms,实际是2ms。
DrvTIMER_Delay(10); //延时10ms,实际是11ms。
打开该函数看到:
void DrvTIMER_Delay(E_TIMER_CHANNEL ch, uint32_t uIntTicks)
{
uint32_t volatile btime;
btime = DrvTIMER_GetIntTicks(ch);
while (1) <--?
{
if ((DrvTIMER_GetIntTicks(ch) - btime) > uIntTicks) <--???!!
{
break;
}
}
}
将 if ((DrvTIMER_GetIntTicks(ch) - btime) > uIntTicks)
改成 if ((DrvTIMER_GetIntTicks(ch) - btime) >= uIntTicks)
问题解决。
测试结果如下:
DrvTIMER_Delay(0); //有8~9us的延时,不会死在里面。
DrvTIMER_Delay(1); //延时1ms,实际是1ms。
DrvTIMER_Delay(10); //延时10ms,实际是10ms。
这个函数的写法感觉有点啰嗦。
改成如下更好:
void DrvTIMER_Delay(E_TIMER_CHANNEL ch, uint32_t uIntTicks)
{
uint32_t volatile btime;
btime = DrvTIMER_GetIntTicks(ch);
while((DrvTIMER_GetIntTicks(ch) - btime) < uIntTicks);
}
测试效果同上。
测试程序如下:
#include "M051Series.h"
#include "Driver/DrvSYS.h"
#include "Driver/DrvGPIO.h"
#include "Driver/DrvTIMER.h"
int main()
{
DrvTIMER_Init();
DrvSYS_SelectIPClockSource(E_SYS_TMR0_CLKSRC, 0);
DrvTIMER_Open(E_TMR0, 1000, E_PERIODIC_MODE); //每秒1000Tick,1ms/tick
DrvTIMER_EnableInt(E_TMR0);
DrvTIMER_Start(E_TMR0);
while(1)
{
DrvTIMER_Delay (E_TMR0, 10);
DrvGPIO_ClrBit (E_PORT3, E_PIN6);
DrvTIMER_Delay (E_TMR0, 10);
DrvGPIO_SetBit (E_PORT3, E_PIN6);
}
}
天之蛟龙
2011-06-14 |