打印
[Cortex-M0技术交流]

DrvSYS_Delay()函数测试心得

[复制链接]
6474|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
今天对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

直接IO翻转.jpg (4.89 KB )

直接IO翻转.jpg

相关帖子

沙发
Swallow_0322| | 2011-6-14 17:43 | 只看该作者
沙发!

使用特权

评论回复
板凳
hotpower| | 2011-6-14 20:56 | 只看该作者
这些实验数据不一定太准,一般应用就可以了。

使用特权

评论回复
地板
CC2530| | 2011-6-15 11:08 | 只看该作者
太幸福了,有逻辑分析仪用。

使用特权

评论回复
5
tjx727| | 2011-8-22 20:49 | 只看该作者
太幸福了,有逻辑分析仪用。
CC2530 发表于 2011-6-15 11:08

简单版的逻辑分析仪很便宜

使用特权

评论回复
6
电子write_cai| | 2011-8-22 23:43 | 只看该作者
不错

使用特权

评论回复
7
cecwxf| | 2011-8-26 08:24 | 只看该作者
5# tjx727 我自己想买个  多少钱?

使用特权

评论回复
8
giant0913| | 2011-9-30 17:12 | 只看该作者
不错,mark下,呵呵

使用特权

评论回复
9
wlx583193113| | 2012-3-25 22:07 | 只看该作者
int main (void)
{
    unsigned char w;
    unsigned char i;
    //---------------------------------------------------------
        DrvSYS_UnlockProtectedReg();//解锁写保护寄存器       
         SYSCLK->PWRCON.XTL12M_EN = 1;
         while (DrvSYS_GetChipClockSourceStatus(E_SYS_XTL12M) != 1);
         SYSCLK->PWRCON.XTL32K_EN =1;
         while (DrvSYS_GetChipClockSourceStatus(E_SYS_XTL32K) != 1);
         SYSCLK->PWRCON.OSC22M_EN = 1;
          while (DrvSYS_GetChipClockSourceStatus(E_SYS_OSC22M) != 1);
         SYSCLK->PWRCON.OSC10K_EN = 1;
         while (DrvSYS_GetChipClockSourceStatus(E_SYS_OSC10K) != 1);
    //     DrvSYS_Open(25000000);
         DrvSYS_SelectSysTickSource(3);//
         SystemCoreClockUpdate();
        DrvSYS_LockProtectedReg();//写保护寄存器
    //---------------------------------------------------------
       
        for(i=0;i<8;i++)
        {
          DrvGPIO_Open(E_GPA,i, E_IO_OUTPUT);
        }
        
        while(1)
        {
            w=0x01;
            for(i=0;i<8;i++)
            {
              DrvGPIO_SetPortBits(E_GPA,~w);
             DrvSYS_Delay(500000);
              w<<=1;
            }       
        }

}
我这段代码也是用SISTICK时钟源 延时用的  
现在的问题是我更改时钟源,DrvSYS_Delay(500000);延时的时间感觉还是一样  
请问问题出在哪里,,请指教???

使用特权

评论回复
10
西行侠客| | 2013-1-27 15:04 | 只看该作者
不错,以前一直测试不准,这下可以精确一点了

使用特权

评论回复
11
缥缈九哥| | 2013-1-28 09:53 | 只看该作者
不错,

使用特权

评论回复
12
jstele| | 2013-2-23 13:59 | 只看该作者
寫的真好   我一直都測不準   :victory:

使用特权

评论回复
13
西行侠客| | 2013-4-25 10:53 | 只看该作者
直接nop?12M的晶振一个周期是0.083us,写1us要12个nop吗?

使用特权

评论回复
14
chenzhi658| | 2013-4-25 12:18 | 只看该作者
:lol

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

86

帖子

1

粉丝