STM32 Timer Callback wird nicht aufgerufen?

Gast #4332570
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.
Gast #4332584
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.
Gast #4332618
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.
Gast #4332633
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren