打印
[STM32G0]

再谈PWM中断踩坑

[复制链接]
1219|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
GlenX|  楼主 | 2024-6-24 11:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
硬件:STM32G030F6P6

软件环境:STM32CubeIDE

实现功能:顶数量PWM输出

正常配置硬件,TIM1_CHANNEL2,ONE_Pulse Mode

主程序主动开启时钟、中断: (过去一直这么用!!!)

HAL_TIM_Base_Start(&htim1);             //这句有的说放在开启中断后,有的说在前,测试发现应该防止前面,否则输出脉冲数少了。

HAL_TIM_PWM_Start_IT(&htim1, TIM_CHANNEL_2);

怎么都进不了下面的中断,但同样的程序,改成TIM3就可以

void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)

做了各种排列组合,结果发现需要同时(!!!!!?????)启用下列函数,才能正确进入中服务(重点是以前从来没这么用过!!!)

__HAL_TIM_ENABLE_IT(&htim1, TIM_IT_UPDATE);

HAL_TIM_PWM_Start_IT(&htim1, TIM_CHANNEL_2);

也许这就是研发——从一个又一个的坑里趴出来,外人看上去以为你在走平路。

另外发现一个好用的功能,给大家分享以下:

固定个数的脉冲输出,可以采用PWM 的 ONE_Pulse Mode 方式,

通过:

    TIM1->RCR = pulse 根据需要修改脉冲数量

    TIM1->ARR = 1/f  修改频率

    TIM1->CCR1 = du  修改脉宽

非常方便,也好记。

使用特权

评论回复
沙发
kzlzqi| | 2024-7-29 15:37 | 只看该作者
如果仅调用 HAL_TIM_PWM_Start_IT,但未启用 TIM1 的更新中断,可能会导致中断回调函数无法被正确调用。

使用特权

评论回复
板凳
申小林一号| | 2024-7-29 22:42 | 只看该作者
感谢分享

使用特权

评论回复
地板
喂什么玩意| | 2024-7-31 11:40 | 只看该作者
STM32G030F6P6 微控制器上使用 PWM 的 ONE-Pulse 模式进行固定数量脉冲输出时,确实可能会遇到一些配置和中断的问题。

使用特权

评论回复
5
实际测量不符| | 2024-8-29 13:38 | 只看该作者
确保中断优先级正确设置,并且中断服务程序(ISR)能够处理相应的中断。

使用特权

评论回复
6
星辰大海不退缩| | 2024-8-29 23:53 | 只看该作者
固定个数的脉冲输出,可以采用PWM 的 ONE_Pulse Mode 方式

使用特权

评论回复
7
咕咕呱呱孤寡| | 2024-8-30 09:32 | 只看该作者
学到了,感谢分享

使用特权

评论回复
8
公羊子丹| | 2025-4-4 07:54 | 只看该作者
这个坑我也踩过,TIM1和其他定时器在中断触发机制上确实有点区别,TIM1是高级定时器,可能需要额外启用更新中断。

使用特权

评论回复
9
周半梅| | 2025-4-4 07:55 | 只看该作者
你试过用 HAL_TIM_OnePulse_Start_IT 吗?ONE_Pulse模式下,这个函数可能比 HAL_TIM_PWM_Start_IT 更符合预期。

使用特权

评论回复
10
帛灿灿| | 2025-4-4 07:56 | 只看该作者
TIM1是高级定时器,而TIM3是通用定时器,确实有些寄存器设置不同,TIM1可能默认不开启某些中断。

使用特权

评论回复
11
童雨竹| | 2025-4-4 07:57 | 只看该作者
__HAL_TIM_ENABLE_IT(&htim1, TIM_IT_UPDATE); 这个操作的确奇怪,按理说PWM完成应该是 TIM_IT_CCx,但TIM1可能内部有额外逻辑。

使用特权

评论回复
12
万图| | 2025-4-4 07:58 | 只看该作者
这个 TIM1->RCR 用来控制脉冲个数确实方便!很多人可能不知道这个寄存器的作用,一般都是用软件逻辑去计数。

使用特权

评论回复
13
Wordsworth| | 2025-4-4 07:59 | 只看该作者
你的 HAL_TIM_PWM_PulseFinishedCallback 里面有检查 htim->Instance == TIM1 吗?有时候多个定时器共用回调,需要手动区分。

使用特权

评论回复
14
Bblythe| | 2025-4-4 08:00 | 只看该作者
你试过不用 ONE_Pulse Mode 直接跑PWM看看能不能进中断吗?有时候模式设置影响了触发条件。

使用特权

评论回复
15
Pulitzer| | 2025-4-4 08:01 | 只看该作者
STM32的Cube库有时候屏蔽了一些细节,直接操作寄存器可能比用HAL函数更直观,你这次应该就是找到了底层的触发逻辑。

使用特权

评论回复
16
Uriah| | 2025-4-4 08:03 | 只看该作者
这个 TIM1->ARR = 1/f 的用法挺实用的,可以做成一个快速调节PWM参数的函数,适合做可变频率PWM输出。

使用特权

评论回复
17
Clyde011| | 2025-4-4 08:04 | 只看该作者
以后遇到类似的问题,可以用 HAL_TIM_ReadCapturedValue 看看捕获值是否正确更新,有时候问题不在中断,而是在定时器状态。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

583

帖子

2

粉丝