Forum: Compiler & IDEs [ARM] bl 0x800037c springt nach 0xa00037c -> crash


von Bernd K. (prof7bit)



Lesenswert?

Ich kämpfe immer noch mit me3inem Problem aus 
Beitrag "stm32nucleo F401RE (Eclipse + GNU-ARM-Plugin + gcc)" und habe einfach mal 
die fehlerhafte Headerdatei modifiziert und die fehlende Definition von 
Hand hinzugefügt so daß es wenigstens ohne Fehler kompiliert. Jetzt 
zeigt sich beim Debuggen aber das im Betreff genannte Phänomen.

Schaut euch mal die beiden Screenshots an. Ich hab einen Breakpoint auf 
die Zeile

tickstart = HAL_GetTick();

gesetzt (siehe erster Screenshot) und dann nur einen Einzelschritt 
weiter finde ich mich plötzlich bei Adresse 0xa00037c anstelle von 
0x800037c und kurz danach knallt es natürlich. Ich hab nachgeschaut: an 
Adresse 0x800037c befindet sich laut Debugger tatsächlich der 
Einsprungpunkt für HAL_GetTick() aber da springt er nicht hin.

Woran kann sowas liegen?

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Ein BL Befehl an 08xxxxxx ist nicht fähig, eine Adresse 0Axxxxxx zu 
erreichen. Das gibt die Befehlscodierung nicht her, die nur Ziele im 
Bereich +/-16MB ansprechen kann.

: Bearbeitet durch User
von Bauteiltöter (Gast)


Lesenswert?

Vermutlich gehst du im singlestep über die Funktion drüber und im 
Inneren crashed es dann - ich vermute, das ein assert() für einen 
Parameter fehlschlägt.

Bist du sicher, dass du in der Zeile Step into... gemacht hast und nicht 
"step over"?

von (prx) A. K. (prx)


Lesenswert?

Kontrolliere auch, ob die darin aufgerufene Taktkonfiguration 
möglicherweise einen unzulässigen Zustand einstellt. Also unzulässige 
Frequenz, unzulässige Anzahl Waitstates für die eingestellte Frequenz, 
etc.

: Bearbeitet durch User
von Bernd K. (prof7bit)


Lesenswert?

Bauteiltöter schrieb:
> Bist du sicher, dass du in der Zeile Step into... gemacht hast und nicht
> "step over"?

Ja, das habe ich.

Der Zufall wäre doch auch zu groß, anstelle von 800037c ausgerechnet 
exakt genau an 0xa00037c zu landen, da steckt kein Zufall dahinter.

von (prx) A. K. (prx)


Lesenswert?

Es dürfte auch kein Zufall sein, dass unmittelbar vorher der Takt 
konfiguriert wird. Wenn dadurch ein unzulässiger Zustand hergestellt 
wird, dann ist so ziemlich alles möglich.

von Bernd K. (prof7bit)


Lesenswert?

A. K. schrieb:
> Kontrolliere auch, ob die darin aufgerufene Taktkonfiguration
> möglicherweise einen unzulässigen Zustand einstellt. Also unzulässige
> Frequenz, unzulässige Anzahl Waitstates für die eingestellte Frequenz,
> etc.

Da bin ich überfordert. Das ist mein erster Ausflug ins ARM-Territorium, 
ich habe nicht die geringste Idee was ich da wo und wie ändern müsste 
oder wo ich nachlesen müsste um zu lernen was da überhaupt vor sich geht 
oder wie dieser monströse Berg von Code der da bereits in ein eigentlich 
leeres(!) Projekt kopiert wird (was ich übrigens als extrem unsauberes 
Konzept empfinde) zu funktionieren hat.

von (prx) A. K. (prx)


Lesenswert?

Bernd K. schrieb:
> Da bin ich überfordert.

Wir auch, wenn wir die Parameter von HAL_RCC_ClockConfig nicht kennen, 
also FLatency (vmtl. 5, dem Debugger nach zu schliessen) und den Inhalt 
der Struktur RCC_ClkInitStruct, und die Spannung, mit der der µC 
arbeitet.

Rück mal dein configure_system_clock raus, in der diese Funktion 
HAL_RCC_ClockConfig aufgerufen wird. Und zwar so, dass man was damit 
anfangen kann, also mit Werten von Parametern und von Benutzer zu 
definierenden Makros.

: Bearbeitet durch User
von Bernd K. (prof7bit)


Lesenswert?

A. K. schrieb:
> Bernd K. schrieb:
>> Da bin ich überfordert.
>
> Wir auch, wenn wir die Parameter von HAL_RCC_ClockConfig nicht kennen,
> also FLatency (vmtl. 5, dem Debugger nach zu schliessen) und den Inhalt
> der Struktur RCC_ClkInitStruct, und die Spannung, mit der der µC
> arbeitet.
>
> Rück mal dein configure_system_clock raus, in der diese Funktion
> HAL_RCC_ClockConfig aufgerufen wird. Und zwar so, dass man was damit
> anfangen kann, also mit Werten von Parametern und von Benutzer zu
> definierenden Makros.
1
/**
2
 * @brief  System Clock Configuration
3
 *         The system Clock is configured as follow :
4
 *            System Clock source            = PLL (HSE)
5
 *            SYSCLK(Hz)                     = 168000000
6
 *            HCLK(Hz)                       = 168000000
7
 *            AHB Prescaler                  = 1
8
 *            APB1 Prescaler                 = 4
9
 *            APB2 Prescaler                 = 2
10
 *            HSE Frequency(Hz)              = HSE_VALUE
11
 *            PLL_M                          = (HSE_VALUE/1000000u)
12
 *            PLL_N                          = 336
13
 *            PLL_P                          = 2
14
 *            PLL_Q                          = 7
15
 *            VDD(V)                         = 3.3
16
 *            Main regulator output voltage  = Scale1 mode
17
 *            Flash Latency(WS)              = 5
18
 * @param  None
19
 * @retval None
20
 */
21
void
22
configure_system_clock(void)
23
{
24
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
25
  RCC_OscInitTypeDef RCC_OscInitStruct;
26
27
  // Enable Power Control clock
28
  __PWR_CLK_ENABLE();
29
30
  // The voltage scaling allows optimizing the power consumption when the
31
  // device is clocked below the maximum system frequency, to update the
32
  // voltage scaling value regarding system frequency refer to product
33
  // datasheet.
34
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
35
36
  // Enable HSE Oscillator and activate PLL with HSE as source
37
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
38
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
39
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
40
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
41
42
  // This assumes the HSE_VALUE is a multiple of 1MHz. If this is not
43
  // your case, you have to recompute these PLL constants.
44
  RCC_OscInitStruct.PLL.PLLM = (HSE_VALUE/1000000u);
45
  RCC_OscInitStruct.PLL.PLLN = 336;
46
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
47
  RCC_OscInitStruct.PLL.PLLQ = 7;
48
  HAL_RCC_OscConfig(&RCC_OscInitStruct);
49
50
  // Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
51
  // clocks dividers
52
  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK
53
      | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
54
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
55
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
56
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
57
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
58
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
59
}

Also das ist die Funktion wie sie vom neues-Projekt-Wizard in meinen 
Projektordner geworfen wurde.

Jetzt noch die defines (zusammengesucht aus verschiedenen anderen 
Quellen) kopier ich einfach mal der Reihe nach unten hin:
1
#define __PWR_CLK_ENABLE()     (RCC->APB1ENR |= (RCC_APB1ENR_PWREN))
2
#define PWR_REGULATOR_VOLTAGE_SCALE1    ((uint32_t)0x0000C000)
3
#define RCC_OSCILLATORTYPE_HSE             ((uint32_t)0x00000001)
4
#define RCC_HSE_ON                       ((uint8_t)0x01)
5
#define RCC_PLL_ON                        ((uint8_t)0x02)
6
#define RCC_PLLSOURCE_HSE                RCC_PLLCFGR_PLLSRC_HSE
7
#define  RCC_PLLCFGR_PLLSRC_HSE              ((uint32_t)0x00400000)
8
9
// HSE_VALUE hat laut eclipse den wert 8000000 kann aber kein entsprechendes #define dafür finden
10
11
#define RCC_PLLP_DIV2                  ((uint32_t)0x00000002)
12
13
#define RCC_CLOCKTYPE_SYSCLK             ((uint32_t)0x00000001)
14
#define RCC_CLOCKTYPE_HCLK               ((uint32_t)0x00000002)
15
#define RCC_CLOCKTYPE_PCLK1              ((uint32_t)0x00000004)
16
#define RCC_CLOCKTYPE_PCLK2              ((uint32_t)0x00000008)
17
#define RCC_SYSCLKSOURCE_PLLCLK          RCC_CFGR_SW_PLL
18
#define  RCC_CFGR_SW_PLL                     ((uint32_t)0x00000002)        /*!< PLL selected as system clock */
19
#define RCC_SYSCLK_DIV1                  RCC_CFGR_HPRE_DIV1
20
#define  RCC_CFGR_HPRE_DIV1                  ((uint32_t)0x00000000)        /*!< SYSCLK not divided */
21
#define RCC_HCLK_DIV4                    RCC_CFGR_PPRE1_DIV4
22
#define  RCC_CFGR_PPRE1_DIV4                 ((uint32_t)0x00001400)        /*!< HCLK divided by 4 */
23
#define RCC_HCLK_DIV2                    RCC_CFGR_PPRE1_DIV2
24
#define  RCC_CFGR_PPRE1_DIV2                 ((uint32_t)0x00001000)        /*!< HCLK divided by 2 */
25
#define FLASH_LATENCY_5                FLASH_ACR_LATENCY_5WS   /*!< FLASH Five Latency cycles     */
26
#define FLASH_ACR_LATENCY_5WS                ((uint32_t)0x00000005)

Also 168MHz ist glaub ich zu hoch, wo würd ich das dann ändern? Gibts 
irgendwo ne halbwegs verständliche Einführung in die Thematik dieser 
zahlreichen Konfigurationsoptionen?

: Bearbeitet durch User
von Bernd K. (prof7bit)


Angehängte Dateien:

Lesenswert?

Das Board hat überhaupt keinen Quarz (vorgesehen aber nicht bestückt) 
:-/

Ob die deshalb auf der Messe nur so um sich geworfen haben mit den 
halbfertigen Dingern?

von (prx) A. K. (prx)


Lesenswert?

X2 sieht schwer nach einem Quarz aus, allerdings ist das im Schaltbild 
ein 32kHz Uhrenquarz.

X3 ist auch im Manual unbestückt: "HSE oscillator on-board from X3 
crystal (not provided)" - RTFM

: Bearbeitet durch User
von Bernd K. (prof7bit)


Lesenswert?

A. K. schrieb:
> X2 sieht schwer nach einem Quarz aus.

Oh, jetzt wo Du's sagst... tatsächlich.

von (prx) A. K. (prx)


Lesenswert?

RTFM, steht alles drin.

von holger (Gast)


Lesenswert?

>Das Board hat überhaupt keinen Quarz (vorgesehen aber nicht bestückt)

Richtig, und deshalb kannst du nicht auf HSE umschalten.
Das Ding läuft dann mit HSI und 16MHz. Für 16MHz ist
deine PLL Einstellung aber falsch.

von (prx) A. K. (prx)


Lesenswert?

Laut Schaltbild und Manual gibts an Stelle von X3 eine Brücke zu einer 
"MCU", die OSC-IN mit Taktversorgen kann. Also Quarz einlöten ist vmtl. 
auch nicht allein selig machend. Aber dazu steht alles im Manual zu 
Board.

von Bernd K. (prof7bit)


Lesenswert?

A. K. schrieb:
> RTFM, steht alles drin.

Ja, das sagt sich so leicht, nicht wahr?

Ich suche zum Beispiel immer noch die Stelle an der der Hersteller 
dieses speziellen Boards erklärt wie an diesem Board der Takt zu 
konfigurieren ist. Oder (falls vorhanden) an welcher Stelle der gefühlt 
unübersichtlichen ST Webseite ich irgendwelche Beispielsoftware für 
genau dieses Board herunterladen kann und wenn ich sie dann 
heruntergeladen habe wo ich in dem Wust von Code (der wahrscheinlich nur 
für kommerzielle 1000€ windows-only third-party IDEs gedacht ist und 
wahrscheinlich komplett anders strukturiert ist als das was der 
Entwickler des gnu-arm Plugins sich da ausgedacht hat) die 
Initialisierung der Taktquelle finde.

von (prx) A. K. (prx)


Lesenswert?

Die Rede ist vom Manual dieses Boards, nicht vom Controller. Der Link 
dorthin ist auf dem Board sogar aufgedruckt!

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.