一、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 */
}
- 运行结果
确定进入回调函数成功