STM32
直播中

刘继牛

8年用户 1059经验值
私信 关注
[问答]

STM32F4x输出pwm配置完后没有输出怎么解决?

如题,我先配置GPIOPD12后配置tiM4_CH1,但是通过监测发现没有PWM 输出,不知道是不是哪儿出问题了,定时器CNT仿真看到是正常的,但是就是没有PWM输出到gpio上,看GPIO的寄存器ISTAT也没有变化,看看哪位大神指导一下,或者我是那个寄存器没配置对?:程序如下:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
GPIO_StructInit( GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin =GPIO_Pin_12;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;GPIO_Init(DI8_GPIO_PORT,  GPIO_InitStructure);GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_TIM4);
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure; //NVIC_InitTypeDef NVIC_InitStructure;  //NVICRCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
TIM_TimeBaseStructure.TIM_Period = 21000-1;   //250usTIM_TimeBaseStructure.TIM_Prescaler =0;TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;TIM_TimeBaseInit(TIM4,  TIM_TimeBaseStructure);
TIM_SelectMasterSlaveMode(TIM4, TIM_MasterSlaveMode_Enable);TIM_SelectOutputTrigger(TIM4, TIM_TRGOSource_OC1Ref);TIM_ARRPreloadConfig(TIM4, ENABLE);
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //TIM_OCNPolarity_High;TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;//TIM_OCNPolarity_High;TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;// TIM_OCIdleState_ResetTIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set;// TIM_OCNIdleState_ResetTIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;TIM_OCInitStructure.TIM_Pulse = 10500+30;TIM_OC1Init(TIM4,  TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Disable);



回帖(2)

黄鸿江

2024-3-14 16:13:14
从你给出的配置上没看出明显导致PWM无输出的原因。

不知是否跟GPIO复用或时钟配置有关。 如果可能的话,尽量使用CubeMx进行配置,

基于它做配置实现PWM输出真是分分钟的事情。

硬件上注意整个硬件板可以正常工作了、别把管脚编号弄错了。
举报

康大争

2024-3-15 10:19:23
1. 确认GPIO和TIM的时钟已经使能。在配置GPIO之前,确保已经通过RCC_APB1PeriphClockCmd或RCC_APB2PeriphClockCmd使能了相应的时钟。

2. 确认GPIO的引脚配置正确。在配置GPIO时,需要将GPIO_Mode设置为GPIO_Mode_AF并设置GPIO_AF为正确的复用功能值。例如,如果TIM4_CH1的复用功能是AF2,则需要将GPIO_AF设置为GPIO_AF_TIM4。

3. 确认TIM的配置正确。在配置TIM4_CH1之前,需要确保TIM4已经使能并且计时器配置正确。可以参考以下代码片段:

```c
// 使能TIM4时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

// 配置TIM4
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Period = 1000 - 1; // 设置周期为1000
TIM_TimeBaseStructure.TIM_Prescaler = 84 - 1; // 设置预分频为84
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

// 配置TIM4_CH1的PWM模式
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 500; // 设置占空比为50%
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM4, &TIM_OCInitStructure);

// 使能TIM4_CH1的输出
TIM_CtrlPWMOutputs(TIM4, ENABLE);

// 启动TIM4
TIM_Cmd(TIM4, ENABLE);
```

4. 检查GPIO的上拉电阻配置。如果使用了开漏输出,则需要通过下面的代码使能上拉电阻:

```c
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
```

如果使用了推挽输出,则可以将GPIO_PuPd设置为GPIO_PuPd_NOPULL。

通过以上步骤确认配置无误后,如果仍然没有PWM输出,可能是硬件连接或者其他问题导致。可以检查电路连接、引脚映射正确性等。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分