Hi Ich kämpfe seit einem Tag auf meinem STM32F407VE (Black Board) einen einfachen SDIO DMA TX Transfer zu tätigen und zwar mit HAL und CubeIDE und FsFat. Ich habe mich strickt an diesen Weg gehalten (im PDF) https://community.st.com/s/feed/0D50X00009bMM7JSAW Bevor ich f_write ausführe setze ich den PIN PB15 auf HIGH und nach f_close setzte ich PB15 wieder auf LOW und am Oszi messe ich wie lange f_write bis f_close gedauert hat um einschätzen zu können ob wirklich DMA verwendet wurde. Ich messe immer ~140ms was mir irgendwie nicht koscher vorkommt. Ist der Transfer also doch nicht über DMA gelaufen? Sollte das nicht quasi instant passieren? Vielleicht verstehe ich das auch noch nicht ganz... Aber bei DMA würde ich jetzt nicht eine so große Verzögerung erwarten. Nun habe ich folgende Probleme: Nachdem ich die vier Funktionen in "bsp_driver_sd.c" und "sd_diskio.c" angepasst habe verschwinden die Änderungen sofort wieder wenn ich "Code Generation" erneut ausführe. Also vermeide ich im Moment jede Änderung im "Device Configuration" bis ich herausgefunden habe was der richtige Weg ist. Außerdem verstehe ich den Sinn von FATFS->AdvancedSettings->Use DMA template nicht. Es gibt da wohl unter STM32Cube_FW_F4_V1.25.0/Middlewares/Third_Party/FatFs/src/drivers diverse Templates: sd_diskio_dma_template_bspv1.c sd_diskio_dma_template_bspv2.c sd_diskio_dma_template.h die ich dann wohl irgendwohin in mein Projekt kopieren/umbenennen muss und dann "Use DMA template" aktivieren... Ergo ich sehe überhaupt nicht mehr durch und weiß nicht mal ob ich überhaupt DMA nutze oder nur die ganz normale FatFs Routine... Was ich ausschließen kann: Fehlerhafte Übertragung, die Datei wird fehlerfrei auf die SD Karte geschrieben. Das ist alles was ich ausführe:
1 | f_mount(&fs, SDPath, 1); |
2 | f_open(&fp, name, FA_CREATE_ALWAYS | FA_WRITE); |
3 | HAL_GPIO_WritePin(OUT_GPIO_Port, OUT_Pin, GPIO_PIN_SET); |
4 | f_write(&fp, buffer, BUFFER_SIZE, &stored); |
5 | f_close(&fp); |
6 | HAL_GPIO_WritePin(OUT_GPIO_Port, OUT_Pin, GPIO_PIN_RESET); |
Der TX buffer ist 64KB groß. Mein Board läuft mit: HCLK 32MHz SDIO CLKDIV 25 Hat jemand eine Idee was ich falsch mache oder ob die 140ms normal sind?