如何在STM32上启动和停止计时器?

8
我有一个大问题,我不知道如何通过一个按钮停止计时器并通过另一个按钮重新开始计时器。
以下是我目前的代码:
这段代码是启动计时器的按钮的中断处理程序。我认为可以通过启用计时器来实现,到目前为止它也有效。
void EXTI0_1_IRQHandler(void)
{
    if ((EXTI->PR & EXTI_PR_PR1) == EXTI_PR_PR1)  /* Check line 1 has triggered the IT */
    {
        EXTI->PR = EXTI_PR_PR1; /* Clear the pending bit */
        NVIC_EnableIRQ(TIM7_IRQn);

    }
}

这段代码是用于停止计时器按钮的中断处理程序。但这段代码无法正常工作,导致计时器仍然在运行。

void EXTI4_15_IRQHandler(void)
{
    if ((EXTI->PR & EXTI_PR_PR4) == EXTI_PR_PR4)  /* Check line 1 has triggered the IT */
    {
        EXTI->PR = EXTI_PR_PR4; /* Clear the pending bit */
        NVIC_DisableIRQ(TIM7_IRQn);
    }
}

有人有一些提示或知道它必须是什么吗?


我可以看到你在哪里启用/禁用定时器中断,但我实际上看不到任何计时器的启动/停止? - Martin James
7个回答

11

我认为“NVIC_DisableIRQ(TIM7_IRQn);”只是禁用了计时器的中断,但没有停止计时器。您可能需要使用“TIM_Cmd(TIM7, DISABLE);”而不是“NVIC_DisableIRQ(TIM7_IRQn);”。


9

1
HAL_TIM_Base_Start():启动定时器基本定时功能。 - geschema

4

或者您可以在CR1寄存器中设置/取消CEN位来启用/禁用定时器。


3
计时器可以通过切换计时器控制寄存器1(TIMx_CR1)的CEN位来启用/禁用。 CEN通常是第0位。
调用TIM_Cmd(ENABLE)函数将启用计时器。
调用TIM_Cmd(DISABLE)函数将禁用计时器。
调用NVIC_DisableIRQ(TIM7_IRQn)会禁用Timer7的中断,而不是计时器本身。

2

如前所述,CR1完成了工作。

您可以编写TIMx->CR1 |= value;,其中在0中的第0位禁用TIM,而1则启用。


2
你可以改变CR1的值来启用或禁用定时器。具体操作如下,
#define EnableTim(n)               (n.TIMx->CR1 |= TIM_CR1_CEN)
#define DisableTim(n)              (n.TIMx->CR1 &= (~((U16)TIM_CR1_CEN)))

此外,当禁用定时器时,最好清除CNT和SR寄存器。因为当使用32位定时器时,如果不清除CNT和SR,则可能会导致定时器出错。代码如下:
#define ClearTimCount(n)           (n.TIMx->CNT = 0)
#define ClearTimeFlag(n)           (n.TIMx->SR = (U16)~TIM_FLAG_Update)

0
  * @brief  Enables or disables the specified TIM peripheral.
  * @param  TIMx: where x can be 1 to 17 to select the TIMx peripheral.
  * @param  NewState: new state of the TIMx peripheral.
  *   This parameter can be: ENABLE or DISABLE.
  * @retval None
  */
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)
{
  /* Check the parameters */
  assert_param(IS_TIM_ALL_PERIPH(TIMx));
  assert_param(IS_FUNCTIONAL_STATE(NewState));
  
  if (NewState != DISABLE)
  {
    /* Enable the TIM Counter */
    TIMx->CR1 |= TIM_CR1_CEN;
  }
  else
  {
    /* Disable the TIM Counter */
    TIMx->CR1 &= (uint16_t)(~((uint16_t)TIM_CR1_CEN));
  }
}```

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接