• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

在滴答定时器里用while循环实现s延时不对?

liuxiaofei126 2018-10-10 浏览量:1749

1.png

我延时delay_s(1)但是实际却延时了9秒

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 你的思路有问题,这样的操作不建议,如果你想延时一秒,完全可在滴答定时器的中断中通过计数的方式实现为什么要这样的操作呢?比如你的滴答定时器是一毫秒中断一次,则你在抵达定时器的中断服务程序中计数就可以啊,设定一个变量初始化为0 。滴答定时器中断一次就++ 。然后你主程序中只要判断这个变量是不是等于1000 。如果等于1000就是时间经过了1秒。然后清除这个变量为 0 。如此重复执行就可以啊。
    • 发布于 2018-10-11
    • 举报
    • 评论 2
    • 1
    • 0
liuxiaofei126 回复了 奔跑的黑蚂蚁:还有个问题,如果用中断定时的话,在其他中断程序里调用就麻烦了? 回复
我是假管 回复了 奔跑的黑蚂蚁:我没太明白你的意思,如果你在中断里需要调用延时的话,这样的操作不提倡,中断处理程序是处理意外中断事件的,最好不在中断处理程序中进行延时操作。 回复

其他答案 数量:14

  • 中断里万万不可执行耗时多的指令


    • 发布于2018-10-10
    • 举报
    • 评论 0
    • 0
    • 0

  • 这种while延时是十分浪费单片机资源的
    • 发布于2018-10-10
    • 举报
    • 评论 0
    • 0
    • 0

  •  你的代码不完整吧,delay_s 调用了 delay_ms(1000)  然后就是 delay_us() 函数了。

    delay_ms  代码 和 delay_us 之间什么关系?你这代码看不出来。

    自己排查吧,可以不要 delay_ms 函数,直接单独调用 delay_us  看看有问题么有,有的话往下排查,看看 delay_us 怎么实现的,寄存器值对不对,时钟选的对不对。排查后没问题,就往上分析,delay_ms 怎么调用的 delay_us 对不对,变量初始值,全都排查一遍。

    你这个工程上 rtos 系统了吧,上系统就不要用 systick 了,系统已经用了这个时钟,不要再给 systick 赋初值使能了,整个系统时间基准都被打乱了还暂停,当然时间不准了,换个 timer 试试

    • 发布于2018-10-10
    • 举报
    • 评论 3
    • 0
    • 0
liuxiaofei126 回复了 robe_zhang :delay_ms(1000) 这个肯定有的,ms延时没问题,现在就想实现秒延时,这样应该可以,但是? 回复
wo4fisher 回复了 robe_zhang :看是不是delay_ms()。函数参数使用的是字符类型,1000溢出了 回复
robe_zhang 回复了 liuxiaofei126 :因为你这个是嵌套了好几层的函数,从最底层排查。你直接写个嵌套调用 delay_us(),他有没有问题直接看出来来了。我也想过溢出问题,溢出只会让你延迟变短,不会变长 回复

  • 这个延时的时钟来源是systick,如果systick本身就不准确,那这个延时自然也是 不准的
    • 发布于2018-10-10
    • 举报
    • 评论 0
    • 0
    • 0

  • 从你贴的程序来看,本身是没有问题的。需要从你没有贴出的程序里边来找原因。

    延时有两种办法,如果都使用systick。

    一种是使用中断方式,这种可以直接参考cubemx生成的程序。

    另外一种就是使用查询方式,初始化systick的时候,本身systick是没有开始计时的。只有在调用延时函数的时候,才会开启systick,开始计时。这个时候,需要注意systick的时钟,延时1us的tick数和延时1ms的tick数,这几个参数对了,延时还是相对比较准确的,具体实现可以下载任意原子的程序查看,也不难,参考你贴出的程序,应该很容易做出来。

    • 发布于2018-10-11
    • 举报
    • 评论 0
    • 0
    • 0

  • 中断里面不允许放任何延时,这是嵌入式开发的基本要求吧
    • 发布于2018-10-21
    • 举报
    • 评论 0
    • 0
    • 0

  • 中断里面不能放延时,会使你的系统不能得到及时的响应
    • 发布于2018-10-23
    • 举报
    • 评论 0
    • 0
    • 0

  • 中断里面有延时啊,这个问题比较大
    • 发布于2018-10-30
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个跟你fac_us时基参数有密切关系,另外你的代码是不是加了一些不必要的延时?
    • 发布于2018-10-31
    • 举报
    • 评论 0
    • 0
    • 0

  • 看看外设的晶振与你的这个程序的配置是不是一样的呢
    • 发布于2018-11-05
    • 举报
    • 评论 0
    • 0
    • 0

  • 楼主是怎么测量 的呢,是不是软件仿真的,看看晶振频率设置的是不是对的
    • 发布于2018-11-06
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

在滴答定时器里用while循环实现s延时不对?