//main()函数前面的extern TIM_HandleTypeDef htim2;extern TIM_HandleTypeDef htim3;//main()函数内部额外添加的HAL_TIM_Base_Start_IT(&htim2);HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3);HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_4);HAL_TIM_Base_Start_IT(&htim3);HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3);
这里奇怪的是,这里的PWM并没有因为有4路就陷入了混乱,
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK){Error_Handler();}sConfigOC.Pulse = 1500;if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK){Error_Handler();}sConfigOC.Pulse = 2000;if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK){Error_Handler();}sConfigOC.Pulse = 2500;if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_4) != HAL_OK){Error_Handler();}
这是因为在初始化的时候,pulse参数已经绑定了htim1或者htim2或者htim3或者htim4.所以就没有发生混乱。那么在改变PWM的时候是怎么做到更改的呢?
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,100);
/*** @brief Set the TIM Capture Compare Register value on runtime without calling another time ConfigChannel function.* @param __HANDLE__ TIM handle.* @param __CHANNEL__ TIM Channels to be configured.* This parameter can be one of the following values:* @arg TIM_CHANNEL_1: TIM Channel 1 selected* @arg TIM_CHANNEL_2: TIM Channel 2 selected* @arg TIM_CHANNEL_3: TIM Channel 3 selected* @arg TIM_CHANNEL_4: TIM Channel 4 selected* @param __COMPARE__ specifies the Capture Compare register new value.* @retval None*/
#define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) \(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\((__HANDLE__)->Instance->CCR4 = (__COMPARE__)))
应该就是改变CCR寄存器的值就可以立刻改PWM的值吧;
而前面HAL_TIM_PWM_ConfigChannel()这个函数并没有改变以前那些htim1/2/3/4的CCR1/2/3/4的值,所以虽然更改了pulse值,但是不会影响已经赋值的那些htim的pulse值