繁体   English   中英

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

[英]How can I start and stop a timer on STM32?

我有一个大问题。 我不知道如何用一个按钮停止计时器并用另一个按钮重新启动计时器。

这是我到目前为止的代码:


此代码是启动计时器的按钮的中断处理程序。 我认为通过启用定时器是可能的,到目前为止它是有效的。

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);
    }
}

有没有人有一些提示或知道它必须如何?

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

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

通过切换定时器控制寄存器1(TIMx_CR1)的CEN位可以使能/禁止定时器。 CEN通常是第0位。

TIM_Cmd(ENABLE)函数调用将启用定时器。

TIM_Cmd(DISABLE)函数调用将禁用计时器。

通过调用NVIC_DisableIRQ(TIM7_IRQn) ,您只是禁用Timer7的中断而不是Timer。

您可以更改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.Code如下,定时器可能会出错,

#define ClearTimCount(n)           (n.TIMx->CNT = 0)
#define ClearTimeFlag(n)           (n.TIMx->SR = (U16)~TIM_FLAG_Update)

使用HAL ,开始:

HAL_TIM_Base_Start(&htim#);
HAL_TIM_Base_Start_IT(&htim#);

停止:

HAL_TIM_Base_Stop(&htim#);
HAL_TIM_Base_Stop_IT(&htim#);

其中_IT用于定时器中断模式。 并且您可以在停止后重新配置计时器。

  * @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));
  }
}```

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM