Forum: Mikrocontroller und Digitale Elektronik Interrupt: - STM32f302cc - TIM2_Handler Wird nicht aufgerufen


von Jkkopp (jkkopp)



Lesenswert?

Hey,

ich habe mir ein Board mit einem STM32f302CCT6 entworfen und bin gerade 
dabei jenes mit Code zu befüllen.

Hierzu möchte ich eine State-Machine bauen und hatte mir deshalb den 
Timer 2 geschnappt und wollte dessen Interrupt testen.
1
int main(void)
2
{
3
4
  HAL_Init();
5
6
  SystemClock_Config();
7
8
  MX_GPIO_Init();
9
  MX_USART2_Init();
10
  MX_TIM2_Init();
11
12
13
  /* Infinite loop */
14
  while (1)
15
  {
16
    HAL_GPIO_WritePin(GPIOB, LED_Green_Pin, GPIO_PIN_SET);
17
    HAL_GPIO_WritePin(GPIOB, LED_Green_Pin, GPIO_PIN_RESET);
18
    HAL_GPIO_WritePin(GPIOB, LED_Green_Pin, GPIO_PIN_SET);
19
          HAL_GPIO_WritePin(GPIOB, LED_Green_Pin, GPIO_PIN_RESET);
20
21
  }
22
}
1
void MX_TIM2_Init(void)
2
{
3
  TIM_ClockConfigTypeDef sClockSourceConfig;
4
  TIM_MasterConfigTypeDef sMasterConfig;
5
6
7
8
  __HAL_RCC_TIM2_CLK_ENABLE(); // Neu - Tackt einschalten => Testen.
9
  htim2.Instance = TIM2;
10
  htim2.Init.Prescaler = 160;
11
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
12
  htim2.Init.Period = 8400;
13
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
14
  htim2.Init.RepetitionCounter = 0;
15
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
16
17
18
19
20
  HAL_NVIC_SetPriority( (IRQn_Type)TIM2_IRQn, 5,1 );
21
  HAL_NVIC_EnableIRQ( (IRQn_Type)TIM2_IRQn );
22
23
  if (HAL_TIM_Base_Start_IT(&htim2) != HAL_OK)
24
  {
25
    _Error_Handler(__FILE__, __LINE__);
26
  }
27
28
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
29
  if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
30
  {
31
    _Error_Handler(__FILE__, __LINE__);
32
  }
33
34
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
35
  sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
36
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
37
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
38
  {
39
    _Error_Handler(__FILE__, __LINE__);
40
  }
41
42
}
1
void TIM2_IRQHandler(void)
2
{
3
  HAL_GPIO_TogglePin(GPIOB, LED_Yellow_Pin);
4
5
  HAL_TIM_IRQHandler(&htim2);
6
}

Leider muss da wohl ein Fehler drin sein. Der TIM_IRQHandler wird leider 
nie aufgerufen. - Timer2 Läuft aber (Siehe Debugging-Anhang).

Google und das Datenblatt haben mich leider nicht weiter gebracht. Die 
Threads zu diesem Thema hier auf uC.net leider auch nicht.

Kann mir da bitte jemand drüber sehen und mir eventuell bei meinem 
Problem weiterhelfen?

Viele Grüße & Danke,

jkkopp


-------------------------------------------------------

Update 12:33:

es scheint zu funktionieren. Mit Dem Code von oben, leider aber erst 
wenn ich nach einem Reset einige Minuten gewartet habe.
Werde jetzt mit den Prescalern spielen. Vielleicht weiß ja jemand schon 
meinen Fehler?


Gruß

-------------------------------------------------------

Update 12:43:

Ich habe in den Handler mal einen Breakpoint gesetzt, als er nach 10 
Minuten endlich rein gesprungen war habe ich ein Paar werte 
herauskopiert: (Anhang)

-------------------------------------------------------

Update 13:30:

Bestätigt: Der Code funktioniert, leider kommt ein Interrupt nur ca alle 
4 Minuten.
An folgenden Parameter habe ich schon herumgespielt (Ohne dass es besser 
geworden ist, incl. Aktuellem Wert):
1
- htim2.Init.Prescaler = 16; => Externer Quarz von 16MhZ => es sollte jetzt in einem 1MHZ Takt gezählt werden.
2
- htim2.Init.Period = 80; => DR. Google hat dies in einem anderen Tutorial verwendet. Quelle: uC.net (https://www.mikrocontroller.net/topic/425371)

--------------------------------------------------------

Update 13:44:

Ich habe den Fehler gefunden!

Diese Zwei Zeilen haben mir gefehlt. (in der Timer-init)
  HAL_TIM_Base_Init(&htim2);
  HAL_TIM_Base_Start_IT(&htim2);

Quelle: 
https://arm-stm.blogspot.com/2015/12/timer-interrupt-on-stm32f4-using-hal.html

Danke fürs Mitlesen!

#Gelöst



viel Spaß beim Entwickeln und viele Grüße

Jkkopp

---------------------------------------------------------

Update 14:14:

Kommando zurück:
Leider funktioniert es doch nicht. Ich hätte lieber mal nachmessen 
sollen.
Der Handler wird genauso selten aufgerufen. Nur wird er jetzt zu beginn 
gleich mal aufgerufen. Was mir eine Optische Veränderung beschert hat.

-> Wieder auf Fehlersuche

---------------------------------------------------------

Update 14:40:

Ich habe jetzt mal debuggt: (Bild: STM32_int_communtation-event.png)
Er kommt leider nicht mehr aus der Funkion heraus.
Weiß leider (noch) nicht was da passiert. Wenn jemand was weiß. Ich bin 
über jede Hilfe dankbar!

gruß
---------------------------------------------------------

Update 14:47:

Jetzt scheint es aber zu funkionieren. Ich habe in der Initialisierung 
einige Änderungen vorgenommen. Die LED blinkt jetzt in einer 
Geschwindigkeit die für das Menschliche Auge Sichtbar ist und bleibt 
auch nicht wie davor in irgendeiner Schleife stecken.. Darauf kann ich 
aufbauen.
1
void MX_TIM2_Init(void)
2
{
3
  TIM_ClockConfigTypeDef sClockSourceConfig;
4
  TIM_MasterConfigTypeDef sMasterConfig;
5
6
7
  /* Timer 2 Konfiguration ----------------------------------------------------*/
8
  __HAL_RCC_TIM2_CLK_ENABLE();
9
  htim2.Instance = TIM2;
10
  htim2.Init.Prescaler = 160;
11
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
12
  htim2.Init.Period = 8000;
13
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
14
  htim2.Init.RepetitionCounter = 0;
15
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
16
17
18
  HAL_TIM_Base_Init(&htim2);
19
  HAL_TIM_Base_Start_IT(&htim2);
20
21
22
//  HAL_NVIC_SetPriority( (IRQn_Type)TIM2_IRQn, 5,1 );
23
//  HAL_NVIC_EnableIRQ( (IRQn_Type)TIM2_IRQn );

: Bearbeitet durch User
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.