Forum: Mikrocontroller und Digitale Elektronik Riesen Problem: Timer in Timer-Interrupt starten


von kunsjk (Gast)


Lesenswert?

Hallo, ich möchte beim STM-Board einen Timer in der ISR eines anderen 
Timers starten lassen. Das sieht bei mir für die ISR im Moment so aus:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if (htim->instance==TIM2)
  {HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_4); }
}

Also Timer 4 soll in der ISR von Timer 2 gestartet werden. Das Problem 
ist nur, dass die Variablen von Timer 4 (htim 4 etc.) offensichtlich 
laut Compiler nicht in der ISR von Timer 2 zur Verfügung stehen. Wie 
bekomme ich das Problem gelöst?

von pegel (Gast)


Lesenswert?

Steht das HAL_TIM_PeriodElapsedCallback in der main.c ?

von pegel (Gast)


Lesenswert?

Benutzt du tim.h und tim.c um die Timer zu konfigurieren?

von kunsjk (Gast)


Lesenswert?

ja, steht es. Im Usercode unter der Initalisierung von Timer 2

von kunsjk (Gast)


Lesenswert?

ich habe das mit CubeMX konfiguriert

von pegel (Gast)


Lesenswert?

Wird der Timer 4 auch in der main.c initialisiert?

von kunsjk (Gast)


Lesenswert?

ja, definitiv

htim2.Instance = TIM2;
  htim2.Init.Prescaler = 31250;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 10;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != 
HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM2_Init 2 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if (htim->instance==TIM2)
  {HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_4); }
}
  /* USER CODE END TIM2_Init 2 */



/**
  * @brief TIM4 Initialization Function
  * @param None
  * @retval None
  */
static void MX_TIM4_Init(void)
{

  /* USER CODE BEGIN TIM4_Init 0 */

  /* USER CODE END TIM4_Init 0 */

  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};

  /* USER CODE BEGIN TIM4_Init 1 */

  /* USER CODE END TIM4_Init 1 */
  htim4.Instance = TIM4;
  htim4.Init.Prescaler = 31250;
  htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim4.Init.Period = 3;
  htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  if (HAL_TIM_PWM_Init(&htim4) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_OnePulse_Init(&htim4, TIM_OPMODE_SINGLE) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != 
HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 3;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_4) != 
HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM4_Init 2 */

  /* USER CODE END TIM4_Init 2 */
  HAL_TIM_MspPostInit(&htim4);

von pegel (Gast)


Lesenswert?

Dann müssten

TIM_HandleTypeDef htim2;
TIM_HandleTypeDef htim4;

global in der main.c deklariert sein, richtig?

von kunsjk (Gast)


Lesenswert?

ja genau. Und ich sehe gerade in der _it.c-Datei ist nur
extern TIM_HandleTypeDef htim2;

Da liegt wahrscheinlich auch das Problem, oder?

von pegel (Gast)


Lesenswert?

Könnte sein. Hat auf jeden Fall mit der Sichtbarkeit von htim4 zu tun.

von kunsjk (Gast)


Lesenswert?

es klappt auch mit Einbindung von htim 4 in die it.c-Datei nicht

von C.F. (Gast)


Lesenswert?

schreib einfach zusätzlich
1
 extern TIM_HandleTypeDef htim4;

in die _it.c Datei, natürlich im bereich vom usercode, damit cube bei 
einer neuen erstellung des projekts die zeile nicht wegoptimiert...

von kunsjk (Gast)


Lesenswert?

aber genau das habe ich doch gemacht!

von kunsjk (Gast)


Lesenswert?

Das Erste was der Compiler zu bemängeln hat, ist "error: invalid storage 
class for function 'MX_TIM4_Init'" obwohl ich diese static 
void-Funktion, die von Cube erstellt habe, nie angerührt habe.

von pegel (Gast)


Lesenswert?

Benutzt du SW4STM32?
Hast du im Projekt nachträglich viel verändert oder CubeMX noch einmal 
aufgerufen?
Dann mach ein Index->Rebuild für das Projekt. Dann sucht er sich alles 
neu zusammen.

Ausserdem ist es vielleicht von Vorteil in CubeMX getrennte .h und .c 
Dateien für die einzelnen Komponenten erstellen zu lassen.
Das ist wesentlich übersichtlicher und Fehler lassen sich besser 
eingrenzen.

Dann bleibt auch die main.c kleiner.

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.