Hallo, ich möchte per Tastdruck den Timer2 starten und beim loslassen Tasters den Timer2 wieder stoppen. Dies hat nur den Hintergrund die HAL bzw. den Prozessor besser kennzulernen. Die Interrupt Routine habe ich mir über CubeMX generien lassen und diese funktioniert. Der Timer wird bei mir wie folgt Inititalisiert: /* TIM2 Init function */ static void MX_TIM2_Init(void) { TIM_ClockConfigTypeDef sClockSourceConfig; TIM_MasterConfigTypeDef sMasterConfig; __HAL_RCC_TIM2_CLK_ENABLE(); htim2.Instance = TIM2; htim2.Init.Prescaler = 0; // htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 0; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; // TIM_CLOCKDIVISION_DIV4; if (HAL_TIM_Base_Init(&htim2) != HAL_OK){ _Error_Handler(_FILE_, _LINE_); } __HAL_TIM_SET_COUNTER(&htim2, 32); // Nur zum Test sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK){ _Error_Handler(_FILE_, _LINE_); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK){ _Error_Handler(_FILE_, _LINE_); } __HAL_TIM_ENABLE(&htim2); }; Und die Interrupt Routine sieht wie folgt aus: void EXTI0_1_IRQHandler(void){ uint32_t tvalue; /* USER CODE BEGIN EXTI0_1_IRQn 0 */ /* USER CODE END EXTI0_1_IRQn 0 */ HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); /* USER CODE BEGIN EXTI0_1_IRQn 1 */ if(PinState == 0){ /* * Erster Aufruf */ HAL_TIM_Base_Start(&htim2); // Starte Timer ExtPinState = HAL_GPIO_ReadPin(BUTTON_GPIO_Port, BUTTON_Pin); PinValue = ExtPinState; PinState = 1; } else{ HAL_TIM_Base_Stop(&htim2); // Stop Timer nExtPinState = HAL_GPIO_ReadPin(BUTTON_GPIO_Port, BUTTON_Pin); tvalue = __HAL_TIM_GET_COUNTER(&htim2); // Read Value PinState = 0; } /* USER CODE END EXTI0_1_IRQn 1 */ } Im Debugger sehe ich das der Counter überhaupt nicht startet. Was fehlt da noch? Ich möchte hier keine Diskussion über HAL oder nicht HAL starten. Konkret möchte ich das Problem mit HAL lösen. Vielleicht kan mir jemnad weiterhelfen. Danke Jürgen
Wirf den Debugger weg! Braucht kein Mensch. Geh Schritt für Schritt vor und teste erstmal TIM2. Wenn du den Timerausgang auf einen Pin legst, kannst du mit einem Oszi die korrekte Timerfunktion messen. Hier ist eine Initialisierung allerdings mit STM Lib ohne Ausgabe an Pin: TIM_PrescalerConfig(TIM2, 0x0, TIM_PSCReloadMode_Update); TIM_SetAutoreload(TIM2, 22500); TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); TIM_Cmd(TIM2, ENABLE); Vorher ist noch der richtige CLOCK für TIM2 einzuschalten. Grüsse
Jürgen schrieb: > Ich möchte hier keine Diskussion über HAL oder nicht HAL starten. > Konkret möchte ich das Problem mit HAL lösen. Wenn du keine Diskussion willst, dann mußt du schon selber dein Problem lösen. Bedenke mal, daß Andere ganz anders herangehen und deine Quelle derart HAL-lastig aussieht, daß jeder andere, der nicht ganz genau so wie du vorgeht, garantiert keine Lust hat, sich den ganzen Kruscht herunterzuladen und mühsam da durchzusteigen - und alles nur um dir dein Problem zu lösen. Ich selber habe mit den Timern der STM32 als auch der LPC eine ganze Menge gemacht, aber eben alles ohne HAL, ST-Lib und so. Jetzt könnte ich dir helfen, aber das Erste, was ich zur Disposition stellen würde, ist eben die HAL. Tja. W.S.
Ich würde den Timer erst einmal in den main Funktion starten und stoppen, mit einem HAL_Delay dazwischen. Dann im nächsten Schritt den externen Int probieren und dann beides zusammen. Entprellung nicht vergessen. Ach W.S., armer W.S. Lass den Leuten doch ihre Meinung.
ohne kompletten sourcecode ist es nicht recht sinnvoll da herumzuraten. kann z.b ein vergessenes paar () sein.
Hallo, danke für die Antworten. rmu Im Prinzip siehst Du den kompletten Sourcecode in der main() ist nur der SysClock config Aufruf und der Aufruf der Aufruf des GPOI config der den Eingang konfiguriert. Das geht ja alles. Der Taster Pin (STM32L053 DISCO) wird gelesen und der Interrupt erzeugt. Soweit ist alles ok. Gebhard Wieso sollte ich den Debugger wegwerfen? Damit kann ich mir komfortabel Werte/Variable im Controller anschauen. Früher hat man für so ein Teil >20k bezahlt! pegel Dein Vorschlag ist natürlich auch eine Idee. Das mit dem HAL_Delay habe ich schon ausprobiert. Geht gut, habe damit die LED blinken lassen. Ich werde heute Abend einmal schauen ob sich etwas neues ergibt. Ciao Jürgen
Bei meinen ersten Schritten mit dem STM32 habe ich zunächst nur die CMSIS verwendet, die Takterzeugung jedoch ganz "zu Fuß" konfiguriert. Dann habe ich die HAL wegen USB ausprobiert und Tadaa - schon das erste Programm lief nicht. Und zwar, weil die Takterzeugung falsch konfiguriert wurde. Durch die Abstraktion war der Fehler auch noch so gut versteckt, dass ich ihn ohne Hilfe nicht finden konnte. Im Weiteren verlauf meiner Versuche bin ich zu der Erkenntnis gekommen, daß STM sämtliche kostenlose Software mehr oder weniger dahin gerotzt hat. Mit vielen bunten nutzlosen Bildern und nur auf den ersten Blick gut dokumentiert, aber auf den zweiten Blick noch schlechter als Arduino dokumentiert. Offensichtlich stellt STM kostenlose Software nur bereit, um sagen zu können "wir haben auch welche". Damit zu Arbeiten, macht keine Freude. Scheiß HAL.
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.