我有一个大问题。我不知道如何用一个按钮停止计时器,用另一个按钮重新启动计时器。
这是目前为止我所拥有的代码:
这段代码是启动计时器的按钮的中断处理程序。我认为通过启用计时器是可能的,到目前为止是有效的。
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);
}
}
有人有什么建议或者知道它是怎么回事吗?
7条答案
按热度按时间wz8daaqr1#
我认为“NVIC_禁用IRQ(TIM7_IRQn);“只禁用计时器的中断,但不停止计时器。您可能需要:“TIM指令(TIM 7,禁用);“而不是“NVIC_禁用IRQ(TIM7_IRQn);“
vxqlmq5t2#
使用[HAL][1]启动:
停止:
其中
_IT
为定时器中断模式,定时器停止后可以重新配置[1]:http://www.disca.upv.es/aperles/arm_cortex_m3/llibre/st/STM32F439xx_User_Manual/stm32f4xx__hal__tim_8c.html4nkexdtk3#
或者您可以设置/取消设置CR 1寄存器中的位CEN以启用/禁用定时器
laawzig24#
通过切换定时器控制寄存器1(TIMx_CR1)的CEN位,可以启用/禁用定时器。CEN通常为第0位。
TIM_Cmd(ENABLE)
函数调用将启用定时器。TIM_Cmd(DISABLE)
函数调用将禁用计时器。通过调用
NVIC_DisableIRQ(TIM7_IRQn)
,您只是禁用定时器7的中断,而不是定时器。yrdbyhpb5#
就像之前说的,CR1做的工作。
可以写入
TIMx->CR1 |= value;
,其中0
的第0位禁用TIM,1
使能。rfbsl7qr6#
您可以更改CR1值以启用或禁用定时器。如下所示,
此外,禁用定时器时,最好清除CNT和SR寄存器。因为使用32位定时器时,如果不清除CNT和SR,定时器可能出错。代码如下所示:
2j4z5cfb7#