|
想用TIM1产生两路PWM,其它程序确定没问题,不开启通道1,通道2就会正常输出,无法双通道同时输出,直接运行只有通道1输出,且程序一直卡在HAL_TIM_PWM_Start(&TIM1_Handler,TIM_CHANNEL_2); ,程序根据固件包里的程序写的,基本一样,大哥们,想知道是哪的问题。
程序如下:
TIM_HandleTypeDef TIM1_Handler; //定时器句柄
TIM_OC_InitTypeDef sConfig;
//TIM1 PWM初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM1_PWM_Init(u16 arr,u16 psc)
{
TIM1_Handler.Instance=TIM1; //定时器1
HAL_TIM_Base_DeInit(&TIM1_Handler);
TIM1_Handler.Init.Prescaler=psc; //定时器分频
TIM1_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数模式
TIM1_Handler.Init.Period=arr; //自动重装载值
TIM1_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
TIM1_Handler.Init.RepetitionCounter = 0;
HAL_TIM_PWM_Init(&TIM1_Handler); //初始化PWM
sConfig.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1 //设置比较值,此值用来确定占空比,默认比较值为自动重装载值的一半,即占空比为50%
sConfig.OCPolarity=TIM_OCPOLARITY_HIGH;
sConfig.OCNPolarity = TIM_OCPOLARITY_HIGH;
sConfig.OCFastMode = TIM_OCFAST_DISABLE;
sConfig.OCIdleState = TIM_OCIDLESTATE_RESET;
sConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;
sConfig.Pulse=arr/2;
HAL_TIM_PWM_ConfigChannel(&TIM1_Handler,&sConfig,TIM_CHANNEL_1); //配置TIM1通道1
sConfig.Pulse=arr/2;
HAL_TIM_PWM_ConfigChannel(&TIM1_Handler,&sConfig,TIM_CHANNEL_2); //配置TIM1通道2
HAL_TIM_PWM_Start(&TIM1_Handler,TIM_CHANNEL_1); //开启PWM通道1
HAL_TIM_PWM_Start(&TIM1_Handler,TIM_CHANNEL_2); //开启PWM通道2
}
//定时器底层驱动 时钟使能、引脚配置
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_TIM1_CLK_ENABLE(); //使能定时器1时钟
__HAL_RCC_GPIOE_CLK_ENABLE(); //开启GPIOE时钟
GPIO_Initure.Pin=GPIO_PIN_9 | GPIO_PIN_11; //PE9、PE11
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推完输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //高速
GPIO_Initure.Alternate=GPIO_AF1_TIM1; //复用为TIM1
HAL_GPIO_Init(GPIOE,&GPIO_Initure);
}
|
|