Riesen Problem: Timer in Timer-Interrupt starten

Gast #5752563
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?
Gast #5752582
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);
Gast #5752708
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...
Gast #5753009
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.

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