今天对DrvSYS_Delay()函数作了一下测试,用的是官方最新的BSP M051SeriesBSP_CMSIS.ZIP + NuTiny-SDK-M051 + 逻辑分析仪。
测试结果如下:
DrvSYS_Delay (10); //延时10us,实际是15~16us。
DrvSYS_Delay (100); //延时100us,实际是105~106us。
DrvSYS_Delay (1000); //延时1000us,实际是1005~1006us。
总是多5~6us。
去掉延时,直接IO口翻转,延时为2us。
如此算来函数自身的延时=5us-2us=3us。
这样写可以得到准确的延时:
DrvSYS_Delay (10-3-2); //延时10us,实际是9~10us。
DrvSYS_Delay (100-3-2); //延时100us,实际是99~100us。
DrvSYS_Delay (1000-3-2);//延时1000us,实际是999~1000us。
小于5us的直接用NOP算了。
DrvSYS_Delay (xxx-3); //应该是比较准确的xxxus定时。
注意事项:
1、更改时钟后,必须用SystemCoreClockUpdate()更新内核时钟,否则定时时间有错误。
2、由于是用的SysTick定时器来延时,所以一般来说其它中断不会对定时造成影响,除非刚好进入函数和退出函数时产生中断,就会有影响。
测试程序如下:
#include "M051Series.h"
#include "Driver/DrvSYS.h"
#include "Driver/DrvGPIO.h"
int main()
{
SystemInit();
DrvSYS_SelectSysTickSource(2); //改变SysTick时钟源。
SystemCoreClockUpdate(); //更新内核时钟。
while(1)
{
DrvSYS_Delay(100-5);
DrvGPIO_ClrBit (E_PORT3, E_PIN6);
DrvSYS_Delay(100-5);
DrvGPIO_SetBit (E_PORT3, E_PIN6);
}
}
天之蛟龙
2011-06-14 |