OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4697|回复: 4

freertos delay_us 不准确,求助

[复制链接]

1

主题

5

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2019-6-16
在线时间
4 小时
发表于 2019-7-3 00:01:22 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 xiaohuangyi 于 2019-7-3 00:11 编辑

delay.c 也移植了,在task 里面while(1) delay_us(100) 后,port 反转一下,软件仿真看,真实delay只有67us 这个样子,感觉差了三分之二,大概会是什么原因造成的呢?
  1. while(1){
  2.       delay_us(100);
  3.       MOTOR_IN0=~MOTOR_IN0;
  4.         }
复制代码
  1. void delay_us(u32 nus)
  2. {               
  3.         u32 ticks;
  4.         u32 told,tnow,tcnt=0;
  5.         u32 reload=SysTick->LOAD;                                //LOAD的值                     
  6.         ticks=nus*fac_us;                                                 //需要的节拍数
  7.         //ticks=nus*100;                                                 //需要的节拍数
  8.         told=SysTick->VAL;                                        //刚进入时的计数器值
  9.         while(1)
  10.         {
  11.                 tnow=SysTick->VAL;        
  12.                 if(tnow!=told)
  13.                 {            
  14.                         if(tnow<told)tcnt+=told-tnow;        //这里注意一下SYSTICK是一个递减的计数器就可以了.
  15.                         else tcnt+=reload-tnow+told;            
  16.                         told=tnow;
  17.                         if(tcnt>=ticks)break;                        //时间超过/等于要延迟的时间,则退出.
  18.                 }  
  19.         };                                                                                    
  20. }  
复制代码



最佳答案

查看完整内容[请看2#楼]

已经找出原因了,在外部时钟频率设置成了12M, 改为8M就好了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2019-6-16
在线时间
4 小时
 楼主| 发表于 2019-7-3 00:01:23 | 显示全部楼层
xiaohuangyi 发表于 2019-7-4 22:51
我感觉那个delay_us的函数应该没有错,官方的就是这样的。

已经找出原因了,在外部时钟频率设置成了12M, 改为8M就好了
回复

使用道具 举报

5

主题

63

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2018-6-15
在线时间
28 小时
发表于 2019-7-3 19:31:56 | 显示全部楼层
  1. RT_WEAK void rt_hw_us_delay(rt_uint32_t us)
  2. {
  3.     rt_uint32_t delta;
  4.     us = us * (SysTick->LOAD / (1000000 / RT_TICK_PER_SECOND));
  5.     delta = SysTick->VAL;
  6.     while (delta - SysTick->VAL < us);
  7. }
复制代码


这个是 rtthread 的微妙延迟,可以参考一下
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2019-6-16
在线时间
4 小时
 楼主| 发表于 2019-7-4 22:51:16 | 显示全部楼层
慕兰 发表于 2019-7-3 19:31
这个是 rtthread 的微妙延迟,可以参考一下

我感觉那个delay_us的函数应该没有错,官方的就是这样的。
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2019-6-16
在线时间
4 小时
 楼主| 发表于 2019-7-5 00:02:56 | 显示全部楼层
我找到原因了,是因为软件调试的时候,将外部时钟设置为了12M, 应该为8M.  
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 03:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表