我有一个大问题。我不知道如何用按钮停止计时器并用另一个按钮重新启动计时器。
到目前为止,这是我的代码:
此代码是启动计时器的按钮的中断处理程序。我认为通过启用到目前为止工作的计时器是可能的。
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);
}
}
有没有人有一些提示或知道它必须如何?
答案 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
启用。