Forum: Mikrocontroller und Digitale Elektronik STM32F205 Timer Initialisierung


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Lars F. (flemmy)


Bewertung
0 lesenswert
nicht lesenswert
Moin zusammen,

Mir macht aktuell die Initialisierung des TIM5 im Input Capture Mode bei 
einem STM32F205 Sorgen.
Im Prinzip geht es um eine Frequenzmessung bei der jeweils zwischen zwei 
steigenden Flanken die Zeit gemessen wird. t1 - t0 ergibt dann also die 
Periodendauer. Das Ganze funktioniert auch, aber...

Kompiliere ich das ganze mit der IAR Embedded Workbench und lade es mit 
dem I-jet über JTAG auf den µC läuft das Programm zwar los, der Debugger 
zeigt mir den SysTick Interrupt an, aber vom TIM5 Interrupt ist nichts 
zu sehen. Entsprechend tut sich auch bei der Peiodendauer nichts, sie 
bleibt auf ihrem Initialwert 0 stehen. Ein Blick in die Register zeigt, 
dass bei der Initialisierung von CCMR2 (Da Ch3 von TIM5 genutzt wird) 
und CCER etwas schiefgelaufen sein muss. Die entsprechenden nötigen Bit 
fehlen.

Mache ich über die IAR einen Software Reset ist alles wunderbar. Die 
Register sind vollständig konfiguriert, der TIM5 Interrupt läuft und ich 
kann die Periodendauer für Frequenzen von unter 1 Hz bis fast 400 kHz 
mit ausreichender Genauigkeit bestimmen.

Ein Reset über den entsprechenden HW Button löst lediglich den 
entsprechenden Interrupt aus. Anschließend bleibt der TIM 5 Interrupt 
weiter aus.

1
// GPIO INITIALIZATION
2
GPIO_pinCfg_t gpioInit;
3
4
gpioInit.GPIO_Pin = FREQ_DETECT;
5
gpioInit.GPIO_Mode = GPIO_MODE_AF;
6
gpioInit.GPIO_PuPd = GPIO_PUPD_DOWN;
7
gpioInit.GPIO_Speed = GPIO_SPEED_100MHz;
8
9
GPIO_init(FREQ_DETECT_PORT, &gpioInit); // Init GPIO PA2
10
11
GPIO_configurePinAF(FREQ_DETECT_PORT, FREQ_DETECT_SRC, GPIO_AF_TIM5);
12
13
14
// TIMER IC INITIALIZATION
15
TIM_icCfg_t icInit;
16
17
TIM_deInit(TIM5);
18
19
TIM_configurePrescaler(TIM5, 59, TIM_PRESCALE_RELOAD_IMMEDIATE);
20
21
icInit.TIM_Channel = TIM_CHANNEL_3;
22
icInit.TIM_ICPolarity = TIM_IC_POLARITY_RISING;
23
icInit.TIM_ICSelection = TIM_IC_SELECTION_DIRECT;
24
icInit.TIM_ICPrescaler = TIM_IC_PRESCALE_DIV1;
25
icInit.TIM_ICFilter = 0;
26
27
TIM_initIC(TIM5, &icInit);
28
29
//  TIM5->CCMR2 = 1;
30
//  TIM5->CCER = 256;
31
32
TIM_enableTimer(TIM5);
33
34
35
// IT INITIALIZATION
36
NVIC_interrupt_t itInit;
37
38
itInit.NVIC_channelIRQ = TIM5_IRQn;
39
itInit.NVIC_preemptionPriority = 0;
40
itInit.NVIC_subpriority = 1;
41
itInit.NVIC_activeState = ENABLE;
42
43
NVIC_init(&itInit);
44
45
TIM_configureIT(TIM5, TIM_IT_CC3, ENABLE);

Es macht dabei keinen Unterschied ob die direkten Registerzugriffe auf 
CCMR2 und CCER auskommentiert sind oder nicht. Das Programm beginnt erst 
dann richtig zu funktionieren, wenn einmal ein SW Reset durchgeführt 
wurde.

Habt ihr Ideen was das Problem sein könnte oder wie man es lösen kann? 
Ist  euch vielleicht etwas Ähnliches schon begegnet?

Gruß
Lars

UPDATE:
Das Problem hab ich gefixt indem ich nach der TIM_deInit(TIM5) den Timer 
einmal enable und danach direkt disable.
Die Lösung finde ich aber unbefriedigend, also falls jemand noch bessere 
Ideen hat, gern her damit.

: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.