Forum: Mikrocontroller und Digitale Elektronik STM32F4 Timer zählt nicht


von rdos (Gast)


Lesenswert?

Hi
ich habe in C eine Funktion geschrieben zum Initialisieren des Timer 7 
auf dem STM32F407 die nicht wie erwartet funktioniert.
Der Counter bleibt einfach bei 0.
Das ganze läuft bei mir in Keil uVision Debugger als Simulation. Kann es 
daran liegen?
Das ganze läuft mit 84 MHz und soll alle 1ms ein Interrupt erzeugen. Die 
Hauptschleife ist leer und die Funktion zum Initialisieren wird vorher 
aufgerufen.

Und hier noch der Source Code:

void Timer_Init(void){
   RCC->APB1ENR |= 0x00000020;   // Clock für TIM7
   TIM7->PSC = 83;            // 1MHz
   TIM7->ARR = 999;           // 1ms
   TIM7->CNT = 0x0000;
   TIM7->CR1 = 0x0005;
   TIM7->EGR = 0x0001;
   TIM7->DIER = 0x0001;
   NVIC_EnableIRQ(TIM7_IRQn); // enable TIM7_IRQn in NVIC
   NVIC_SetPriority(TIM7_IRQn, 4);
}

von Dr. Sommer (Gast)


Lesenswert?

Verwende doch mal die Konstanten aus der Header-Datei für die Bits, 
damit man nicht alles von Hand umrechnen muss. zB:
1
TIM7->CR1 = TIM_CR1_URS | TIM_CR1_CEN;
Das würde die Lesbarkeit und deine Chance auf Erfolg im Forum erhöhen.

rdos schrieb:
> Das ganze läuft bei mir in Keil uVision Debugger als Simulation. Kann es
> daran liegen?
Vielleicht. Hast du denn die 84000 Takte im Simulator abgewartet dass 
ein Interrupt kommt, bzw die 83 Takte dass der Zähler auf 1 geht?

von Little B. (lil-b)


Lesenswert?

ich hab mal kurz gegoogelt...

Keil hat ein dialogfeld für Timer/Counter simulation

was sagt das denn bei dir?

von rdos (Gast)


Angehängte Dateien:

Lesenswert?

Hi
ich hoffe es ist das richtige Fenster. Dort sieht man auch welche Bits 
gesetzt sind. CLK ist auch an TIM7.
Ich starte die Anwendung einfach mit "Run" und die main Schleife wird 
immer wieder ausgeführt. Ist das Falsch?

von public (Gast)


Lesenswert?

rdos schrieb:
> void Timer_Init(void){
>    RCC->APB1ENR |= 0x00000020;   // Clock für TIM7
>    TIM7->PSC = 83;            // 1MHz
>    TIM7->ARR = 999;           // 1ms
>    TIM7->CNT = 0x0000;
>    TIM7->CR1 = 0x0005;
>    TIM7->EGR = 0x0001;
>    TIM7->DIER = 0x0001;
>    NVIC_EnableIRQ(TIM7_IRQn); // enable TIM7_IRQn in NVIC
>    NVIC_SetPriority(TIM7_IRQn, 4);
> }

Wieso benutzt du nicht die StdPeriph Lib? Da hast du doch dann alle 
low-Leveltreiber drin enthalten.

Stelle mal folgenden Ablauf sicher:

1. Timer mit Takt versorgen
2. Timer initialisieren --> StdPeriphLib (TIM_TimeBaseInit + 
TIM_ITConfig)
könnten auch anders heißen, wichtig timer an und timer auf interrupt 
leiten
3. Interrupts initialisieren --> StdPeriphLib (NVIC_Init)
4. Timer starten (TIM_Cmd)

5. Interruptroutine schreiben (TIMx_IRQHandler)
auch hier wieder die StdPeriphLib verwenden (Interrupt-Pending-Bit!)

achja das ist die vorgehensweise beim cortex m3 nicht m4 können sich 
also geringfügig unterscheiden, auf jeden Fall die StdPeriph Lib 
besorgen und auch die Hinweise in den Files durchlesen. Da steht genau 
drin wie es geht.

beste grüße
public

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.