TIM

关于定时器中断的相关问题

新画了一个F334的板子,在CubeMX配置好定时中断,测试的时候发现定时中断进不去。纳了闷了,之前的板子定时中断很容易实现啊。。。刚开始担心晶振没起振,于是测了下晶振的波形。

TEK00000.PNG

看着很完美,没问题。

想了半天实在没想出来那儿没配置对。本来说好不找度娘的,,,艾玛,真香。

发现在CubeMX配置好定时中断后,还需要在初始化中写入HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)这个函数,才能启动定时中断。

image.png

加上这句话,中断就能进去啦,完美! 开贴记录程序设计过程中的各种坑

2 个评论

遇到一个问题。

项目需要两路的PWM输出。在每个PWM周期内,需要做一次PID计算。

因此,考虑用TIM1产生PWM信号,同时开启TIM1的定时update event中断。

但在仿真的时候,发现updat event中断只进入了两次,后续就进不去了。有没有哪位兄弟遇到过这个情况?

找到原因了。 

HAL_TIM_PWM_Start_IT();这个函数开启的是捕获比较中断(CC),部分代码如下:

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:
    {      
      /* Enable the TIM Capture/Compare 1 interrupt */
      __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1);
    }
    break;

数据手册中,PWM中心对齐计数章节,对输出比较中断描述如下: 

The Output compare interrupt flag of channels configured in output is set when: the
counter counts down (Center aligned mode 1, CMS = "01"), the counter counts up (Center
aligned mode 2, CMS = "10") the counter counts up and down (Center aligned mode 3,
CMS = "11").

大概意思是,在中心对齐模式1时,向下计数触发;中心对齐模式2时,向上计数触发;中心对齐模式3时,向上向下各触发一次。

我配置的时候,用的中心对齐模式1。在计算PID的时候,会存在占空比为0的可能。我的理解是,这个时候没有向上计数,也没有向下计数。所以就无法触发CC中断,如果不进入CC中断,我就无法重新计算PID的值,无法更新占空比,所以占空比将会一直为0。

这样的话,相当于进入了一个死循环,占空比将一直为0,CC中断也无法进入了。

所以,要么改官方的库HAL_TIM_PWM_Start_IT函数,让这个函数开启的不是CC中断,而是其它中断,比如update interrupt。

要么,将PWM输出和时基中断分别启动。

 HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
 HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4); 
 HAL_TIM_Base_Start_IT(&htim1);

这样的话,即使CCR值为0,也能正常进入update 中断,只是update中断会在向上溢出和向下溢出时各产生一次,因此一个PWM周期会产生两次update中断,在中断程序里处理一下就OK了。


上面内容,仅为个人测试结果和理解,不代表绝对正确,各位看官轻喷。

欢迎交流

要回复文章请先登录注册