2016-05-11 35 views
2

Ich habe ein großes Problem. Ich weiß nicht, wie ich einen Timer mit einer Taste stoppen und den Timer mit einer anderen Taste neu starten kann.Wie kann ich einen Timer auf STM32 starten und stoppen?

Dies ist der Code, den ich für sie so weit:


Dieser Code ist der Interrupt-Handler für die Schaltfläche, die den Timer zu starten. Ich dachte, dass es möglich ist, indem man den Timer aktiviert, der so weit funktioniert.

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

    } 
} 

Dieser Code ist der Interrupt-Handler für die Schaltfläche, die die thimer stoppen. Dieser Codeabschnitt funktioniert nicht und der Timer bleibt eingeschaltet.

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

Hat Anoyne ein paar Tipps oder wissen, wie es sein muss?

+0

ich kann sehen, wo Sie aktivieren/deaktivieren Sie das Timer-Interrupt, aber ich kann eigentlich keinen Timerstart sehen/überhaupt stoppen? –

Antwort

5

Ich denke, "NVIC_DisableIRQ (TIM7_IRQn);" deaktivieren Sie nur den Interrupt des Timers, aber nicht den Timer zu stoppen. Sie benötigen möglicherweise: "TIM_Cmd (TIM7, DISABLE);" anstelle von „NVIC_DisableIRQ (TIM7_IRQn);“

3

Oder Sie setzen/ungesetzt CEN Bit in CR1 registrieren/deaktivieren Timer aktivieren

2

Die Timer können/deaktiviert werden aktiviert, indem der CEN-Bit des Timer-Steuerregister Makeln 1 (TIMx_CR1). CEN ist normalerweise das 0. Bit.

TIM_Cmd(ENABLE) Funktionsaufruf aktiviert den Timer.

TIM_Cmd(DISABLE) Funktionsaufruf deaktiviert den Timer.

Mit dem Aufruf NVIC_DisableIRQ(TIM7_IRQn) deaktivieren Sie nur den Interrupt für Timer7 nicht den Timer.

-1

Wie gesagt, der CR1 erledigt die Arbeit.

Sie können TIMx->CR1 |= value; schreiben, wobei das 0. Bit in 0 die TIM deaktiviert und 1 aktiviert.

0

Sie CanChange Wert CR1 zu aktivieren oder deaktivieren timer.As folgt,

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

In addtion, wenn deaktivieren Timer, ist es am besten CNT und SR register.Because zu löschen, wenn Sie die 32-Bit-Timer verwenden, Timer vielleicht schief gehen, wenn Sie nicht chear CNT und SR.Code folgen,

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