STM32F100基于SPL配置TIM3_CH1(PC6)PWM无输出求助
STM32F100 PC6(TIM3_CH1)PWM无输出排查建议
核心问题定位与修正
你的代码最关键的缺失是未初始化GPIO复用功能,同时存在定时器配置的错误项,以下是分步排查和修正方案:
1. 必须补全GPIO复用配置(最优先级)
原初始化函数完全未处理PC6引脚的GPIO配置,这是无输出的直接原因。需要:
- 开启GPIOC的时钟(STM32F1的GPIO挂载在APB2总线)
- 将PC6配置为复用推挽输出(TIM3_CH1的默认复用模式)
2. 修正定时器配置错误
- 移除
RepetitionCounter参数:TIM3是通用定时器,不支持重复计数器(该参数仅高级定时器TIM1/TIM8可用),保留会导致定时器初始化失败。 - 删除
TIM_CtrlPWMOutputs调用:该函数仅用于高级定时器的主输出使能,通用定时器TIM3不需要。 - 调整PWM频率至易测试范围:你当前设置的3.66Hz频率过低,示波器难以捕捉,建议先调整为100Hz方便验证。
3. 修正网上代码的语法错误
你找到的参考代码存在多处SPL库的语法错误:
- 宏名错误:
GPIO_MODE_AF_PP→GPIO_Mode_AF_PP(SPL库的标准宏) - 变量名错误:
GPIO_InitStruct→GPIO_InitStructure(结构体定义名不匹配) - 多余成员:SPL的
GPIO_InitTypeDef没有OutputType字段,复用推挽模式已包含在GPIO_Mode_AF_PP中 - 无需重映射:TIM3_CH1默认引脚就是PC6,不需要调用
GPIO_AF_EnableRemap_TIM3(),误开重映射会导致引脚失效
修正后的完整初始化代码示例
void SERVO_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure ; TIM_OCInitTypeDef TIM_OCInitStructure; GPIO_InitTypeDef GPIO_InitStructure; // 开启GPIO和TIM3时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 配置PC6为复用推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); /* 配置定时器参数(100Hz PWM,方便测试) */ TIM_TimeBaseStructure.TIM_Prescaler = 239; // 24MHz/(239+1) = 100kHz 定时器时钟 TIM_TimeBaseStructure.TIM_Period = 999; // 100kHz/(999+1) = 100Hz PWM频率 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 移除通用定时器不支持的RepetitionCounter TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 500; // 50%占空比(500/1000) TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM3, &TIM_OCInitStructure); // 使能捕获比较预装载寄存器,让SetCompare1的更改在下一个周期生效 TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); // 使能定时器 TIM_Cmd(TIM3, ENABLE); }
额外排查步骤
- 硬件验证:用万用表确认PC6引脚无短路/断路,用示波器观察波形(时基调整为10ms/div,对应100Hz频率)。
- 宏定义检查:确认
SERVO_TIM、SERVO_PWM_Pin、SERVO_PWM_GPIO_Port的宏定义指向正确的TIM3、GPIO_Pin_6和GPIOC。 - 寄存器调试:通过调试工具查看TIM3的
CR1(定时器使能位)、CCMR1(PWM模式配置)、CCER(通道输出使能位),以及GPIOC的CRL寄存器(PC6对应的位是否为0b1011,即复用推挽输出)。
内容的提问来源于stack exchange,提问作者Spider999
相关产品推荐
相关产品推荐

