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.
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.