打印
[技术问答]

请问新唐在不用定时器的情况下如何精确延时?

[复制链接]
2339|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
凌福义|  楼主 | 2015-3-30 09:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
事情是这样子的,我的MCU只有2个定时器,一个给了ucos的1ms,一个给了别的,我现在需要1us精确延时,只能使用软件延时,示波器测试可以做到,但是无法量化,比如100us是对的 但是10us总是差个1-2us,可能是cache的原因。但是这个如何解决了?
void Delay_us(U8 cnt)
{
    volatile U32 i=cnt*26;
    while(i)
        i--;
}
沙发
戈卫东| | 2015-3-30 10:13 | 只看该作者
软件延时无法保证精确。
产品工艺的变化,中断/DMA等都可能会影响。

使用特权

评论回复
板凳
gaoyang9992006| | 2015-3-30 13:45 | 只看该作者
你用示波器一个一个的调试就好了。

使用特权

评论回复
地板
gaoyang9992006| | 2015-3-30 13:45 | 只看该作者
否则,晶振也都是不准确的,所以你没法都调节好,另外温度又影响晶振。

使用特权

评论回复
5
凌福义|  楼主 | 2015-3-30 13:47 | 只看该作者
戈卫东 发表于 2015-3-30 10:13
软件延时无法保证精确。
产品工艺的变化,中断/DMA等都可能会影响。

但是目前定时器无法进入中断哦   定时器重新配置需要设定什么参数吗、?
sysStopTimer(TIMER0);
        u32ExtFreq = sysGetExternalClock()*1000;//12M
        sysSetTimerReferenceClock(TIMER0, u32ExtFreq); //External Crystal       
        tmp = sysSetTimerEvent(TIMER0, 1000, (PVOID)Timer0Done);
        sysStartTimer(TIMER0, 1000, PERIODIC_MODE);//1000ticks/s=1ms
        sysClearTimerEvent(TIMER0, 1);
    sysprintf("tmp=%d\r\n",tmp);
        sysSetLocalInterrupt(ENABLE_IRQ);

使用特权

评论回复
6
Howard16| | 2015-3-30 16:55 | 只看该作者
新唐的MCU的話都有SYSTICK可以使用
在官方的庫中應該可以找到SYSTICK_delay()
等於是多一組簡單版的Timer

使用特权

评论回复
7
598330983| | 2015-3-30 21:47 | 只看该作者
通过示波器才可以做出来非常精确的延时程序

使用特权

评论回复
8
金则立则翔| | 2015-3-31 09:17 | 只看该作者
   我有点奇怪   为什么有定时器不用   非要用代码来延时

使用特权

评论回复
9
734774645| | 2015-4-4 20:56 | 只看该作者
用示波器观察你的延时函数,然后确定周期数

使用特权

评论回复
10
mintspring| | 2015-4-5 21:13 | 只看该作者
在一个不靠谱的晶振和不确定编译效率的情况下,最好用示波器观察一下,才知道你的延时函数耗费了多久时间。

使用特权

评论回复
11
junou168| | 2015-4-6 08:44 | 只看该作者
最好插入汇编的语句

使用特权

评论回复
12
huangcunxiake| | 2018-9-25 21:12 | 只看该作者
看头文件
clk.h
这里面有实现很容易。

使用特权

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

本版积分规则

4

主题

14

帖子

0

粉丝