Hallo zusammen, ich hab ein Problem beim Auslesen der Reset Source von meinem STM32F429. Das Projekt habe ich neu angelegt mittels STMCubeMX und dann in SW4STM32 folgende Zeilen ergänzt: // Reset Source auslesen // test the reset flags in order because the pin reset is always set. if ( RCC_GetFlagStatus ( RCC_FLAG_SFTRST )) { printf ( "Reset Source: Software Reset\r\n" ); } else if ( RCC_GetFlagStatus ( RCC_FLAG_PORRST )) { printf ( "Reset Source: Hardware Reset\r\n" ); } else if ( RCC_GetFlagStatus ( RCC_FLAG_PINRST )) { printf ( "Reset Source: Reset Pin used\r\n" ); } else { printf ( "Reset Source: unbekannt\r\n" ); } // The flags must be cleared manually after use RCC_ClearFlag(); Allerdings bekommen ich Fehler beim Übersetzten: D:\work\stm32\03_SolarController\Debug/../Src/main.c:128: undefined reference to `RCC_GetFlagStatus' D:\work\stm32\03_SolarController\Debug/../Src/main.c:145: undefined reference to `RCC_ClearFlag' D:\work\stm32\03_SolarController\Debug/../Src/main.c:132: undefined reference to `RCC_GetFlagStatus' D:\work\stm32\03_SolarController\Debug/../Src/main.c:136: undefined reference to `RCC_GetFlagStatus' Meine Vermutung ist dass ich ein include nicht richtig gesetzt habe. Entschuldigt bitte ich bin totaler Anfänger in dem Thema. Danke Gruß Markus
Gast
#5237731
Markus R. schrieb: > Meine Vermutung ist dass ich ein include nicht richtig gesetzt habe. Dann zeig doch mal was du inluded hast.
Hier ist die komplette Main.c. Wie gesagt stammt aus dem Cube von dem her mit den vielen Kommentaren.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
83 | |
84 | |
85 | |
86 | |
87 | |
88 | |
89 | |
90 | |
91 | |
92 | |
93 | |
94 | |
95 | |
96 | |
97 | |
98 | |
99 | |
100 | |
101 | |
102 | |
103 | |
104 | |
105 | |
106 | |
107 | |
108 | |
109 | |
110 | |
111 | |
112 | |
113 | |
114 | |
115 | |
116 | |
117 | |
118 | |
119 | |
120 | |
121 | |
122 | |
123 | |
124 | |
125 | |
126 | |
127 | |
128 | |
129 | |
130 | |
131 | |
132 | |
133 | |
134 | |
135 | |
136 | |
137 | |
138 | |
139 | |
140 | |
141 | |
142 | |
143 | |
144 | |
145 | |
146 | |
147 | |
148 | |
149 | |
150 | |
151 | |
152 | |
153 | |
154 | |
155 | |
156 | |
157 | |
158 | |
159 | |
160 | |
161 | |
162 | |
163 | |
164 | |
165 | |
166 | |
167 | |
168 | |
169 | |
170 | |
171 | |
172 | |
173 | |
174 | |
175 | |
176 | |
177 | |
178 | |
179 | |
180 | |
181 | |
182 | |
183 | |
184 | |
185 | |
186 | |
187 | |
188 | |
189 | |
190 | |
191 | |
192 | |
193 | |
194 | |
195 | |
196 | |
197 | |
198 | |
199 | |
200 | |
201 | |
202 | |
203 | |
204 | |
205 | |
206 | |
207 | |
208 | |
209 | |
210 | |
211 | |
212 | |
213 | |
214 | |
215 | |
216 | |
217 | |
218 | |
219 | |
220 | |
221 | |
222 | |
223 | |
224 | |
225 | |
226 | |
227 | |
228 | |
229 | |
230 | |
231 | |
232 | |
233 | |
234 | |
235 | |
236 | |
237 | |
238 | |
239 | |
240 | |
241 | |
242 | |
243 | |
244 | |
245 | |
246 | |
247 | |
248 | |
249 | |
250 | |
251 | |
252 | |
253 | |
254 | |
255 | |
256 | |
257 | |
258 | |
259 | |
260 | |
261 | |
262 | |
263 | |
264 | |
265 | |
266 | |
267 | |
268 | |
269 | |
270 | |
271 | |
272 | |
273 | |
274 | |
275 | |
276 | |
277 | |
278 | |
279 | |
280 | |
281 | |
282 | |
283 | |
284 | |
285 | |
286 | |
287 | |
288 | |
289 | |
290 | |
291 | |
292 | |
293 | |
294 | |
295 | |
296 | |
297 | |
298 | |
299 | |
300 | |
301 | |
302 | |
303 | |
304 | |
305 | |
306 | |
307 | |
308 | |
309 | |
310 | |
311 | |
312 | |
313 | |
314 | |
315 | |
316 | |
317 | |
318 | |
319 | |
320 | |
321 | |
322 | |
323 | |
324 | |
325 | |
326 | |
327 | |
328 | |
329 | |
330 | |
331 | |
332 | |
333 | |
334 | |
335 | |
336 | |
337 | |
338 | |
339 | |
340 | |
341 | |
342 | |
343 | |
344 | |
345 | |
346 | |
347 | |
348 | |
349 | |
350 | |
351 | |
352 | |
353 | |
354 | |
355 | |
356 | |
357 | |
358 | |
359 | |
360 | |
361 | |
362 | |
363 | |
364 | |
365 | |
366 | |
367 | |
368 | |
369 | |
370 | |
371 | |
372 | |
373 | |
374 | |
375 | |
376 | |
377 | |
378 | |
379 | |
380 | |
381 | |
382 | |
383 | |
384 | |
385 | |
386 | |
387 | |
388 | |
389 | |
390 | |
391 | |
392 | |
393 | |
394 | |
395 | |
396 | |
397 | |
398 | |
399 | |
400 | |
401 | |
402 | |
403 | |
404 | |
405 | |
406 | |
407 | |
408 | |
409 | |
410 | |
411 | |
412 | |
413 | |
414 | |
415 | |
416 | |
417 | |
418 | |
419 | |
420 | |
421 | |
422 | |
Gast
#5237750
Wahrscheinlich hast du zwar die richtigen #includes in deinem Quelltext aber der Linker benötigt noch die Information, welche Libraries er dazu linken soll (wo die Implementierung der Funktion drin ist).
Linker-Fehler sagt, der Source für RCC wird nicht mitkompiliert. Oft sind die Source-Files exkludiert, da nicht benötigt. Du musst suchen, wo man die wieder aktivieren kann, dann klappt es auch mit dem Linken.
Das sieht - bei mir in Eclipse - so aus, wie im angehängten Bild (hellgrau ist deaktiviert und wird nicht mitkompiliert). Deinen Editor kenne ich nicht (dachte aber, er ist Eclipse-basierend?) und ich verwende nicht HAL, aber es müsste in etwa ähnlich sein.
Gast
#5237764
Markus R. schrieb: > #include "stm32f4xx_hal.h" Wenn der Compiler dabei nicht meckert dann suche in dieser Datei den Aufruf für <RCC_GetFlagStatus>. Dieser lautet in den HAL- Sourcen vermutlich etwas anders. Vermutlich HAL_RCC_GetFlagStatus oder so. Einfach mal nach Teilstrings suchen, und wenn erfolglos dann in allen Header-Dateien. Bei der SPL lautet die erforderliche Header-Datei <stm32f4xx_rcc.h> Vielleicht muss im HAL-Fall eine solche Datei mit HAL dran inkludiert werden.
Ich kann in meinem ganzen Workspace keinen Eintrag finden der RCC_GetFlagStatus heißt bzw. so ähnlich heißt. Ich vermute ich habe das was aus einer anderen HAL gefunden und nicht aus der die CubeMX und SW4Stm32 nutzt schade. Hat jemand für mich einen Tipp wie ich an die Reset Source ankomme?
Gast
#5237802
Markus R. schrieb: > Meine Vermutung ist dass ich ein include nicht richtig gesetzt habe. > Entschuldigt bitte ich bin totaler Anfänger in dem Thema. So, du bist also ein totaler Anfänger, aber du wagst dich ohne zuvoriges Üben an ein Thema, das dich offensichtlich überfordert. Nein, ich teile deine Vermutung nicht. Vielmehr vermute ich, daß es dir besser täte, in das Referenzmanual zu schauen und dort nachzulesen, wie das Hardware-register tatsächlich heißt, welches die von dir begehrte Information enthält. Und wenn dieses Register in deiner STMdingsda.h nicht enthalten ist, dann mußt du dir wohl oder übel die entsprechende Zeile mit dem #define ... selber formulieren. Die Adresse des Registers hast du ja bereits im RefMan gelesen. Ebenso schau nach, ob dieses Register sich beliebig oft auslesen läßt oder nur einmalig (ich wälze jetzt das Manual nicht für dich!). W.S.
Gast
#5237803
Markus R. schrieb: > Hat jemand für mich einen Tipp wie ich an die Reset Source ankomme? Suche dir in der SPL (vermutlich must du sie dir bei ST erst herunterladen) die entsprechende Source und Header-Datei. Und binde sie in dein Projekt ein. Also stm32f4xx_rcc.h und stm32f4xx_rcc.c
Gast
#5238218
beim F1 sieht es so aus: http://stm32.kosyak.info/doc/stm32f10x__rcc_8h.html http://stm32.kosyak.info/doc/stm32f10x__rcc_8c_source.html Ach ja, deine Fehlermeldung kommt vom Compiler, nicht vom Linker. Es fehlt (mind.) der include vom header.
Ich bin schon erschüttert, was hier alles für nonsense-Tipps gegeben werden ... Der richtige Weg ist: - schau in die stm32f4xx_hal_rcc.c und stm32f4xx_hal_rcc_ex.c und such dir die Funktionen, die du brauchst. Im Code und in den Header-Files steht im Prinzip, was welche Funktion macht. - aktivier den entsprechenden Source-Code, sodass er mitkompiliert wird - dann meckert auch nicht der Linker.
Gast
#5238380
Geht mir auch so. Man sollte nicht mit vollem Mund sprechen. :-P Da der Fehler auf .C mit Zeilennummer zeigt, kommt er vom Compiler. Der Linker würde auf die.o verweisen. ;-)
Danke für die vielen Antworten. Ich hab nochmals die stm32f4xx_hal_rcc.c und die stm32f4xx_hal_rcc_ex.c gecheckt. Ich konnte keine Funktion finden die das gewünschte übernimmt. Vielleicht bin ich auch blind. Aber ich lasse es jetzt im Moment so, vielleicht finde ich ja noch eine andere Lösung die reset source über die CubeHAL auszulesen. Der Weg über das Einbinden der alten LIB .c und .h funktioniert übrigens. Gruß Markus
Gast
#5238396
> vielleicht finde ich ja noch eine andere Lösung die reset > source über die CubeHAL auszulesen. Ich hätte schon längst das Reference Manual nach "reset source" durchsucht und das entsprechende Register einfach ausgelesen. Ich zitiere: The reset source can be identified by checking the reset flags in the RCC clock control & status register (RCC_CSR). Bit 31 LPWRRSTF: Low-power reset flag This bit is set by hardware when a Low-power management reset occurs. Cleared by writing to the RMVF bit. 0: No Low-power management reset occurred 1: Low-power management reset occurred For further information on Low-power management reset, refer to Low-power management reset. Bit 30 WWDGRSTF: Window watchdog reset flag This bit is set by hardware when a window watchdog reset occurs. Cleared by writing to the RMVF bit. 0: No window watchdog reset occurred 1: Window watchdog reset occurred Bit 29 IWDGRSTF: Independent watchdog reset flag This bit is set by hardware when an independent watchdog reset from VDD domain occurs. Cleared by writing to the RMVF bit. 0: No watchdog reset occurred 1: Watchdog reset occurred Bit 28 SFTRSTF: Software reset flag This bit is set by hardware when a software reset occurs. Cleared by writing to the RMVF bit. 0: No software reset occurred 1: Software reset occurred Bit 27 PORRSTF: POR/PDR reset flag This bit is set by hardware when a POR/PDR reset occurs. Cleared by writing to the RMVF bit. 0: No POR/PDR reset occurred 1: POR/PDR reset occurred Bit 26 PINRSTF: PIN reset flag This bit is set by hardware when a reset from the NRST pin occurs. Cleared by writing to the RMVF bit. 0: No reset from NRST pin occurred 1: Reset from NRST pin occurred Bit 25 BORRSTF: BOR reset flag Cleared by software by writing the RMVF bit. This bit is set by hardware when a POR/PDR or BOR reset occurs. 0: No POR/PDR or BOR reset occurred 1: POR/PDR or BOR reset occurred
1 | |
2 | |
3 | |
4 | |
Ist jetzt nicht so schwer, oder?
Gast
#5238406
Mampf F. schrieb: > Ich bin schon erschüttert, was hier alles für nonsense-Tipps gegeben > werden ... > > Der richtige Weg ist: > > - schau in die stm32f4xx_hal_rcc.c und stm32f4xx_hal_rcc_ex.c und such > dir die Funktionen, die du brauchst. Im Code und in den Header-Files > steht im Prinzip, was welche Funktion macht. Markus R. schrieb: > Der Weg über das Einbinden der alten LIB .c und .h funktioniert > übrigens.
Gast
#5238408
Das habe ich schon mitbekommen. Ich wollte nur mal meinen Senf gegen die HAL loswerden.
Gast
#5238409
Stefan U. schrieb: > Ist jetzt nicht so schwer, oder? Das Reference Manual beißt aber. Scheinen viele jedenfalls zu glauben. ^^
Auch ohne den STM32 persönlich zu kennen würde ich sagen: >D:\work\stm32\03_SolarController\Debug/../Src/main.c:128: undefined >reference to `RCC_GetFlagStatus' klingt nicht nach einer Fehlermeldung des Compilers, sondern nach einer des Linkers. Wenn Du Dir mal die genaue Fehlerliste der Ausgabe ansehen würdest, könntest du das selber feststellen. Der Compiler selber ist glücklich, wenn er zu jeder Angabe weiß, was sie zu bedeuten hat. Dies geht aus den eingebundenen Headerdateien hervor. Dies wiederum bedeutet aber nicht automatisch auch, dass auch die Bibliothek erreichbar ist. Das merkt erst der Linker, der die Funktionen zusammenklaubt. Wenn das stimmt, sollte der Fehler darin liegen, dass Du dem Linker nicht "gesagt" hast, welche Bibliotheken er verwenden soll.
Gast
#5238447
W.S. schrieb: > Ebenso schau nach, ob dieses Register sich beliebig oft auslesen läßt > oder nur einmalig (ich wälze jetzt das Manual nicht für dich!). Läßt es sich, zum Reset muß man das Bit RMVF schreiben. Trotzdem ist es grundsätzlich besserer Stil, ein volatile-Register in eine lokale Variable auszulesen und auf der letzteren zu arbeiten, weil der Compiler das dann optimieren kann.
Gast
#5238453
Sebastian S. schrieb: > Auch ohne den STM32 persönlich zu kennen würde ich sagen: Würde ich sagen: lerne ihn erst mal kennen und rede dann mit. Es gab hier genügend Leute die wesentlich näher an dem Problem und seiner Lösung dran waren also du. Also im Zweifelsfall: Wenn man keine Ahnung hat, lieber mal die F..... halten.
Gast
#5238475
1 | |
2 | |
3 | |
4 | |
Gast
#5238478
Dumpf Backe sehr hilfreicher Kommentar vielen Dank!
Gast
#5238482
RCC_ClearFlag(); -> __HAL_RCC_CLEAR_RESET_FLAGS();
Danke pegel! Jetzt weiß ich auch warum ich das nicht gefunden habe, die Funktion versteckt sich in der .h. Na da lerne ich was dazu...
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
