2016-05-11 5 views
2

У меня большая проблема. Я не знаю, как я могу остановить таймер кнопкой и перезапустить таймер с помощью другой кнопки.Как запустить и остановить таймер на 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); 

    } 
} 

Этот код прерывания обработчик для кнопки, что остановить thimer. Этот фрагмент кода не работает, и таймер остается включенным.

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

Есть ли у anoyne какие-то подсказки или знать, как это должно быть?

+0

я могу увидеть, где вы включить/отключить прерывание таймера, но я не могу на самом деле вижу таймер запуска/остановки на всех? –

ответ

5

Я думаю: «NVIC_DisableIRQ (TIM7_IRQn)», просто отключите прерывание таймера, но не остановите таймер. Возможно, вам понадобится: «TIM_Cmd (TIM7, DISABLE);» вместо «NVIC_DisableIRQ (TIM7_IRQn);»

3

Или вы можете установить/снять битый ЕКС в CR1 регистр для включения/выключения таймера

2

Таймеры могут быть включены/отключены переключая битый ЕКС регистра управления таймеров 1 (TIMx_CR1). CEN обычно 0-й бит.

TIM_Cmd(ENABLE) Функция вызова позволит таймеру.

TIM_Cmd(DISABLE) вызов функции отключит таймер.

Вызывая NVIC_DisableIRQ(TIM7_IRQn), вы просто отключите прерывание для Timer7, а не Timer.

-1

Как сказано ранее, CR1 выполняет работу.

Вы можете написать TIMx->CR1 |= value;, где 0-й бит в 0 отключает TIM, а 1 разрешает.

0

Вы canchange значение CR1, чтобы включить или отключить timer.As следует,

#define EnableTim(n)    (n.TIMx->CR1 |= TIM_CR1_CEN) 
#define DisableTim(n)    (n.TIMx->CR1 &= (~((U16)TIM_CR1_CEN))) 

В addtion, когда таймер отключения, то лучше, чтобы очистить CNT и SR register.Because при использовании таймера 32bit, таймер может быть, пойти не так, если вы не chear CNT и SR.Code следует,

#define ClearTimCount(n)   (n.TIMx->CNT = 0) 
#define ClearTimeFlag(n)   (n.TIMx->SR = (U16)~TIM_FLAG_Update)