C语言 如何启动和停止STM32上的计时器?

hfwmuf9z  于 2023-01-12  发布在  其他
关注(0)|答案(7)|浏览(329)

我有一个大问题。我不知道如何用一个按钮停止计时器,用另一个按钮重新启动计时器。
这是目前为止我所拥有的代码:
这段代码是启动计时器的按钮的中断处理程序。我认为通过启用计时器是可能的,到目前为止是有效的。

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

有人有什么建议或者知道它是怎么回事吗?

wz8daaqr

wz8daaqr1#

我认为“NVIC_禁用IRQ(TIM7_IRQn);“只禁用计时器的中断,但不停止计时器。您可能需要:“TIM指令(TIM 7,禁用);“而不是“NVIC_禁用IRQ(TIM7_IRQn);“

vxqlmq5t

vxqlmq5t2#

使用[HAL][1]启动:

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

停止:

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

其中_IT为定时器中断模式,定时器停止后可以重新配置[1]:http://www.disca.upv.es/aperles/arm_cortex_m3/llibre/st/STM32F439xx_User_Manual/stm32f4xx__hal__tim_8c.html

4nkexdtk

4nkexdtk3#

或者您可以设置/取消设置CR 1寄存器中的位CEN以启用/禁用定时器

laawzig2

laawzig24#

通过切换定时器控制寄存器1(TIMx_CR1)的CEN位,可以启用/禁用定时器。CEN通常为第0位。
TIM_Cmd(ENABLE)函数调用将启用定时器。
TIM_Cmd(DISABLE)函数调用将禁用计时器。
通过调用NVIC_DisableIRQ(TIM7_IRQn),您只是禁用定时器7的中断,而不是定时器。

yrdbyhpb

yrdbyhpb5#

就像之前说的,CR1做的工作。
可以写入TIMx->CR1 |= value;,其中0的第0位禁用TIM,1使能。

rfbsl7qr

rfbsl7qr6#

您可以更改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)
2j4z5cfb

2j4z5cfb7#

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

相关问题