rtthread stm32f4 pwm1频率设置异常

博客介绍了在STM32F407上使用RT-Thread4.05时遇到的一个问题,即通过drv_pwm_set函数设置PWM1频率时,实际值为设定值的两倍。作者发现原因在于tim_clock_get()函数中对TIM9、TIM10、TIM11的APB2倍频判断不全面,导致TIM1和TIM8未被正确处理。提出了修正后的tim_clock_get()源码,但截至220707该问题尚未在官方修复。
摘要由CSDN通过智能技术生成

原文地址

记一次RT-Thread的bug

异常复现

stm32f407
RT-Thread 4.05
通过drv_pwm_set函数设置pwm1的频率,实际值是设定值的2倍

通过排查发现函数tim_clock_get()中,只有TIM9 10 11才会* pclk2_doubler
查询函数pclkx_doubler_get()可知pclk2_doubler是APB2总线的倍频数

if (RCC_ClkInitStruct.APB2CLKDivider != RCC_HCLK_DIV1)
{
     *pclk2_doubler = 2;
}

在这里插入图片描述
而TIM1 和 TIM8也是挂载在APB2总线上,同时APB2上的定时器频率会2倍频
在这里插入图片描述
因此需修改tim_clock_get()源码为

if (htim->Instance == TIM9 || htim->Instance == TIM10 || htim->Instance == TIM11 || htim->Instance == TIM1 || htim->Instance == TIM8)

附上tim_clock_get源码,220707目前此问题未修复

static rt_uint64_t tim_clock_get(TIM_HandleTypeDef *htim)
{
    rt_uint32_t pclk1_doubler, pclk2_doubler;
    rt_uint64_t tim_clock;

    pclkx_doubler_get(&pclk1_doubler, &pclk2_doubler);

#if defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7)
    if (htim->Instance == TIM9 || htim->Instance == TIM10 || htim->Instance == TIM11)
#elif defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32H7)|| defined(SOC_SERIES_STM32F3)
    if (htim->Instance == TIM15 || htim->Instance == TIM16 || htim->Instance == TIM17)
#elif defined(SOC_SERIES_STM32MP1)
    if (htim->Instance == TIM4)
#elif defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32G0)
    if (0)
#endif
    {
#if !defined(SOC_SERIES_STM32F0) && !defined(SOC_SERIES_STM32G0)
        tim_clock = (rt_uint32_t)(HAL_RCC_GetPCLK2Freq() * pclk2_doubler);
#endif
    }
    else
    {
        tim_clock = (rt_uint32_t)(HAL_RCC_GetPCLK1Freq() * pclk1_doubler);
    }

    return tim_clock;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值