Forum: Mikrocontroller und Digitale Elektronik STM32L Timer Problem


von Jürgen (Gast)


Lesenswert?

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

von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


Lesenswert?

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

von W.S. (Gast)


Lesenswert?

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.

von pegel (Gast)


Lesenswert?

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.

von rmu (Gast)


Lesenswert?

ohne kompletten sourcecode ist es nicht recht sinnvoll da herumzuraten. 
kann z.b ein vergessenes paar () sein.

von Jürgen (Gast)


Lesenswert?

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

von Stefan F. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.