STM32使用高级定时器的RCR功能,实现PWM固定脉冲数输出

一、RCR寄存器

  • 单片在 PWM 模式下,计数器在到达 ARR 时会产生 更新事件 UEV,但是 RCR>0 时,更新事件不是每个 ARR 周期产生,而是要等计数 RCR+1 次后才产生。
    ⚠️ 注意:
    RCR 只会影响 更新事件(Update Event),不会影响比较匹配事件(CCxIF)本身。

二、工程配置

  • 芯片:stm32f103c8t6。这个芯片只有定时器TIM1是高级定时器,具备RCR寄存器
  • 使用CubeMX配置工程,这里主要关注TIM1定时器的配置,如图

    因为RCR寄存器只影响Update Event事件,所以这里只勾选update interrupt这个中断。
  • pwm参数配置
  • 时钟树
  • 工程配置完毕,点击生成代码

三、代码修改

在main函数中系统初始化之后增加代码:

c 复制代码
HAL_TIM_PWM_Start_IT(&htim1, TIM_CHANNEL_1); // 启动PWM+中断
__HAL_TIM_MOE_ENABLE(&htim1);				//使能主通道
__HAL_TIM_ENABLE_IT(&htim1, TIM_IT_UPDATE);	//使能更新事件定时器

在定时器的回调函数中:

c 复制代码
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  /* USER CODE BEGIN Callback 0 */

  /* USER CODE END Callback 0 */
  if (htim->Instance == TIM3) {
    HAL_IncTick();
  }
  /* USER CODE BEGIN Callback 1 */
  	// 判断是否是TIM1的中断
	if(htim->Instance == TIM1)
	{
		printf("inter insert_2\r\n");
		// 关闭PWM
		HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);
	}
  /* USER CODE END Callback 1 */
}
  • 运行结果

    确定进入回调函数成功