Forum: Mikrocontroller und Digitale Elektronik stm32 FatFS stranges Problem


von Heiko J. (heiko_j)


Lesenswert?

Hallo,

ich versuche gerade mein Nucleo-F767ZI dazu zu überreden eine SDCARD zu 
mounten. Dabei kommt es zu einem strangen Problem.

Sobald ich f_mount irgendwo im Code aufrufen will bleibt der Nucleo nach 
dem Flashen hängen, und zwar noch bevor der Code überhaupt ausgeführt 
wird.
Es rumpelt dabei so heftig das der stlink das ttyACM0 verliert und ich 
auch nicht mehr neu flashen kann bis ich den stlink aus und wieder 
eingesteckt habe. Lasse ich f_mount auskommentiert läuft alles wie 
gehabt. Ich würde es ja verstehen wenn es rumpelt sobald f_mount 
aufgerufen wird, aber dazu kommt es ja gar nicht. Nicht mal mehr die 
Versionsausgabe gleich nach dem Start über die UART spuckt das Ding in 
diesem Fall aus. Vor allem das sich sogar der stlink dabei weghängt 
finde ich ausgesprochen strange.

Mit freundlichen Grüßen
Heiko
1
  FATFS fs;
2
  FRESULT fret;
3
4
  fprintf(stdout,"f_mount ... ");
5
  osDelay(500);
6
7
  //fret = f_mount(&fs, "0:", 1);
8
9
  osDelay(500);
10
  fprintf(stdout," RC: %u \n", fret);
1
st-flash --serial 303636454646353635313534363637383637313932323535 write build/stm32f767zi_nucleo_144.bin 0x8000000
2
st-flash 1.5.1-31-g625f4cd
3
2019-08-03T22:52:49 INFO common.c: Loading device parameters....
4
2019-08-03T22:52:49 INFO common.c: Device connected is: F76xxx device, id 0x10016451
5
2019-08-03T22:52:49 INFO common.c: SRAM size: 0x80000 bytes (512 KiB), Flash: 0x200000 bytes (2048 KiB) in pages of 2048 bytes
6
2019-08-03T22:52:49 INFO common.c: Attempting to write 115584 (0x1c380) bytes to stm32 address: 134217728 (0x8000000)
7
Flash page at addr: 0x08018000 erasedEraseFlash - Sector:0x3 Size:0x8000 
8
2019-08-03T22:52:50 INFO common.c: Finished erasing 4 pages of 32768 (0x8000) bytes
9
2019-08-03T22:52:50 INFO common.c: Starting Flash write for F2/F4/L4
10
2019-08-03T22:52:50 INFO flash_loader.c: Successfully loaded flash loader in sram
11
enabling 32-bit flash writes
12
size: 32768
13
size: 32768
14
size: 32768
15
size: 17280
16
2019-08-03T22:52:52 INFO common.c: Starting verification of write complete
17
2019-08-03T22:52:53 INFO common.c: Flash written and verified! jolly good!
18
heiko@heiko-desktop:/tmp/convert/stm32f767zi_nucleo_144_repo/stm32f767zi_nucleo_144/STM32CubeMX/stm32f767zi_nucleo_144$ make flash
19
st-flash --serial 303636454646353635313534363637383637313932323535 write build/stm32f767zi_nucleo_144.bin 0x8000000
20
st-flash 1.5.1-31-g625f4cd
21
2019-08-03T22:53:11 INFO common.c: Loading device parameters....
22
2019-08-03T22:53:11 INFO common.c: Device connected is: F76xxx device, id 0x10016451
23
2019-08-03T22:53:11 INFO common.c: SRAM size: 0x80000 bytes (512 KiB), Flash: 0x200000 bytes (2048 KiB) in pages of 2048 bytes
24
2019-08-03T22:53:11 INFO common.c: Attempting to write 115584 (0x1c380) bytes to stm32 address: 134217728 (0x8000000)
25
Flash page at addr: 0x08018000 erasedEraseFlash - Sector:0x3 Size:0x8000 
26
2019-08-03T22:53:13 INFO common.c: Finished erasing 4 pages of 32768 (0x8000) bytes
27
2019-08-03T22:53:13 INFO common.c: Starting Flash write for F2/F4/L4
28
2019-08-03T22:53:13 INFO flash_loader.c: Successfully loaded flash loader in sram
29
enabling 32-bit flash writes
30
size: 32768
31
2019-08-03T22:53:16 ERROR flash_loader.c: flash loader run error
32
2019-08-03T22:53:16 ERROR common.c: stlink_flash_loader_run(0x8000000) failed! == -1
33
stlink_fwrite_flash() == -1
34
Makefile:429: die Regel für Ziel „flash“ scheiterte
35
make: *** [flash] Fehler 255

von zufaulzumanmelden (Gast)


Lesenswert?

Stranges Problem? Das musst du mir explainen.

scnr, aber irgendwann ist auch mal genug, mit dem Denglish

von Heiko J. (heiko_j)


Lesenswert?

Was für eine hilfreiche Antwort !
Danke sehr !

von Junger Mann (Gast)


Lesenswert?

Klingt so als ob da irgendwas überschrieben wird, was nicht 
überschrieben werden sollte. Hast du irgendwo riesige Buffer angelegt?

von Heiko J. (heiko_j)


Lesenswert?

Junger Mann schrieb:
> Klingt so als ob da irgendwas überschrieben wird, was nicht
> überschrieben werden sollte. Hast du irgendwo riesige Buffer angelegt?

Hab ich mir auch schon überlegt und deshalb in der STM32CubeMX den Stack 
und Heap von 0x200/0x400 auf 0x400/0x800 vergrößert. Hat aber auch 
nichts gebracht. Würde der stlink nicht dabei abschmieren könnte ich 
wenigstens mit dem Debugger gucken. Bin am überlegen ob ich nicht in 
einem nicht genutzten IRQ handler testweise mal den aufruf rein mache, 
damit der Code zwar im binary ist, aber nicht aufgerufen wird und der 
optimizer ihn nicht trotzdem raus schmeißt. Nächster Versuch wäre Heap 
und Stack bis zum Anschlag aufzudrehen. RAM hat das Trum ja genug.

Gruß Heiko

von Heiko J. (heiko_j)


Lesenswert?

Ich glaub ich schmeiß nachher wenn ich wieder daheim bin mal den nm an 
und vergleich mal was wieviel frisst.

von Jim M. (turboj)


Lesenswert?

Heiko J. schrieb:
> Es rumpelt dabei so heftig das der stlink das ttyACM0 verliert

Schaltplan, bitte.

Der ST-Link hängt IIRC an der selben 3,3V Quelle, und Dein Problem kling 
so als würde die einbrechen - z.B. durch Kurzschluss oder Überlast.

Eine SD Karte darf in den langsameren Modi aber nur 100mA ziehen.

von Heiko J. (heiko_j)


Lesenswert?

Jim M. schrieb:
> Heiko J. schrieb:
>> Es rumpelt dabei so heftig das der stlink das ttyACM0 verliert
>
> Schaltplan, bitte.
>
> Der ST-Link hängt IIRC an der selben 3,3V Quelle, und Dein Problem kling
> so als würde die einbrechen - z.B. durch Kurzschluss oder Überlast.
>
> Eine SD Karte darf in den langsameren Modi aber nur 100mA ziehen.

Die SD-Karte hängt an PC8-12,PD2 und der GPIO für SD-Present an PG2 
direkt auf 3,3V.

Der Schaltplan ab Seite 73 im PDF:
https://www.st.com/content/ccc/resource/technical/document/user_manual/group0/26/49/90/2e/33/0d/4a/da/DM00244518/files/DM00244518.pdf/jcr:content/translations/en.DM00244518.pdf

Was aber nicht zu der 3,3 V Theorie passt, ist das der stlink schon 
abschmiert bevor f_mount überhaupt aufgerufen wird. Wie schon gesagt, 
ist f_mount auskommentiert läuft alles auch mit angeschlossener SD-Card. 
Mit f_mount kommt aber nicht mal die boot message auf der UART die 
wesentlich weiter vorne kommt.

Das der stlink abschmiert sieht man am output vom 2. Flashversuch den 
ich vorhin angehängt habe.

1. Flashversuch erfolgreich
1
2019-08-03T22:52:50 INFO flash_loader.c: Successfully loaded flash loader in sram
2
enabling 32-bit flash writes
3
size: 32768
4
size: 32768
5
size: 32768
6
size: 17280
7
2019-08-03T22:52:52 INFO common.c: Starting verification of write complete
8
2019-08-03T22:52:53 INFO common.c: Flash written and verified! jolly good!

2. Flashversuch schlägt fehl
1
2019-08-03T22:53:13 INFO flash_loader.c: Successfully loaded flash loader in sram
2
enabling 32-bit flash writes
3
size: 32768
4
2019-08-03T22:53:16 ERROR flash_loader.c: flash loader run error
5
2019-08-03T22:53:16 ERROR common.c: stlink_flash_loader_run(0x8000000) failed! == -1
6
stlink_fwrite_flash() == -1

Grüße Heiko

von Heiko J. (heiko_j)


Angehängte Dateien:

Lesenswert?

So, anbei die 2 "nm -Snv" der elf files. Einmal mit f_mount (crasht), 
einmal f_mount (läuft) auskommentiert.

Gruß Heiko

von Jim M. (turboj)


Lesenswert?

Heiko J. schrieb:
> Was aber nicht zu der 3,3 V Theorie passt, ist das der stlink schon
> abschmiert bevor f_mount überhaupt aufgerufen wird.

Das würde ich mal mit einem Oszi prüfen. Es gibt nämlich nicht viele 
andere Gründe warum das tty weg gehen sollte. Was sagt eigentlich dmesg 
dazu? USB Resets schreibt der Kernel aus.

Außerdem würde ich den delay vom Reset bis f_mount() versuchsweise noch 
weiter vergrößern, auf so 5-10 Sekunden.
Nach dem Flashen wird oft der µC erstmal gestartet und dann nochmal 
resettet (je nach Config von Flasher, Debugger etc). Die 500ms könnten 
noch zuwenig sein.

Ich mache mir beim µC Start gerne mal eine LED Blinksequenz rein.

von Heiko J. (heiko_j)


Lesenswert?

So .... kleines Update. Es sieht nur so aus als ob das tty weg fliegt, 
weil ich ja zum wiederbeleben den stlink ab- und wieder anstecken muss 
...
Der stlink selbst ist noch da, aber es gibt wohl einen Bug im st-flash, 
dass  das st-flash utility das flashen nur beim ersten mal immer richtig 
macht. (https://github.com/texane/stlink/issues/607).

Ändert aber trotzdem nichts daran das der Code das target zum abkacken 
bringt.

von Heiko J. (heiko_j)


Lesenswert?

Jim M. schrieb:
> Das würde ich mal mit einem Oszi prüfen. Es gibt nämlich nicht viele
> andere Gründe warum das tty weg gehen sollte. Was sagt eigentlich dmesg
> dazu? USB Resets schreibt der Kernel aus.
Oszi hab ich ausprobiert. Sieht gut aus. Saubere 3,3V. Ich glaub das tty 
fliegt aber nicht wirklich weg. Sondern ich hab mir da selbst ein Bein 
gestellt, weil nur das ab/an-stecken den st-link wieder zum laufen 
bringt.
Gibt wohl einen Bug im st-flash der mich da trifft wenn das target hängt 
...(https://github.com/texane/stlink/issues/607)

1
[1326538.580832] sd 6:0:0:0: [sdd] 4168 512-byte logical blocks: (2.13 MB/2.04 MiB)
2
[1326538.580980] sd 6:0:0:0: [sdd] Write Protect is off
3
[1326538.580983] sd 6:0:0:0: [sdd] Mode Sense: 03 00 00 00
4
[1326538.581128] sd 6:0:0:0: [sdd] No Caching mode page found
5
[1326538.581131] sd 6:0:0:0: [sdd] Assuming drive cache: write through
6
[1326538.598915] sd 6:0:0:0: [sdd] Attached SCSI removable disk
7
[1328066.880936] usb 1-4.3.1: USB disconnect, device number 23
8
[1328069.149478] usb 1-4.3.1: new full-speed USB device number 24 using xhci_hcd
9
[1328069.250946] usb 1-4.3.1: New USB device found, idVendor=0483, idProduct=374b
10
[1328069.250951] usb 1-4.3.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
11
[1328069.250954] usb 1-4.3.1: Product: STM32 STLink
12
[1328069.250957] usb 1-4.3.1: Manufacturer: STMicroelectronics
13
[1328069.250959] usb 1-4.3.1: SerialNumber: 066EFF565154667867192255
14
[1328069.305263] usb-storage 1-4.3.1:1.1: USB Mass Storage device detected
15
[1328069.305329] scsi host6: usb-storage 1-4.3.1:1.1
16
[1328069.305690] cdc_acm 1-4.3.1:1.2: ttyACM0: USB ACM device
17
[1328070.326238] scsi 6:0:0:0: Direct-Access     MBED     microcontroller  1.0  PQ: 0 ANSI: 2
18
[1328070.327043] sd 6:0:0:0: Attached scsi generic sg4 type 0
19
[1328070.327207] sd 6:0:0:0: [sdd] 4168 512-byte logical blocks: (2.13 MB/2.04 MiB)
20
[1328070.327390] sd 6:0:0:0: [sdd] Write Protect is off
21
[1328070.327395] sd 6:0:0:0: [sdd] Mode Sense: 03 00 00 00
22
[1328070.327573] sd 6:0:0:0: [sdd] No Caching mode page found
23
[1328070.327581] sd 6:0:0:0: [sdd] Assuming drive cache: write through
24
[1328070.345665] sd 6:0:0:0: [sdd] Attached SCSI removable disk
25
[1352245.600209] usb 1-4.3.1: USB disconnect, device number 24
26
[1352245.662533] FAT-fs (sdd): unable to read boot sector to mark fs as dirty
27
[1352248.382240] usb 1-4.3.1: new full-speed USB device number 25 using xhci_hcd
28
[1352248.483857] usb 1-4.3.1: New USB device found, idVendor=0483, idProduct=374b
29
[1352248.483861] usb 1-4.3.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
30
[1352248.483864] usb 1-4.3.1: Product: STM32 STLink
31
[1352248.483866] usb 1-4.3.1: Manufacturer: STMicroelectronics
32
[1352248.483868] usb 1-4.3.1: SerialNumber: 066EFF565154667867192255
33
[1352248.538428] usb-storage 1-4.3.1:1.1: USB Mass Storage device detected
34
[1352248.538546] scsi host6: usb-storage 1-4.3.1:1.1
35
[1352248.538855] cdc_acm 1-4.3.1:1.2: ttyACM0: USB ACM device
36
[1352249.570939] scsi 6:0:0:0: Direct-Access     MBED     microcontroller  1.0  PQ: 0 ANSI: 2
37
[1352249.571886] sd 6:0:0:0: Attached scsi generic sg4 type 0
38
[1352249.572078] sd 6:0:0:0: [sdd] 4168 512-byte logical blocks: (2.13 MB/2.04 MiB)
39
[1352249.572255] sd 6:0:0:0: [sdd] Write Protect is off
40
[1352249.572259] sd 6:0:0:0: [sdd] Mode Sense: 03 00 00 00
41
[1352249.572415] sd 6:0:0:0: [sdd] No Caching mode page found
42
[1352249.572420] sd 6:0:0:0: [sdd] Assuming drive cache: write through
43
[1352249.590340] sd 6:0:0:0: [sdd] Attached SCSI removable disk
>
> Außerdem würde ich den delay vom Reset bis f_mount() versuchsweise noch
> weiter vergrößern, auf so 5-10 Sekunden.
> Nach dem Flashen wird oft der µC erstmal gestartet und dann nochmal
> resettet (je nach Config von Flasher, Debugger etc). Die 500ms könnten
> noch zuwenig sein.
>
> Ich mache mir beim µC Start gerne mal eine LED Blinksequenz rein.

Hab ich beides schon gemacht. Resultat das selbe. Der Code läuft nicht 
mal an.

Gruß Heiko

von MaWin (Gast)


Lesenswert?

Heiko J. schrieb:
> Was für eine hilfreiche Antwort !
> Danke sehr !

Gerne, ich hol mir jetzt einen runter...

von Heiko J. (heiko_j)


Lesenswert?

So ... weiteres update. Der Code läuft prinzipiel an, aber kackt bereits 
im  "MX_USB_DEVICE_Init();" Ganz vorne ab ... Also im vom STM32CubeMX 
generierten Code, weit bevor ich was verbrochen hab. Wenigstens komme 
ich der Sache jetzt mal näher

von Heiko J. (heiko_j)


Lesenswert?

Je mehr Debug code ich rein mache desto weiter vorne kackt alles ab. 
Wahrscheinlich wird der Stack überschrieben vermute ich mal.

Ich denke damit ist das Problem wohl zumindest mal eingegrenzt.

von Heiko J. (heiko_j)


Lesenswert?

Hab jetzt FATFS fs anstatt im Task als Variable anzulegen als Variable 
im Modul angelegt damit es auf dem Heap anstatt auf dem Stack landet und 
es funktioniert.

Fazit: Stack überschrieben und zusammen mit dem Bug im st-flash utility 
ziemlich lange rum gesucht .....

Gruß Heiko

von Junger Mann (Gast)


Lesenswert?

Also so wie ich gesagt habe :-)

von Jim M. (turboj)


Lesenswert?

Heiko J. schrieb:
> Fazit: Stack überschrieben und zusammen mit dem Bug im st-flash utility
> ziemlich lange rum gesucht .....

So ein Bug ist ja mal echt nervig. Hast Du JLink Debugger rumfliegen 
oder kannst Du die STLink umflashen?

Ich kenne bei meinen JLinks hier (auf verschiedenen Dev Boards) solche 
Probleme mit (USB-)Resets nicht.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Wenn du die Variable im Task angelegt hast musste die Stackgröße des 
Tasks anpassen.
Daher hats nix gebracht den globalen Stack zu vergrößern.
Guck mal wo der Task initialisiert wird, da wird auch die Stackgröße 
definiert.

Die Standardstackgröße eines Task ohne manuelle Vergrößerung ist recht 
klein.
Nicht, dass dieses Problem nochmal vorkommt.

Ansonsten kann man zum entwickeln bei FreeRTOS einen kleinen 
Stackchecker aktivieren der per MagicWords guckt ob ein Stack zu groß 
wird.

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.