Forum: Mikrocontroller und Digitale Elektronik STM32 Timer Callback wird nicht aufgerufen?


von Rudii (Gast)


Lesenswert?

Hallo,
so langsam beginne ich zu verzweifeln. Nirgendswo eine vernünftige Doku 
die alles umfasst und oder die Infos verteilen sich auf 3-4 PDFs, 
Anleitungen im Netz sind unauffindbar oder veraltet. Und ein Buch habe 
ich auch noch nicht gefunden.

Habe bereits hier zum IRQHandler fragen gestellt:


Jetzt wollte ich es über die Callback-Funktion machen doch es geht 
einfach nicht!?

Großteil wurde von CubeMX automatisch erstellt.
1
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
2
{
3
4
  if(htim_base->Instance==TIM2)
5
  {
6
  /* USER CODE BEGIN TIM2_MspInit 0 */
7
8
  /* USER CODE END TIM2_MspInit 0 */
9
    /* Peripheral clock enable */
10
    __TIM2_CLK_ENABLE();
11
  /* USER CODE BEGIN TIM2_MspInit 1 */
12
13
  /* USER CODE END TIM2_MspInit 1 */
14
  }
15
16
}
1
void MX_TIM2_Init(void)
2
{
3
4
  TIM_ClockConfigTypeDef sClockSourceConfig;
5
  TIM_MasterConfigTypeDef sMasterConfig;
6
7
  htim2.Instance = TIM2;
8
  htim2.Init.Prescaler = 64;
9
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
10
  htim2.Init.Period = 328125;
11
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV4;
12
  HAL_TIM_Base_Init(&htim2);
13
14
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
15
  HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig);
16
17
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
18
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
19
  HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);
20
21
  //TIM_Cmd(TIM2, ENABLE);
22
  HAL_TIM_Base_Start_IT(&htim2);
23
24
}
1
void HAL_TIM_PeriodElapsedCallback  (TIM_HandleTypeDef *  htim)
2
{
3
  if(htim->Instance == TIM2)
4
  {
5
    usr_toggle_led = 1;
6
    //HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
7
    //HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
8
  }
9
}
1
int main(void)
2
{
3
4
   HAL_Init();
5
6
  /* Configure the system clock */
7
  SystemClock_Config();
8
9
  /* Initialize all configured peripherals */
10
  MX_TIM2_Init();
11
12
  /* Infinite loop */
13
  /* USER CODE BEGIN WHILE */
14
  while (1)
15
  {
16
    //HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
17
    /* USER CODE END WHILE */
18
    if(usr_toggle_led != 0)
19
    {
20
      HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
21
      usr_toggle_led = 0;
22
    }
23
24
    /* USER CODE BEGIN 3 */
25
26
  }
27
  /* USER CODE END 3 */
28
29
}

Warum toggelt mein LED nicht? :(
Vielen lieben dank.
MfG.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Bin jetzt nicht so der Cube Typ sondern eher CMSIS, aber ich vermisse 
das Einschalten der GPIOA Clock und die Initialisierung des NVIC.
Wenn HAL das alleine macht, streiche meine Bemerkung :-)

von Rudii (Gast)


Lesenswert?

Zum NVIC:
1
void HAL_MspInit(void)
2
{
3
  /* USER CODE BEGIN MspInit 0 */
4
5
  /* USER CODE END MspInit 0 */
6
7
  HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0);
8
9
  /* System interrupt init*/
10
  /* SysTick_IRQn interrupt configuration */
11
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
12
13
  /* USER CODE BEGIN MspInit 1 */
14
15
  /* USER CODE END MspInit 1 */
16
}

Zum GPIO gibt's noch(wurde oben raus editiert):
1
void MX_GPIO_Init(void)
2
{
3
4
  GPIO_InitTypeDef GPIO_InitStruct;
5
6
  /* GPIO Ports Clock Enable */
7
  __GPIOC_CLK_ENABLE();
8
  __GPIOH_CLK_ENABLE();
9
  __GPIOA_CLK_ENABLE();
10
  __GPIOB_CLK_ENABLE();
11
12
  /*Configure GPIO pin : PC13 */
13
  GPIO_InitStruct.Pin = GPIO_PIN_13;
14
  GPIO_InitStruct.Mode = GPIO_MODE_EVT_RISING;
15
  GPIO_InitStruct.Pull = GPIO_NOPULL;
16
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
17
18
  /*Configure GPIO pins : PC0 PC1 PC2 PC3 
19
                           PC10 PC12 */
20
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 
21
                          |GPIO_PIN_10|GPIO_PIN_12;
22
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
23
  GPIO_InitStruct.Pull = GPIO_PULLUP;
24
  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
25
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
26
27
  /*Configure GPIO pins : PA0 PA1 PA5 */
28
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_5;
29
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
30
  GPIO_InitStruct.Pull = GPIO_NOPULL;
31
  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
32
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
33
34
  /*Configure GPIO pins : PA2 PA3 */
35
  GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
36
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
37
  GPIO_InitStruct.Pull = GPIO_NOPULL;
38
  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
39
  GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
40
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
41
42
  /*Configure GPIO pin : PB4 */
43
  GPIO_InitStruct.Pin = GPIO_PIN_4;
44
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
45
  GPIO_InitStruct.Pull = GPIO_PULLUP;
46
  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
47
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
48
49
  /*Configure GPIO pins : PB5 PB6 PB7 */
50
  GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
51
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
52
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
53
  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
54
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
55
56
}

MfG.

von Rudii (Gast)


Lesenswert?

Guten Tag

@ Matthias Sch.

VIELEN DANK! es haben tatsächlich zwei Zeilen zum NVIC gefehlt...
1
HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
2
    HAL_NVIC_EnableIRQ(TIM2_IRQn);

Nun geht es.

Ich behaupte jetzt einfach mal die Doku ist nicht sehr gut :(

MfG.

von Di P. (drpepper) Benutzerseite


Lesenswert?

Doku ist nicht so gut, aber im CubMX musst du beim Timer auf der 
NVIC-Seite auch den Interrupt aktivieren.

von hp-freund (Gast)


Lesenswert?

Moiiin Rudii ;-)

Ich habe schon öfter gesehen das für Interrupts das Enable bzw. die Prio 
fehlt.

Mein Tip:
wenn mit CubeMX gearbeitet wird, dann wirklich auch unter Configuration 
alles noch einmal durchsehen.

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.