Tutoriel - Bibliothèque STM32_SD_SPI
Interface simple pour gérer une carte SD en mode SPI avec FatFs sur STM32.
Consultez la librairie sur GitHub.
1. Introduction
Cette librairie permet de gérer facilement une carte SD en mode SPI sur STM32, avec le système de fichiers FatFs. Elle fournit des fonctions haut niveau pour lire, écrire, lister, supprimer, formater et manipuler des fichiers et dossiers sur la carte SD.
2. Compatibilité et Prérequis
Compatibilité Matérielle
- Toutes les familles de microcontrôleurs STM32 disposant d'un périphérique SPI.
- Lecteur de carte SD connecté en SPI (CS, SCK, MISO, MOSI).
Prérequis Logiciels
- STM32CubeIDE ou équivalent.
- FatFs intégré au projet (ff.c, ff.h, diskio.c, diskio.h).
- La librairie
STM32_SD_SPI
présente dans le répertoire STM32_Libraries.
3. Fichiers de la librairie
STM32_SD_SPI.h
: Fichier d'en-tête principal.STM32_SD_SPI.c
: Fichier source avec l'implémentation.STM32_SD_SPI_config.h
: Configuration des broches et du SPI.
N'oubliez pas d'adapter STM32_SD_SPI_config.h
à votre configuration matérielle avant de
compiler. (Exemple : définir le port CS, le SPI utilisé, le driver stm32l0xx_hal.h ou autre selon votre
microcontrôleur).
4. Installation et Intégration
- Créez un dossier nommé
STM32_SD_SPI
dans le répertoireDrivers
de votre projet STM32 et copiez y les fichiersSTM32_SD_SPI_config.h
,STM32_SD_SPI.h
etSTM32_SD_SPI.c
. - Ajoutez les chemins d'inclusion : dans les propriétés de votre projet STM32CubeIDE, dans C/C++ General,
> Paths and Symbols > Onglet Includes, dans GNU ajoutez le chemin vers le dossier
STM32_SD_SPI
.
N'oublier pas d'activer le float dans les propriétés du projet pour afficher le nombres flottants dans le printf.
5. Configuration
5.1 SPI
Configurez le SPI dans STM32CubeMX :
- Sélectionnez le mode SPI en
Full Duplex Master
. - Assurez-vous que le mode de transfert est
MSB First
. - Configurez la vitesse d'horloge SPI (ajuster le prescaler pour avoir autour de 250 kBits/s).
- Assurez-vous que CPOL = Low et CPHA = 1 Edge.
- Configurez le GPIO CS (Chip Select) comme sortie push-pull.

- Dans GPIO
- Configurez le GPIO CS (Chip Select) comme sortie push-pull.
- Configurez le GPIO Output Level à
High
>.

5.2 FatFs
Configurez FatFs dans STM32CubeMX :
- Activez FatFs dans le middleware.
- Cochez
User-defined
pour le mode de montage. - suivez cette configuration:


Après avoir générer le code, vous aurez de nouveau dossiers et fichiers, dans le dossier :

le fichier ffconf.h
est le fichier de configuration de FatFs, qui est généré suivant la
configuration dans STM32CubeMX.
Si vous modifier les paramètres ici, lorsque vous générez le code ce fichier sera écrasé avec la configuration de STM32CubeMX.
On doit modifier le fichier user_diskio.c
pour lier FatFs à la librairie STM32_SD_SPI.
On inclue STM32_SD_SPI.h
et string.h
dans user_diskio.c
:
/* Includes ------------------------------------------------------------------*/
#include <string.h>
#include "ff_gen_drv.h"
#include <STM32_SD_SPI.h>
Ensuite, Remplacer le code entre les balise /* USER CODE BEGIN INIT */ et /* USER CODE END INIT */ par le
code suivant dans user_diskio.c
:
/* USER CODE BEGIN INIT */
return SD_disk_initialize(pdrv);
/* USER CODE END INIT */
Entre les balise USER CODE BEGIN STATUS et USER CODE END STATUS, par le
code suivant dans user_diskio.c
:
/* USER CODE BEGIN STATUS */
return SD_disk_status(pdrv);
/* USER CODE END STATUS */
Entre les balise USER CODE BEGIN READ et USER CODE END READ, par le
code suivant dans user_diskio.c
:
/* USER CODE BEGIN READ */
return SD_disk_read(pdrv, buff, sector, count);
/* USER CODE END READ */
Entre les balise USER CODE BEGIN WRITE et USER CODE END WRITE, par le
code suivant dans user_diskio.c
:
/* USER CODE BEGIN WRITE */
return SD_disk_write(pdrv, buff, sector, count);
/* USER CODE END WRITE */
Entre les balise USER CODE BEGIN IOCTL et USER CODE END IOCTL, par le
code suivant dans user_diskio.c
:
/* USER CODE HERE */
return SD_disk_write(pdrv, buff, sector, count);
/* USER CODE END WRITE */
Entre les balise USER CODE BEGIN IOCTL et USER CODE END IOCTL, par le
code suivant dans user_diskio.c
:
/* USER CODE BEGIN IOCTL */
return SD_disk_ioctl(pdrv, cmd, buff);
/* USER CODE END IOCTL */
6.1 Configuration
Adaptez STM32_SD_SPI_config.h
à votre matériel :
#ifndef INC_STM32_SD_SPI_CONFIG_H_
#define INC_STM32_SD_SPI_CONFIG_H_
// Inclusion du driver HAL spécifique au microcontrôleur
#include "stm32l0xx_hal.h" // Assurez-vous que c'est le bon fichier HAL pour votre MCU
// Configuration DU CS (Chip Select) de la carte SD
#define SD_CS_PORT GPIOB // #define SD_CS_PORT SPI2_CS_PORT (avec le user label)
#define SD_CS_PIN GPIO_PIN_1 // #define SD_CS_PIN SPI2_CS_PIN // (avec le user label)
// Configuration du SPI
extern SPI_HandleTypeDef hspi2; // Assurez-vous que c'est le bon handle SPI pour votre MCU
#define HSPI_SDCARD &hspi2 // Handle SPI utilisé
#define SPI_TIMEOUT 100
// Macro pour activer/désactiver le débogage via printf
#define ENABLE_DEBUG 1 // Mettre à 1 pour activer le débogage, 0 pour le désactiver
#if ENABLE_DEBUG
#include
#define DEBUG_PRINTF(...) printf(__VA_ARGS__)
#else
#define DEBUG_PRINTF(...)
#endif
#endif /* INC_STM32_SD_SPI_CONFIG_H_ */
6.2 Inclusion
Incluez la librairie dans votre fichier main.c
entre les balises
USER CODE BEGIN Includes
et USER CODE END Includes
:
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include "STM32_SD_SPI.h"
/* USER CODE END Includes */
6.3 test des fonctions
Pour tester les fonctions de la librairie, vous pouvez utiliser le code suivant entre les balises
USER CODE BEGIN 2
et USER CODE END 2
dans votre fichier main.c
:
/* USER CODE BEGIN 2 */
HAL_Delay(1000);
printf("=== DÉBUT DES TESTS SD ===\r\n");
char tampon[512];
printf("\r\n[TEST] Monter la carte SD\r\n");
SD_Monter();
// printf("\r\n[TEST] Formatage de la carte SD\r\n");
// SD_FormaterCarte();
printf("\r\n[TEST] Création d'un dossier\r\n");
SD_CreerDossier("dossier_test");
printf("\r\n[TEST] Ecriture dans un fichier\r\n");
SD_Ecrire("dossier_test/fichier.txt", "Ligne1\r\nLigne2\r\nLigne3\r\n", 0);
printf("\r\n[TEST] Lecture du fichier\r\n");
SD_Lire("dossier_test/fichier.txt", tampon, sizeof(tampon));
printf("\r\n[TEST] Ajout à la suite\r\n");
SD_Ecrire("dossier_test/fichier.txt", "Ligne4\r\n", 1);
printf("\r\n[TEST] Lecture du fichier\r\n");
SD_Lire("dossier_test/fichier.txt", tampon, sizeof(tampon));
printf("\r\n[TEST] Lecture de la 2e ligne\r\n");
SD_LireLigne("dossier_test/fichier.txt", tampon, sizeof(tampon), 1);
printf("\r\n[TEST] Taille du fichier\r\n");
uint32_t taille = 0;
SD_TailleFichier("dossier_test/fichier.txt", &taille);
printf("\r\n[TEST] Vider le fichier\r\n");
SD_ViderFichier("dossier_test/fichier.txt");
SD_Lire("dossier_test/fichier.txt", tampon, sizeof(tampon));
printf("\r\n[TEST] Renommer le fichier\r\n");
SD_Ecrire("dossier_test/ancien.txt", "Test rename\r\n", 0);
SD_Lister("dossier_test");
SD_Renommer("dossier_test/ancien.txt", "dossier_test/nouveau.txt");
SD_Lister("dossier_test");
printf("\r\n[TEST] Existence du fichier/dossier\r\n");
BYTE existe = 0;
SD_Existe("dossier_test/nouveau.txt", &existe);
SD_Existe("dossier_test", &existe);
printf("\r\n[TEST] Création d'un dossier de destination\r\n");
SD_CreerDossier("dossier_copie");
printf("\r\n[TEST] Déplacement du fichier fichier.txt dans dossier_copie\r\n");
SD_Deplacer("dossier_test/nouveau.txt", "dossier_copie/nouveau.txt");
SD_Lister("dossier_copie");
printf("\r\n[TEST] Suppression du fichier\r\n");
SD_Supprimer("dossier_test/nouveau.txt");
SD_Supprimer("dossier_copie/nouveau.txt");
SD_Lister("dossier_test");
SD_Lister("dossier_copie");
printf("\r\n[TEST] Suppression du dossier\r\n");
SD_Supprimer("dossier_test");
SD_Supprimer("dossier_copie");
SD_Lister("/");
SD_Demonter();
printf("=== FIN DES TESTS SD ===\r\n");
/* USER CODE END 2 */
8. Dépannage
- Erreur d'initialisation :
- Vérifiez le câblage SPI (CS, SCK, MISO, MOSI, VCC, GND).
- Assurez-vous que la carte SD est bien insérée et fonctionnelle.
- Testez avec une autre carte SD si besoin.
- Erreur de lecture/écriture :
- Vérifiez que la carte SD est bien formatée en FAT32.
- Vérifiez les droits d'accès (protection en écriture).
- Pas de sortie
printf
:- Assurez-vous que l'UART est configuré et que
__io_putchar
redirige bienprintf
vers l'UART.
- Assurez-vous que l'UART est configuré et que
- FatFs ne monte pas :
- Vérifiez la configuration de
ffconf.h
(_FS_SPI
,_USE_MKFS
...)
- Vérifiez la configuration de
9. Conclusion
La librairie STM32_SD_SPI simplifie la gestion d'une carte SD en SPI sur STM32. Elle permet de manipuler facilement des fichiers et dossiers avec FatFs. En suivant ce tutoriel, vous pouvez intégrer rapidement la gestion de carte SD dans vos projets STM32.