winamp123 发表于 2020-8-16 12:05:53

stm32f103 TIM2 PWM没有输出?

以前用TIM8输出2路PWM正常,现在改为TIM2却没有输出,对照datasheet寄存器详细查了遍,没看出问题。先贴出了主要代码,哪位能看看有什么问题? 非常感谢。

static bool PWM_Init(void)
{
        TimHandle2.Instance                           = TIM2;
        TimHandle2.Init.Prescaler         = (uint32_t)(SystemCoreClock / 16000000) - 1;       
        TimHandle2.Init.Period            = 5000;
        TimHandle2.Init.ClockDivision   = 0;
        TimHandle2.Init.CounterMode       = TIM_COUNTERMODE_UP;
        TimHandle2.Init.RepetitionCounter = 0;       
        if (HAL_TIM_PWM_Init(&TimHandle2) != HAL_OK)
                return false;
               
        // Configure PWM duty cycle
        for (int i = 2; i < 4; i++)
        {       
                sConfig.Pulse      = PWM_GetRealOutput(0);
                sConfig.OCMode       = TIM_OCMODE_PWM1;
                sConfig.OCPolarity   = TIM_OCPOLARITY_HIGH;
                sConfig.OCNPolarity= TIM_OCNPOLARITY_HIGH;
                sConfig.OCFastMode   = TIM_OCFAST_DISABLE;
                sConfig.OCIdleState= TIM_OCIDLESTATE_RESET;
                sConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;
               
                uint32_t address = PWM_GetChannelAddress(i);
                if (address == -1)
                        return false;
               
                if (HAL_TIM_PWM_ConfigChannel(&TimHandle2, &sConfig, address) != HAL_OK)
                        return false;       
               
                if (HAL_TIM_PWM_Start(&TimHandle2, address) != HAL_OK)
                        return false;               
        }       
}


void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
        GPIO_InitTypeDefGPIO_InitStruct;
       
        if (htim == &TimHandle2)
        {
                __HAL_RCC_SYSCFG_CLK_ENABLE();
                __HAL_RCC_AFIO_CLK_ENABLE();
                __HAL_RCC_TIM2_CLK_ENABLE();       
      __GPIOB_CLK_ENABLE();

      GPIO_InitStruct.Pin       = GPIO_PIN_10 | GPIO_PIN_11;
      GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;
      GPIO_InitStruct.Speed   = GPIO_SPEED_HIGH;
      HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);               
        }
}


bool MOTOR_SetValue(uint8_t ao, float value)
{
        uint32_t pulse = PWM_GetRealOutput(value);
       
        if (ao == 0)
                TimHandle2.Instance->CCR1 = pulse;
        else if (ao == 1)
                TimHandle2.Instance->CCR2 = pulse;
        else if (ao == 2)
                TimHandle2.Instance->CCR3 = pulse;
        else if (ao == 3)
                TimHandle2.Instance->CCR4 = pulse;
        else
                return false;

        return true;
}



winamp123 发表于 2020-8-16 14:35:40

:L 找到原因,需要REMAP __HAL_AFIO_REMAP_TIM2_ENABLE();

winamp123 发表于 2020-8-16 18:23:52

__HAL_AFIO_REMAP_TIM2_ENABLE() 这类操作有bug. 解决方法:
http123s://electronics.stackexchange.com/questions/260757/timer1-remap-cause-debug-crash-on-stm32f103

lebment 发表于 2020-8-17 10:54:33

先base start再PWM start
页: [1]
查看完整版本: stm32f103 TIM2 PWM没有输出?