Forum: Mikrocontroller und Digitale Elektronik STM32L0 Systick bleibt stehen (erhöht sich nicht)


von Robert K. (bobatweb)


Lesenswert?

Guten Tag zusammen,
ich bin vor kurzem geschaeftlich von AVR auf ARM (STM32L0xx) umgstiegen.
Im Moment bin ich dabei mit dem STM32L053 Discovery Board ein LoRa Modem 
(SX1272) mithilfe der LMic Library von IBM zum laufen zu bekommen.
Entschieden wurde, dass moeglichst viel von den STMCube HAL Libraries 
benutzt werden sollen.

Die Base habe ich mir von Cube MX generieren lassen und habe nun die von 
der LMic benoetigten Funktionen implementiert.
Das Programm bricht allerdings bei Aufruf von HAL_Delay() ab, ergo das 
Delay wird niemals wieder verlassen.

Bei einem Printf in die while Schleife der Delay Funktion zeigt sich, 
dass der Systick (angeblich) haengen bleibt und sich nicht weiter 
erhoeht. Wenn ich jedoch den Systick bei HAL_IncTick() auslese wird er 
weiter erhoeht so wie es sein sollte. Da ich noch relativ neu auf dem 
ARM/STM32 Gebiet bin, weiss ich im Moment nicht weiter und hoffe mir 
kann da jemand helfen.

Die Funktionen sind vom Cube MX generiert worden und lediglich durch die 
printf's von mir ergaenzt worden.

__weak void HAL_Delay(__IO uint32_t Delay)
{
  uint32_t tickstart = 0U;
  tickstart = HAL_GetTick();
  DBG_PRINTF("Tickstart: %u - DELAY: %u\n", tickstart, Delay);
  while((HAL_GetTick() - tickstart) < Delay)
  {
    DBG_PRINTF("SYSTICK: %u\n", HAL_GetTick());
  }
  DBG_PRINTF("DELAY finished: %u\n", uwTick);
}

__weak void HAL_IncTick(void)
{
  uwTick++;
  DBG_PRINTF("Tick: %u\n", uwTick);
}

Vielen Dank schonmal,
Mfg Bob

von ui (Gast)


Lesenswert?

Da wie so oft, die hälfte vom Code weggelassen wird kann man dir schwer 
helfen.

von Mehmet K. (mkmk)


Lesenswert?

Robert K. schrieb:
> Wenn ich jedoch den Systick bei HAL_IncTick() auslese wird er
> weiter erhoeht so wie es sein sollte.

Kenne mich dem HAL nicht aus. Aber HAL_IncTick() muss vom 
Interrupt-Handler aufgerufen werden - und nicht von Dir.

von Mehmet K. (mkmk)


Lesenswert?

Habe mal in eines meiner aktuellen Codes geguckt (STM32L051):
1
//=================================
2
// Init
3
//=================================
4
void MyApp::Init( void ) {
5
    FLASH->ACR   |= FLASH_ACR_PRE_READ;
6
    //FLASH->ACR   |= FLASH_ACR_PRFTEN;     // enable prefetch
7
8
    RCC->APB1ENR |= RCC_APB1ENR_PWREN;     // Enable Periph. Power
9
    RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;  // System configuration controller clock enabled
10
    SysTick_Config(2097); // starts SysTick with 1ms and enables SysTick-interrupt
11
    NVIC_SetPriority(SysTick_IRQn, INT_PRIORITY_SYSTICK);
12
...

von Nop (Gast)


Lesenswert?

Robert K. schrieb:

> Entschieden wurde, dass moeglichst viel von den STMCube HAL Libraries
> benutzt werden sollen.

Das macht man als Hobbyist dann, wenn man keine Ahnung von Controllern 
hat und auch keine haben will, sondern nur im Arduino-Stil irgendwas mal 
eben schnell zurechthacken will.

Wie "toll" diese Idee geschäftlich ist, merkst Du gerade daran, daß Du 
bereits an Trivialitäten mit dem Systick hängst.

Aber Hauptsache die Zeit für vernünftige Einarbeitung und Lektüre des 
reference manuals gespart. Das wird noch richtig lustig, wenn Du 
irgendwas Ernsthafteres debuggen sollst und weder einen Plan vom 
Controller hast noch durch die verbuggte und chaotische ST-Software 
durchsteigst...

von rmu (Gast)


Lesenswert?

Wo und was steht (in) der Funktion HAL_GetTick drin und wie ist uwTick 
definiert?

von Jim M. (turboj)


Lesenswert?

Falls uwTick nicht als volatile deklariert ist, kommt es zu dem vom OP 
genannten Problem sobald der Optimizer an ist.

Genau deswegen wollen hier alle den kompletten Source sehen, denn das 
ist wichtig aber vom OP weggelassen worden.

von Zacho (Gast)


Lesenswert?

Wie sieht SysTick_Handler aus?
Wir dort HAL_IncTick() aufgerufen?

Mehmet K. schrieb:
> SysTick_Config(2097);
Yo, I like magic numbers...

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.