Hallo zusammen, ich habe gerade ein Problem, ein "Blue Pill" Board mit dem USB Bootloader von https://github.com/rogerclarkmelbourne/STM32duino-bootloader/tree/master/binaries (generic_boot20_pc13.bin) ans laufen zu kriegen. Ich kann problemlos den Bootloader auf den Chip über mein parallel zum USB angeschlossenes USB-Serial Interface an PB9 und PB10 flashen, mit dem stm32loader.py script. Der Bootloader scheint auch aktiv zu sein anhand der LED blink codes, die er beim Betätigen der Reset Taste ausgibt. Weiterhin bin ich in der Lage über den USB Bootloader ein vorher kompiliertes Programm per dfu-util (version 0.9) raufzuladen, nur dass dieses Programm dann keinerlei Funktion zeigt. Lade ich das gleiche Programm ohne Bootloader über den stm32loader.py auf den Chip, funktioniert alles wie es soll. Ich habe ein einfaches Blinky ausprobiert. Mein Verdacht ist, dass das Programm bei Verwendung des Bootloaders evtl. an eine andere Adresse im Flash geladen werden muss, aber da bin ich mir eben nicht sicher. Leider finde ich nur Anleitungen, wie diese Arduino-GUIs zu verwenden sind, aber ich will das nur mit GCC und Makefile und den unter Linux vorhandenen Tools machen. Grüße, Martin
Ja, der bootloader benutzt den ersten Bereich des Programmspeichers. Da wo dein programm normalerweise läuft. Du musst wissen, wo der bootloader das Programm hinpackt. Dann musst Du den Linkerscript entsprechend anpassen. Aber das ist noch nicht alles. Die Vektortable für die Interruptroutinen muss an der richtigen stelle stehen. Mit Glück passt das der Bootloader entsprechend an. Wenn Du CubeMX benutzt, gibt noch eine weitere Falle. Martin
Hallo, anbei mal mein Linker-Script (hoffe es ist auch das relevante Linker-Script, habe da nicht so die Ahnung, da bisher nur mit AVRs unterwegs gewesen). Da war das nicht so relevant.
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 | |
Was müsste ich jetzt da ändern um mit dem USB-Bootloader klarzukommen? Grüße, Martin
Gast
#5699197
Wau! So ein Hammer script für das BluePill? Benutzt du die HAL-Lib?
MEMORY
{
RAM (RWX) : ORIGIN = 0x20000000+0, LENGTH = 20K-0
EXTSRAM (RWX) : ORIGIN = 0x68000000, LENGTH = 0
FLASH (RX) : ORIGIN = 0x08000000+0, LENGTH = 128K-2K-0
EEMUL (RWX) : ORIGIN = 0x08000000+128k-2k, LENGTH = 2k
FLASHB1 (RX) : ORIGIN = 0x00000000, LENGTH = 0
EXTMEMB0 (RX) : ORIGIN = 0x00000000, LENGTH = 0
EXTMEMB1 (RX) : ORIGIN = 0x00000000, LENGTH = 0
EXTMEMB2 (RX) : ORIGIN = 0x00000000, LENGTH = 0
EXTMEMB3 (RX) : ORIGIN = 0x00000000, LENGTH = 0
}
in der Memeory Beschreibung musst Du die Zeile FLASH anpassen. Da steht
ORIGIN und LENGTH
0x8000000 ist start of flash des stm, da steht jetzt Dein bootloader. Du
musst die Adresse entsprechend erhöhen und die Länge kürzen.
Gast
#5699317
pegel schrieb: > Wau! So ein Hammer script für das BluePill? Manche Leute haben das berühmte "Warum soll ichs mir einfach machen wenns auch kompliziert geht?" eben wirklich verinnerlicht.
Hallo, freut mich, dass ich euch mit meinem anscheinend 'overkill' Linker-Script zum Lachen bringen konnte. Ich hab das aus irgend einem Projekt übernommen und es hat funktioniert. So what? Falls jemand was geeigneteres rumliegen hat nehme ich gerne das. Aber es funktioniert leider noch nicht, daher noch einige Fragen: dfu-util -l liefert folgendes:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
Es scheint also mehrere mit alt=? auswählbare Versionen zu geben, die an verschiedene Flash-Adressen laden. Macht das nun der Bootloader von selbst oder muss es trotzdem im Linker-Script angepasst werden? Mein Aufruf von dfu-util zum Flashen sieht dann so aus:
1 | |
Ausgabe ist folgende:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
Ich habe das mit den FLASH Adressen 0x08000000, 0x08002000 und 0x08005000 im Linker-Script versucht, jedoch ohne Erfolg. Hat noch jemand eine Idee? Grüße, Martin
Gast
#5700159
Hättest du meine Frage nach HAL beantwortet .... Aber auch so mein Tip. In der HAL Lib gibt es ein IAP_Binary_Template Projekt, das steht wie es gemacht wird. Wenn du an der Funktion des Boot-Ladens interessiert bist, empfehle ich dazu das IAP_Main Projekt, welches über die serielle Schnittstelle funktioniert.
Hallo pegel, ich benutze kein HAL. Den Bootloader über seriell habe ich ja schon benutzt um den USB Bootloader draufzuspielen. Der funktioniert also. Grüße, Martin
Gast
#5700241
Ich meinte nicht nur das Benutzen, sondern das Erstellen und Verstehen des Bootloaders und der passenden Anwendung.
Hallo, wie du vielleicht merkst, verstehe ich das Ganze nicht wirklich. Was ich bisher dachte zu wissen: der Bootloader setzt sich an die Startadresse, an der normal das Programm startet (in diesem Fall wohl 0x08000000). Nach einem Reset wartet der Bootloader auf ein zu übertagendes Programm. Wenn er das bekommt, lädt er es in einen höheren Adressbereich (in diesem Fall z.B. 0x08002000) und führt es dann aus. Wenn ein Programm schon vorhanden ist wartet der Bootloader kurz ob er ein neues Programm empfangen soll und führt ansonsten schon das vorhandene aus. Soweit mein Verständnis. Was ich nicht weiß, ist wie ein solches Programm beschaffen sein muss, damit es über den Bootloader gestartet werden kann. Ich war der Meinung dass das halbwegs transparent abläuft, aber so scheint es nicht zu sein. Grüße, Martin
Gast
#5700299
Das stimmt im Prinzip auch so. Zuerst musst du wissen an welche Adresse der Bootloader dein Programm lädt. Ein gutes Programm zur Verwaltung des Speichers ist der STM32CubeProgrammer. Der kann SWD, dfu und USB. Damit kannst du sehen wohin dein Prog geladen wird und es entsprechend anpassen. Dann aus der IAP_Binary_Template/readme.txt: To build such application, some special configuration has to be performed: 1. Set the program load address at 0x08004000, using your toolchain linker file 2. Relocate the vector table at address 0x08004000, using the "NVIC_SetVectorTable" function.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.