打印
[应用相关]

实在看不下去了,STM32软件精确延时的方法!!!!!!

[复制链接]
51936|81
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhonggx|  楼主 | 2014-9-27 08:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zhonggx 于 2014-9-27 08:22 编辑

/********************************************************************************************************************
** 函数名称: void DelayUs(INT32U dwTime)            Name:     Ivoid DelayUs(INT32U dwTime)
** 功能描述: 微秒级延时函数                                 Function: Delay time in us's
** 输   入: INT32U dwTime: 延时时间                   Input:     INT32U dwTime: Delay times
** 输   出:                                                          Output:   
********************************************************************************************************************/

void DelayUs(INT32U dwTime)
{
    INT32U dwCurCounter=0;                                //当前时间计数值
    INT32U dwPreTickVal=SysTick->VAL;                     //上一次SYSTICK计数值
    INT32U dwCurTickVal;                                  //上一次SYSTICK计数值
    dwTime=dwTime*(RCC_Clocks.HCLK_Frequency/1000000);    //需延时时间,共多少时间节拍
    for(;;){
        dwCurTickVal=SysTick->VAL;
        if(dwCurTickVal<dwPreTickVal){
            dwCurCounter=dwCurCounter+dwPreTickVal-dwCurTickVal;
        }
        else{
            dwCurCounter=dwCurCounter+dwPreTickVal+SysTick->LOAD-dwCurTickVal;
        }
        dwPreTickVal=dwCurTickVal;
        if(dwCurCounter>=dwTime){
            return;
        }
    }
}


沙发
zhonggx|  楼主 | 2014-9-27 08:24 | 只看该作者
不明白为什么老有人在唧唧歪歪说代码执行周期不固定,不会换个思维吗?

使用特权

评论回复
板凳
wm20031015| | 2014-9-27 08:45 | 只看该作者
楼主的眼神不大好,没看出来用的是SysTick->VAL是神马玩意

使用特权

评论回复
地板
zhonggx|  楼主 | 2014-9-27 08:48 | 只看该作者
本帖最后由 zhonggx 于 2014-9-27 08:50 编辑
wm20031015 发表于 2014-9-27 08:45
楼主的眼神不大好,没看出来用的是SysTick->VAL是神马玩意

汗……这个计数器你还要用来做别的事吗?这是在不影响系统节拍定时工作的情况下,借用它来作延时,为什么不这么用?如果你非要用51的方法,我只能说你回去用51吧!!这里不适合你。

使用特权

评论回复
5
mmuuss586| | 2014-9-27 09:08 | 只看该作者

为什么不换个思路写延时程序呢;
你这样程序就是死等,多浪费资源啊;

使用特权

评论回复
6
zhonggx|  楼主 | 2014-9-27 09:15 | 只看该作者
mmuuss586 发表于 2014-9-27 09:08
为什么不换个思路写延时程序呢;
你这样程序就是死等,多浪费资源啊;
...

晕死,是有人需要这样死等的延时函数!!
有些时候用这个样的方法确实也很简单。比如我要延时几个微秒,在系统要求又不是特别高时,这个方法很方便。比如模拟一些时隙操作的时候。
所以,这种函数还是有价值的。不然也不会这么多人问怎么实现了。

使用特权

评论回复
7
yhn1973| | 2014-9-27 10:10 | 只看该作者
只延时几微秒,死等也是很好的方法。不用死等不知道还有什么好的方法没?对于32位机,精确延时就不能再用数指令的方式了。

使用特权

评论回复
8
zhonggx|  楼主 | 2014-9-27 10:41 | 只看该作者
yhn1973 发表于 2014-9-27 10:10
只延时几微秒,死等也是很好的方法。不用死等不知道还有什么好的方法没?对于32位机,精确延时就不能再用数 ...

用定时器加信号量,一般需要操作系统支持。同时需要浪费一个定时器。

使用特权

评论回复
9
lxyppc| | 2014-9-27 10:43 | 只看该作者
zhonggx 发表于 2014-9-27 08:24
不明白为什么老有人在唧唧歪歪说代码执行周期不固定,不会换个思维吗?

看来你比较闲啊

使用特权

评论回复
10
dongranmengming| | 2014-9-27 11:22 | 只看该作者
如果有系统就没了心跳,不上系统还行,但是我不喜欢用,麻烦,不过精确延时的确可以

使用特权

评论回复
11
yoyofair| | 2014-9-27 12:04 | 只看该作者
给大家一个延迟程序,这个很精确

__asm  void IDelayLoop(INT32 count)
{

L1  subs    r0, r0, #6
    bgt     L1         
    BX      lr
}
   
void TimeSleepMicroSeconds( UINT32 uSec )
{
    uSec *= (SYSTEM_CYCLE_CLOCK_HZ / ONE_MHZ);
    int iterations = (int)uSec - 5;

    IDelayLoop(iterations);
}

使用特权

评论回复
评论
myxiaonia 2014-9-28 12:02 回复TA
@xlsbz 好什么,给你指出过来靠指令来延时在cm系列中是不可行的,你还执迷不悟 
xlsbz 2014-9-27 14:56 回复TA
好 ! 不过得理论依据啊。 
12
myxiaonia| | 2014-9-27 12:11 | 只看该作者
这不能算是软件延时吧,都使用了外设

使用特权

评论回复
13
zhonggx|  楼主 | 2014-9-27 13:08 | 只看该作者
dongranmengming 发表于 2014-9-27 11:22
如果有系统就没了心跳,不上系统还行,但是我不喜欢用,麻烦,不过精确延时的确可以 ...

不知所谓,这个根本就不干扰SYSTICK的运作。

使用特权

评论回复
14
xlsbz| | 2014-9-27 14:53 | 只看该作者
一看题目 还以为给个惊喜  结果楼主眼神不好使。systick是软件延时么?

使用特权

评论回复
15
xlsbz| | 2014-9-27 14:54 | 只看该作者
mmuuss586 发表于 2014-9-27 09:08
为什么不换个思路写延时程序呢;
你这样程序就是死等,多浪费资源啊;
...

死等不是所有情况都不能用。简单稳定的就是最好的。

使用特权

评论回复
16
xlsbz| | 2014-9-27 14:59 | 只看该作者
不过还是感谢你参与讨论

使用特权

评论回复
17
xlsbz| | 2014-9-27 15:26 | 只看该作者
本帖最后由 xlsbz 于 2014-9-27 15:28 编辑

while (uint32_t dwTime)
{
     __IO uint32_t  cnt = SysTick->VAL;;
    dwTime--;
}

这个和你的PK一下。

使用特权

评论回复
18
huzi2099| | 2014-9-27 15:43 | 只看该作者
到点儿做事儿而不是等着到点儿做事儿

使用特权

评论回复
19
huayuliang| | 2014-9-27 16:52 | 只看该作者
没看出来有啥问题。。不明白楼主要表达什么~~
systick 俺也常用的··优点无需说。。

使用特权

评论回复
20
zhonggx|  楼主 | 2014-9-27 17:00 | 只看该作者
xlsbz 发表于 2014-9-27 15:26
while (uint32_t dwTime)
{
     __IO uint32_t  cnt = SysTick->VAL;;

能用吗?

使用特权

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

本版积分规则

14

主题

96

帖子

1

粉丝