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
Da wie so oft, die hälfte vom Code weggelassen wird kann man dir schwer helfen.
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.
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 | ...
|
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...
Wo und was steht (in) der Funktion HAL_GetTick drin und wie ist uwTick definiert?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.