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
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
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"?
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
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.
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.
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.
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
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
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?
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
>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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.