RT-Thread论坛
直播中

小峰

13年用户 972经验值
私信 关注
[问答]

103rc rt-studio TIM4 CH2输出PWM不正常怎么解决?

开发环境:rtthread studio 、cubemx
现象

按照教程官网教程: PWM 设备
以及其他搜到的参考链接: RT-Thread Studio 输出PWM详细教程
配置tiM4的CH2、CH4  均无法正常输出pwm,以下是配置过程

  • rtthread studio中打开pwm

  • cubemx配置TIM4的CH2(PB7),并将生成的TIM配置函数HAL_TIM_MspPostInit()粘贴到board.c末尾。

  • 打开board.h打开对应的PWM宏以及定义使用的通道宏

  • 配置和初始化pwm设备,然后使能pwm

list_device命令后打印的内容:

这个是rtthread studio的工程:
rtt_test.rar
示波器测量PB7引脚,无波形。望各位大神解答。

回帖(1)

自我清欢

2025-9-19 17:42:43

根据您描述的问题,TIM4 CH2无法输出PWM的可能原因及解决方法如下,请逐步排查:


1. 检查CubeMX配置



  • 时钟配置

    • 确保APB1 Timer时钟已使能(TIM4属于APB1)。

    • 在CubeMX中确认TIM4的时钟源选择正确(通常为内部时钟"Internal Clock")。


  • TIM4参数设置

    • Prescaler:分频系数(如 71 对应72MHz主频下分频为1MHz)。

    • Counter Period:自动重装载值(如 999 对应1KHz PWM频率)。

    • Pulse:初始占空比(如 500 对应50%占空比)。

    • CH2 Mode:必须设置为 PWM Generation CH2


  • 引脚映射

    • 确认PB7已配置为TIM4_CH2(检查"Alternate Function"是否为TIM4_CH2)。

    • 避免引脚与其他外设冲突(如串口、SPI)。



2. 代码集成关键点



  • 复制函数位置
    将生成的 HAL_TIM_MspPostInit() 函数从CubeMX的 main.c 复制到 board.c末尾(不要放在 MX_TIM4_Init() 内部)。

  • 初始化调用
    board.crt_hw_board_init() 函数中调用 MX_TIM4_Init()
     void rt_hw_board_init()
    {
         ...
         MX_TIM4_Init();  // 确保此函数被调用
         ...
    }


3. RT-Thread PWM驱动配置



  • board.h 宏定义
    确认已开启以下宏(示例配置):
     #define BSP_USING_PWM
    #define BSP_USING_PWM4
    #define BSP_USING_PWM4_CH2      // 启用CH2通道
    //#define BSP_USING_PWM4_CH4   // 若需CH4,取消注释

  • 检查PWM设备名称

    • 通过 list_device 命令确认设备名为 "pwm4"(非 "timer4")。

    • 若未显示,说明驱动未注册成功。



4. 应用层代码正确性



  • 查找设备:使用正确的设备名称和通道号:
     struct rt_device_pwm *pwm_dev;
    pwm_dev = (struct rt_device_pwm *)rt_device_find("pwm4"); // 设备名为pwm4
    RT_ASSERT(pwm_dev != RT_NULL);

  • 设置PWM参数
     rt_pwm_set(pwm_dev, 2, 1000000, 500000); // 周期1ms(1MHz), 脉宽0.5ms(50%)
    rt_pwm_enable(pwm_dev, 2);               // 通道号CH2对应参数2

    通道号规则

    CH1 -> 1, CH2 -> 2, CH3 -> 3, CH4 -> 4



5. 硬件排查



  • PB7引脚连接

    • 用万用表或示波器检查PB7是否短路到GND/VCC。

    • 确认开发板PB7未被其他电路占用。


  • 替代测试
    尝试配置TIM4其他通道(如CH3@PB8),排除硬件损坏可能。


6. 驱动层检查



  • 驱动文件完整性
    确认 drv_pwm.c 存在且包含TIM4配置(位于 /drivers 目录)。

  • HAL库适配
    stm32f1xx_hal_config.h 中确保宏 HAL_TIM_MODULE_ENABLED 已定义。


7. **完整代码示例


board.c 末尾添加:


   void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
   {
     if(timHandle->Instance == TIM4)
     {
       if(timHandle->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
       {
         GPIO_InitTypeDef GPIO_InitStruct = {0};
         __HAL_RCC_GPIOB_CLK_ENABLE();
         GPIO_InitStruct.Pin = GPIO_PIN_7;
         GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
         GPIO_InitStruct.Pull = GPIO_NOPULL;
         GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
         HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
       }
     }
   }

8. 调试建议



  • 检查时钟树
    在CubeMX中确认系统时钟和APB1频率(一般为36/72MHz)。

  • 打印HAL错误
    MX_TIM4_Init() 后添加日志:
     if (HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_2) != HAL_OK) {
       rt_kprintf("TIM4 CH2 PWM Start Failed!n");
    }


最终解决方案流程图:


graph TD
    A[问题:TIM4 CH2无PWM输出] --> B{CubeMX配置}
    B -->|正确| C[board.c集成HAL_TIM_MspPostInit]
    B -->|错误| H[修正TIM4参数/引脚]
    C --> D[board.h宏定义检查]
    D -->|BSP_USING_PWM4_CH2开启| E[应用层代码验证]
    D -->|未开启| I[启用宏并重新编译]
    E -->|rt_pwm_set/enable| F[硬件测量PB7]
    F -->|有信号| G[成功]
    F -->|无信号| J[检查驱动/时钟初始化]
    J --> K[确认MX_TIM4_Init调用位置]
    K --> L[检查drv_pwm.c驱动实现]

按照以上步骤排查后,90%以上的类似问题可解决。重点检查 CubeMX配置完整性board.h宏定义通道号匹配 这三项核心环节。

举报

更多回帖

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