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.