You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
}

额外排查步骤

  1. 硬件验证:用万用表确认PC6引脚无短路/断路,用示波器观察波形(时基调整为10ms/div,对应100Hz频率)。
  2. 宏定义检查:确认SERVO_TIM、SERVO_PWM_Pin、SERVO_PWM_GPIO_Port的宏定义指向正确的TIM3、GPIO_Pin_6和GPIOC。
  3. 寄存器调试:通过调试工具查看TIM3的CR1(定时器使能位)、CCMR1(PWM模式配置)、CCER(通道输出使能位),以及GPIOC的CRL寄存器(PC6对应的位是否为0b1011,即复用推挽输出)。

内容的提问来源于stack exchange,提问作者Spider999

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 02:36:02