芯片:STM32F405RGT6
目的:输出可控个数的PWM波用于步进电机的控制
方法:利用高级定时器8的PWM的更新中断和RCR重复计数器实现。
定时器8的通道1设置为PWM模式,开启UPDATE中断,这样理论上没发一个PWM波就会产生一个更新中断;然后通过修改RCR重复计数器使芯片在发出一定个PWM波后产生更新中断,在更新中断中在做其他处理。
过程:
1、CUBE的定时器配置如图1-3
2、生成Keil5工程里,用HAL_TIM_PWM_Start_IT(&htim8,TIM_CHANNEL_1);语句以中断方式开启定时器8通道1的PWM输出。GOTO到此语句对应的HAL库函数中,发现只有CC中断的判断,没有UPDATE中断的判断。请忽略标记的语句,那是我自己添加的开启UPDATE中断的语句。
/**
* @brief Starts the PWM signal generation in interrupt mode.
* @param htim pointer to a TIM_HandleTypeDef structure that contains
* the configuration information for TIM module.
* @param Channel TIM Channel to be enabled.
* 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
* @retval HAL status
*/
HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel)
{
/* Check the parameters */
assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));
switch (Channel)
{
case TIM_CHANNEL_1:
{
//__HAL_TIM_ENABLE_IT(htim,TIM_IT_UPDATE);
/* Enable the TIM Capture/Compare 1 interrupt */
__HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1);
}
break;
case TIM_CHANNEL_2:
{
/* Enable the TIM Capture/Compare 2 interrupt */
__HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2);
}
break;
case TIM_CHANNEL_3:
{
/* Enable the TIM Capture/Compare 3 interrupt */
__HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3);
}
break;
case TIM_CHANNEL_4:
{
/* Enable the TIM Capture/Compare 4 interrupt */
__HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4);
}
break;
default:
break;
}
/* Enable the Capture compare channel */
TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE);
if(IS_TIM_ADVANCED_INSTANCE(htim->Instance) != RESET)
{
/* Enable the main output */
__HAL_TIM_MOE_ENABLE(htim);
}
/* Enable the Peripheral */
__HAL_TIM_ENABLE(htim);
/* Return function status */
return HAL_OK;
}
这样的话系统运行的时候肯定就没有UPDATE的中断,RCR重复计数器也就没用了。就完不成我想要的输出固定个数PWM波的目的。
在HAL_TIM_PWM_Start_IT(&htim8,TIM_CHANNEL_1);库函数中没有UPDATE中断,但是在生成的stm32f4xx_it.c文件里有UPDATE中断的代码,但是运行时是进不去的。void TIM8_UP_TIM13_IRQHandler(void){
/* USER CODE BEGIN TIM8_UP_TIM13_IRQn 0 */
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_13);
HAL_TIM_PWM_Stop_IT(&htim8,TIM_CHANNEL_1);
/* USER CODE END TIM8_UP_TIM13_IRQn 0 */
HAL_TIM_IRQHandler(&htim8);
/* USER CODE BEGIN TIM8_UP_TIM13_IRQn 1 */
/* USER CODE END TIM8_UP_TIM13_IRQn 1 */
}
解决方法:
在HAL库函数里HAL_TIM_PWM_Start_IT(&htim8,TIM_CHANNEL_1);自己添加HAL_TIM_ENABLE_IT(htim,TIM_IT_UPDATE);
在定时器8的更新中断里就可以完成目的了。问题:高级定时器的PWM更新中断不能通过CUBEMX配置直接产生代码框架么?为什么在HAL_TIM_PWM_Start_IT(&htim8,TIM_CHANNEL_1);里没有呢?另外,高级定时器的HAL_TIM_Base_Start_IT();的定时功能是可以通过CUBEMX配置直接产生UPDATE更新中断的代码框架,而且RCR重复计数器也可以完成相应功能。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>