搜索
查看: 9101|回复: 17

STM32 定时器开关导致延时不准确

[复制链接]
回帖奖励 4 ST金币 回复本帖可获得 2 ST金币奖励! 每人限 1 次(中奖概率 50%)

该用户从未签到

16

主题

87

帖子

0

蝴蝶豆

高级会员

最后登录
2021-3-29
发表于 2018-7-4 11:51:24 | 显示全部楼层 |阅读模式
我的代码设置如下:
定时器配置为向上计数模式,计数间隔为1us,10us中断一次,来实现一个10us的延时。
开关定时器方法:
定时器中断函数()
{
   关闭定时器,清除CEN位;----------------此时CNT寄存器有时是0,有时是1
   执行处理代码;
   打开定时器,设置CEN位;----------------CNT计数起点受制于前面,如果是1,那么下次9us后进入中断,而不是10
}
疑问:
进入中断后,立即关闭定时器时,CNT寄存器值可能每次不一样,导致开启定时器时计数起点不同。难道芯片每次进入中断后运行到关闭定时器的那行代码的时间会变化吗?大神能否解释一下?


想到的解决办法:
1、添加对CNT寄存器设置操作
定时器中断函数()
{
   关闭定时器,清除CEN位;----------------此时CNT寄存器有时是0,有时是1
   执行处理代码;
   CNT = 0;
   打开定时器,设置CEN位;----------------CNT计数起点受制于前面
}

2、将定时器设置为单脉冲模式----onePulse,查看参考手册发现设置为单脉冲模式,定时器溢出后自动停止计数器。


以上两种方法是否可行?哪种方法好呢,会不会引入其它问题。请大神指点!谢谢!


回复

使用道具 举报

该用户从未签到

74

主题

3420

帖子

82

蝴蝶豆

社区小助手

最后登录
2023-11-12
发表于 2018-7-4 13:26:15 | 显示全部楼层
1、中断需要压栈、退栈等操作,并非楼主所想那个10us操作。楼主在这个非常紧张的中断里中断中又要关闭定时器,又要启动定时器,还能剩下多少指令执行时间?。
2、其实要做到个10uS的中断,无需关心CNT的值,只要细心配置好定时器中断参数,每次中断就是10uS,在中断里,执行小于10uS(这个10Us能做的事很有限,还要扣除堆栈操作))的操作就是。
回复 支持 1 反对 0

使用道具 举报

该用户从未签到

4

主题

99

帖子

6

蝴蝶豆

高级会员

最后登录
2019-8-16
发表于 2018-7-4 13:00:25 | 显示全部楼层
本帖最后由 oceane 于 2018-7-4 13:06 编辑

为什么要关闭定时器呢?关闭后再打开就不是精确的10us中断了,关闭打开也需要时间肯定会有延时不准。
回复 支持 反对

使用道具 举报

  • TA的每日心情
    奋斗
    2021-4-15 11:47
  • 签到天数: 537 天

    [LV.9]

    29

    主题

    2176

    帖子

    127

    蝴蝶豆

    论坛元老

    最后登录
    2024-4-24
    发表于 2018-7-4 13:02:24 | 显示全部楼层
    本帖最后由 stm1024 于 2018-7-4 13:05 编辑

    话说这个是不是放错板块了……

    不太明白你为什么要采用这种方式,通常清除中断标志就可以了。以最简单的TIM6/7为例:
    1. void TIM6_IRQHandler(void)
    2. {
    3.     if(TIM_GetITStatus(TIM6 ,TIM_IT_Update)!= RESET)
    4.         {        
    5.         GPIO_WriteBit(GPIOB,GPIO_Pin_13,ba);
    6.         ba=1-ba;
    7.         }
    8.    
    9.    TIM_ClearITPendingBit(TIM6,TIM_FLAG_Update);
    10. }
    复制代码
    其实你可以多看看别人是怎么实施的。




    回复 支持 反对

    使用道具 举报

    该用户从未签到

    16

    主题

    87

    帖子

    0

    蝴蝶豆

    高级会员

    最后登录
    2021-3-29
     楼主| 发表于 2018-7-4 13:41:57 | 显示全部楼层
    wenyangzeng 发表于 2018-7-4 13:26
    1、中断需要压栈、退栈等操作,并非楼主所想那个10us操作。楼主在这个非常紧张的中断里中断中又要关闭定时 ...

    感谢回复,中断中执行代码大于10us,所以进入中断就把它关闭了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    16

    主题

    87

    帖子

    0

    蝴蝶豆

    高级会员

    最后登录
    2021-3-29
     楼主| 发表于 2018-7-4 13:45:03 | 显示全部楼层
    stm1024 发表于 2018-7-4 13:02
    话说这个是不是放错板块了……

    不太明白你为什么要采用这种方式,通常清除中断标志就可以了。以最简单的TI ...

    感谢回复  是发错地方了  我在中断中必须关闭定时器,因为代码执行时间要远大于10
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    16

    主题

    87

    帖子

    0

    蝴蝶豆

    高级会员

    最后登录
    2021-3-29
     楼主| 发表于 2018-7-4 13:45:43 | 显示全部楼层
    oceane 发表于 2018-7-4 13:00
    为什么要关闭定时器呢?关闭后再打开就不是精确的10us中断了,关闭打开也需要时间肯定会有延时不准。 ...

    感谢回复,中断中执行代码大于10us,所以进入中断就把它关闭了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    20

    主题

    1628

    帖子

    5

    蝴蝶豆

    论坛元老

    最后登录
    2022-6-7
    发表于 2018-7-4 14:06:25 | 显示全部楼层

    回帖奖励 +2 ST金币

    既然代码执行时间大于10us为什么还要在10us的中断里面执行这段代码呢。
    如果不是必须在中断中执行的东西可以放到中断外面去执行,另外就是优化一下代码,也许能在10us内执行完
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    16

    主题

    87

    帖子

    0

    蝴蝶豆

    高级会员

    最后登录
    2021-3-29
     楼主| 发表于 2018-7-4 14:23:09 | 显示全部楼层
    子曰好人 发表于 2018-7-4 14:06
    既然代码执行时间大于10us为什么还要在10us的中断里面执行这段代码呢。
    如果不是必须在中断中执行的东西可 ...

    感谢回复,这里的定时器的作用只是控制程序进行的作用
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    74

    主题

    3420

    帖子

    82

    蝴蝶豆

    社区小助手

    最后登录
    2023-11-12
    发表于 2018-7-4 15:26:55 | 显示全部楼层

    回帖奖励 +2 ST金币

    miraclexue 发表于 2018-7-4 13:41
    感谢回复,中断中执行代码大于10us,所以进入中断就把它关闭了。

    既然中断中执行代码大于10us,楼主设置这个10us中断有何意义?
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

    GMT+8, 2024-4-29 18:49 , Processed in 1.191661 second(s), 43 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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