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

时间:2016-05-11 09:03:33

标签: c timer 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);
    }
}

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

6 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

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

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

使用HAL,开始:

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

停止:

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

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

答案 5 :(得分:-1)

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

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