OpenEdv-开源电子网

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

定时器输出bug,帮大家避坑,如果帮到你了,过来回帖感谢我。

[复制链接]

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
7998
金钱
7998
注册时间
2014-8-13
在线时间
1593 小时
发表于 2023-6-28 19:03:54 | 显示全部楼层 |阅读模式
缠了我几年的bug,能找到原因都是运气好。简单点说,STM32F407ZET6寄存器开发,启动定时器1和定时器3,使用下面两行代码,测量两个定时器输出之间延迟,首次运行和再次运行结果不一样。首次测量到的延迟高达391.12us,之后再运行,两个定时器输出之间的延迟小于1us。
大家做项目遇到偶发bug涉及到定时器的,可以参考一下。
  1. TIM1 ->CR1 |= 1 << 0;                                                        //使能TIM1,输出pulse1
  2.     TIM3 ->CR1 |= 1 << 0;                           //使能TIM3,输出pulse2
复制代码
全tm是泪,都被客户喷成猪头了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

161

帖子

0

精华

高级会员

Rank: 4

积分
955
金钱
955
注册时间
2022-7-21
在线时间
446 小时
发表于 2023-6-28 19:23:43 | 显示全部楼层
你所说得首次运行和再次运行时指开发板复位运行吗,还是你的程序会把定时器关了然后再开启
回复 支持 反对

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
7998
金钱
7998
注册时间
2014-8-13
在线时间
1593 小时
 楼主| 发表于 2023-6-29 08:02:44 | 显示全部楼层
还在忙 发表于 2023-6-28 19:23
你所说得首次运行和再次运行时指开发板复位运行吗,还是你的程序会把定时器关了然后再开启

首次运行是指第一次代码执行到这里(比如上电后,或者按了复位重启),再次是指在常规状态下(非休眠、低功耗之类的状态,也不是从休眠状态恢复至正常状态,因为这些状态我都没测试)此处代码被执行了至少1次(这里确实是我把定时器关闭后再开启)。

回复 支持 反对

使用道具 举报

13

主题

250

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2251
金钱
2251
注册时间
2019-8-7
在线时间
364 小时
发表于 2023-6-29 08:56:57 | 显示全部楼层
用从模式 定时器跟随另一个定时器启动会好很多
回复 支持 反对

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
7998
金钱
7998
注册时间
2014-8-13
在线时间
1593 小时
 楼主| 发表于 2023-6-29 13:10:45 | 显示全部楼层
远命 发表于 2023-6-29 08:56
用从模式 定时器跟随另一个定时器启动会好很多

我测定两行代码之间的时间延迟是因为我需要生成两路相位互补的PWM,测定好延迟后根据延迟计算出补偿时间unDelayUs,然后执行下列代码。这个unDelayUs包含了硬件延迟,程序执行延迟和设定延迟
  1.     TIM1 ->CR1 |= 1 << 0;                                                        //使能TIM1,输出pulse1
  2.     delay_us(unDelayUs);
  3.     TIM3 ->CR1 |= 1 << 0;                           //使能TIM3,输出pulse2
复制代码

回复 支持 反对

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
7998
金钱
7998
注册时间
2014-8-13
在线时间
1593 小时
 楼主| 发表于 2023-6-29 13:16:57 | 显示全部楼层
远命 发表于 2023-6-29 08:56
用从模式 定时器跟随另一个定时器启动会好很多

下次用数字电路或者FPGA或者ZYNQ做,STM32的计数器功能太多了,做简单的东西反而更费劲。
回复 支持 反对

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
7998
金钱
7998
注册时间
2014-8-13
在线时间
1593 小时
 楼主| 发表于 2023-6-29 14:07:25 | 显示全部楼层
远命 发表于 2023-6-29 08:56
用从模式 定时器跟随另一个定时器启动会好很多

TIM1主模式,TIM3从模式,TIM1的CNT为0,TIM3的CNT设置为计算好的延时,TIM1使能时发出事件,该事件触发TIM3,大概思路是这样的,对吗?
当时确实没想到这种思路
回复 支持 反对

使用道具 举报

13

主题

250

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2251
金钱
2251
注册时间
2019-8-7
在线时间
364 小时
发表于 2023-6-30 08:58:28 | 显示全部楼层
mack13013 发表于 2023-6-29 14:07
TIM1主模式,TIM3从模式,TIM1的CNT为0,TIM3的CNT设置为计算好的延时,TIM1使能时发出事件,该事件触发T ...

对 差不多这个意思 还是挺准的 不过也会滞后 具体多少忘记了
回复 支持 反对

使用道具 举报

12

主题

3379

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8600
金钱
8600
注册时间
2020-5-11
在线时间
4019 小时
发表于 2023-6-30 15:11:13 | 显示全部楼层
本帖最后由 LcwSwust 于 2023-6-30 16:29 编辑

估计原因在于未对CNT赋值。
研究FOC时,在F103上用三个定时器产生错开一定相位的三相PWM我也是试过的,没有问题。
TIM_TimeBaseInit并未操作CNT。

  1.         TIM_SetCounter(TIM3,0);//计数初值也可用于控制相位差        
  2.         TIM_SetCounter(TIM2,8);
  3.         TIM_SetCounter(TIM4,16);
  4.         //启动时刻之差也会造成相位差        
  5.         TIM_Cmd(TIM3,ENABLE);        //使能定时器               
  6.         TIM_Cmd(TIM2,ENABLE);        //使能定时器        
  7.         TIM_Cmd(TIM4,ENABLE);        //使能定时器
复制代码



至于BUG,很多人都会遇到变量未初始化引起的问题,我记录的一些BUG:
http://www.openedv.com/forum.php?mod=viewthread&tid=323935

专治疑难杂症
回复 支持 反对

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
7998
金钱
7998
注册时间
2014-8-13
在线时间
1593 小时
 楼主| 发表于 2023-6-30 18:04:57 | 显示全部楼层
LcwSwust 发表于 2023-6-30 15:11
估计原因在于未对CNT赋值。
研究FOC时,在F103上用三个定时器产生错开一定相位的三相PWM我也是试过的,没 ...

开始我也以为是CNT未清0。后来测试发现不是。有可能是第一次执行的时候核心会多一些总线分配之类的任务吧,这些任务可能是外设任务,与ARM核并行执行,也就是说,ARM核执行2条语句间隔是小于1us的,外设分配总线权限之类的时间比较长,需要延时391us,等再次运行的时候,外设分配总线权限之类的任务不需要重复执行,所以延迟就变回1us以内了。这些是我猜测,没有做测试或者找资料印证。本来还想debug下看一下反汇编是否一致,现在也没心情看了。bug不bug的,能跑就不要动。哎,老了。。。
回复 支持 反对

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
7998
金钱
7998
注册时间
2014-8-13
在线时间
1593 小时
 楼主| 发表于 2023-6-30 18:14:14 | 显示全部楼层
LcwSwust 发表于 2023-6-30 15:11
估计原因在于未对CNT赋值。
研究FOC时,在F103上用三个定时器产生错开一定相位的三相PWM我也是试过的,没 ...

看了你的bug记录,发现你是真下功夫啊,比我强太多。

给你个小小推荐:找个编程规范看一下,尽量是大公司的,网上那种华为或中兴之类的就可以,看了之后想一下,他们规范里为什么要设置这样一条。你bug记录里的东西在她们的规范里全都有针对,而且他们总结的可是全面太多了。
回复 支持 反对

使用道具 举报

12

主题

3379

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8600
金钱
8600
注册时间
2020-5-11
在线时间
4019 小时
发表于 2023-7-1 09:24:10 | 显示全部楼层
mack13013 发表于 2023-6-30 18:14
看了你的bug记录,发现你是真下功夫啊,比我强太多。

给你个小小推荐:找个编程规范看一下,尽量是大 ...

谢谢,我的代码确实写得很不规范,得改进一下。bug不解决的话,会有如鲠在喉的感觉,要不您再检查下是不是提前开了中断,所以定时器一开就进中断去了?或者其它中断恰好发生。
外设分配总线权限之类”我是没遇到过的。
专治疑难杂症
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-18 06:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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