STM32 HAL库多路PWM没有输出踩坑记录

本文讲述了作者在使用STM32的多路PWM时遇到的问题,原本期望通过TIM_CHANNEL_ALL一次性配置所有通道,但实际操作中导致输出故障,经过一系列排查才发现该宏的实际含义并非预期,提醒开发者注意此类易混淆的API设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

之前只弄过单路的,这次想用4路PWM,CUBE里面一顿配置,生成,然后套用之前的代码:

HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);

这算是开启第一路了,心想后面无非就复制几条,改下通道的事了,无意中点了下TIM_CHANNEL_1,进头文件看看:


/** @defgroup TIM_Channel TIM Channel
  * @{
  */
#define TIM_CHANNEL_1                      0x00000000U                          /*!< Capture/compare channel 1 identifier      */
#define TIM_CHANNEL_2                      0x00000004U                          /*!< Capture/compare channel 2 identifier      */
#define TIM_CHANNEL_3                      0x00000008U                          /*!< Capture/compare channel 3 identifier      */
#define TIM_CHANNEL_4                      0x0000000CU                          /*!< Capture/compare channel 4 identifier      */
#define TIM_CHANNEL_ALL                    0x0000003CU                          /*!< Global Capture/compare channel identifier  */
/**
  * @}
  */

看到TIM_CHANNEL_ALL时,眼前一亮,连续开启1、2、3、4怎么都显得不够优雅,于是把代码改成了:

HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_ALL);

这一改,看似天衣无缝,却没有想到灾难性的一下午就降临了,管脚没有输出,改管脚输出的上下拉模式,改时钟,改PWM设置里的各种setting,后来一度怀疑这个芯片的TIM3是不是有问题?

无奈之下,去掉所有PWM,针对某一路管脚,改用GPIO切换状态,发现正常,换了一个定时器13。

 HAL_TIM_PWM_Start(&htim13, TIM_CHANNEL_1);

正常。

HAL_TIM_PWM_Start(&htim13, TIM_CHANNEL_ALL);

 没有。

这时候心里一阵阴霾。

4路PWM全都配置上,然后:

		  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);		  
		  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);
		  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3);
		  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_4);

赶紧用示波器测量……

我只能说,ST,你把TIM_CHANNEL_ALL放那下面是想要坑死谁?是个正常人都会觉得那个是用来配置全部通道的吧,唉。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值