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?
Steht das HAL_TIM_PeriodElapsedCallback in der main.c ?
Benutzt du tim.h und tim.c um die Timer zu konfigurieren?
ja, steht es. Im Usercode unter der Initalisierung von Timer 2
Wird der Timer 4 auch in der main.c initialisiert?
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);
Dann müssten TIM_HandleTypeDef htim2; TIM_HandleTypeDef htim4; global in der main.c deklariert sein, richtig?
ja genau. Und ich sehe gerade in der _it.c-Datei ist nur extern TIM_HandleTypeDef htim2; Da liegt wahrscheinlich auch das Problem, oder?
Könnte sein. Hat auf jeden Fall mit der Sichtbarkeit von htim4 zu tun.
es klappt auch mit Einbindung von htim 4 in die it.c-Datei nicht
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...
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.