簡體   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