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

查看: 5764|回复: 17

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

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

16

主题

71

回帖

0

蝴蝶豆

高级会员

最后登录
2019-9-10
发表于 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,查看参考手册发现设置为单脉冲模式,定时器溢出后自动停止计数器。


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


回复

使用道具 举报

68

主题

3266

回帖

82

蝴蝶豆

社区小助手

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

使用道具 举报

4

主题

95

回帖

6

蝴蝶豆

高级会员

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

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

使用道具 举报

29

主题

2129

回帖

127

蝴蝶豆

论坛元老

最后登录
2020-12-7
发表于 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

主题

71

回帖

0

蝴蝶豆

高级会员

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

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

使用道具 举报

16

主题

71

回帖

0

蝴蝶豆

高级会员

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

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

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

使用道具 举报

16

主题

71

回帖

0

蝴蝶豆

高级会员

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

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

使用道具 举报

20

主题

1513

回帖

5

蝴蝶豆

论坛元老

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

回帖奖励 +2 ST金币

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

使用道具 举报

16

主题

71

回帖

0

蝴蝶豆

高级会员

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

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

使用道具 举报

68

主题

3266

回帖

82

蝴蝶豆

社区小助手

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

回帖奖励 +2 ST金币

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

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

使用道具 举报

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版