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);
}
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?
ich hab mal kurz gegoogelt... Keil hat ein dialogfeld für Timer/Counter simulation was sagt das denn bei dir?
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
