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

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 回答时间: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

查看全部评分

七哥 回答时间: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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版