你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

TIM定时器延时精确的问题

[复制链接]
思以智胜 提问时间:2018-1-9 19:06 /
我的用的是STM32F429 开发板,采用HAL库开发,最近用到us延时,就用定时器写了一个延时函数
  1. void MX_TIM2_Init(void) {

  2.    htim2.Instance = TIM2;
  3.    htim2.Init.Prescaler = 71;
  4.    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  5.    htim2.Init.Period = 1;
  6.    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

  7.    HAL_TIM_Base_Init(&htim2);
  8.    HAL_TIM_Base_Start_IT(&htim2);

  9. }

  10. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
  11.    if(htim == (&htim2)) {
  12.       Timer--;
  13.    }
  14. }

  15. void Timer_Delay_us(uint32_t time) {
  16.    Timer = time;
  17.    while(Timer);
  18. }
复制代码
按道理说,这是延时1us的,可实际测得结果是3-4us,请问这是什么问题啊
收藏 评论9 发布时间:2018-1-9 19:06

举报

9个回答
yklstudent-1794 回答时间:2018-1-9 19:12:44
想精确就别用中断,用查询就可以了

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

思以智胜 回答时间:2018-1-9 20:12:00
yklstudent-1794 发表于 2018-1-9 19:12
想精确就别用中断,用查询就可以了

查询是什么意思?
xmshao 回答时间:2018-1-9 20:18:36
这里让你查询就是 直接在程序死等一会儿做为延时。

用中断的话,也是可以的,429很快了。不过,你要考虑进出栈的时间开销,甚至还得考虑中断嵌套的问题。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

思以智胜 回答时间:2018-1-9 20:29:53
xmshao 发表于 2018-1-9 20:18
这里让你查询就是 直接在程序死等一会儿做为延时。

用中断的话,也是可以的,429很快了。不过,你要考虑进 ...

好的,可能就是你说的程序开销问题,1us对中断,CPU还没反映过来,感觉不太可能,谢谢你
努力的人 回答时间:2018-1-25 21:39:04
你可以使用滴答定时器来做,看原子哥的延时都是用这个的

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

toofree 回答时间:2018-1-26 00:21:49
思以智胜 发表于 2018-1-9 20:29
好的,可能就是你说的程序开销问题,1us对中断,CPU还没反映过来,感觉不太可能,谢谢你 ...

要精确延时,必须用滴答时钟。滴答时钟当定时到了以后,会给出中断,同时时钟重新计时,是硬件重置的,不用用户去处理,不会受中断处理的影响。

反正原则只有一个,就是时钟一直在周而复始的转着,“开始——>计时增——>时间到,给出中断,自动重置,并重新开始”,不用受软件处理的影响。每当定时到了后,给出中断,中断服务程序爱处理不处理,时钟接着走。

一般的要求不高的话,用软件延时也可以了。我在STM32F103上,GD103,NXP的LPC上,都用过软件延时,精度还算可以。

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

聪神聪 回答时间:2018-1-26 09:31:26
大哥,你是用F429 180M的主频列,你为啥72分频 你是不是搞错了以为还是F1.另外一个你别用TIM中断回调函数,浪费时间。你直接1分频 重装载值180再试试

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

nyszx 回答时间:2018-1-26 14:18:28
对呀,楼主都1u定时,干嘛还要分频,细分岂不是更精确。其次不要中断判断,while死等,还有就是使用滴答定时器

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

无薪税绵 回答时间:2018-1-26 15:56:47
像1us这样的短延时,
我建议用多个NOP作硬延时,
或者定义自减函数,
不建议使用中断。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版