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

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


一、RCR寄存器

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

二、工程配置

  • 芯片:stm32f103c8t6。这个芯片只有定时器TIM1是高级定时器,具备RCR寄存器
  • 使用CubeMX配置工程,这里主要关注TIM1定时器的配置,如图
    STM32使用高级定时器的RCR功能,实现PWM固定脉冲数输出
    因为RCR寄存器只影响Update Event事件,所以这里只勾选update interrupt这个中断。
  • pwm参数配置
    STM32使用高级定时器的RCR功能,实现PWM固定脉冲数输出
  • 时钟树
    STM32使用高级定时器的RCR功能,实现PWM固定脉冲数输出
  • 工程配置完毕,点击生成代码

三、代码修改

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

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

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

在定时器的回调函数中:

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\");// 关闭PWMHAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);} /* USER CODE END Callback 1 */}
  • 运行结果
    STM32使用高级定时器的RCR功能,实现PWM固定脉冲数输出
    确定进入回调函数成功