2018-02-27 03:49 AM
Hi!
I am trying to use an SD card with the STM32F446RE (using Attolic TrueSTUDIO) but I cannot seem to figure out what I am doing wrong.
I get this error:
FatFS\sd_diskio.h:57:14: error: unknown type name 'Diskio_drvTypeDef'
But in sd_diskio.h file I have already included 'ff_gen_drv.h'. Here is how my sd_diskio.h file looks like:
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __SD_DISKIO_H#define __SD_DISKIO_H/* Includes ------------------------------------------------------------------*/
#include 'stm32_adafruit_sd.h'#include 'ff_gen_drv.h'/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*//* Exported functions ------------------------------------------------------- */extern const Diskio_drvTypeDef SD_Driver;#endif /* __SD_DISKIO_H */
And ff_gen_drv.h file:
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __FF_GEN_DRV_H#define __FF_GEN_DRV_H#ifdef __cplusplus
extern 'C' {#endif/* Includes ------------------------------------------------------------------*/
#include 'sd_diskio.h'#include 'ff.h'#include 'stdint.h'#include 'diskio.h'/* Exported types ------------------------------------------------------------*//**
* @brief Disk IO Driver structure definition */typedef struct{ DSTATUS (*disk_initialize) (BYTE); /*!< Initialize Disk Drive */ DSTATUS (*disk_status) (BYTE); /*!< Get Disk Status */ DRESULT (*disk_read) (BYTE, BYTE*, DWORD, UINT); /*!< Read Sector(s) */#if _USE_WRITE == 1 DRESULT (*disk_write) (BYTE, const BYTE*, DWORD, UINT); /*!< Write Sector(s) when _USE_WRITE = 0 */#endif /* _USE_WRITE == 1 */#if _USE_IOCTL == 1 DRESULT (*disk_ioctl) (BYTE, BYTE, void*); /*!< I/O control operation when _USE_IOCTL = 1 */#endif /* _USE_IOCTL == 1 */}Diskio_drvTypeDef;
/**
* * @brief Global Disk IO Drivers structure definition */typedef struct{ uint8_t is_initialized[_VOLUMES]; const Diskio_drvTypeDef *drv[_VOLUMES]; uint8_t lun[_VOLUMES]; volatile uint8_t nbr;}Disk_drvTypeDef;
/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*//* Exported functions ------------------------------------------------------- */uint8_t FATFS_LinkDriver(const Diskio_drvTypeDef *drv, char *path);uint8_t FATFS_UnLinkDriver(char *path);uint8_t FATFS_LinkDriverEx(const Diskio_drvTypeDef *drv, char *path, BYTE lun);uint8_t FATFS_UnLinkDriverEx(char *path, BYTE lun);uint8_t FATFS_GetAttachedDriversNbr(void);#ifdef __cplusplus
}#endif#endif /* __FF_GEN_DRV_H */
Anyone has any idea what is going on?
2018-02-27 03:52 AM
Whoopsie, I think the problem was this line in ff_gen_drv.h:
#include 'sd_diskio.h'
I do however now get in main errors regarding all file functions such as
'undefined reference to `FATFS_LinkDriver''
2018-02-27 04:59 AM
For FatFs documentation & support, see:
- in particular, note the 'Resources' section at the end of the page.2018-02-27 05:57 AM
That sounds like a Linker error - not compiler error?
So that usually means that you haven't included the source or precompiled library which contains the definitions
2018-02-27 07:52 AM
Review how this project builds/functions and then port that into the F446 trees
STM32Cube_FW_F4_V1.19.0\Projects\STM32F413ZH-Nucleo\Applications\FatFs\FatFs_uSD
I don't use Atollic, but Keil, I've built and fixed implementations based on the Adafruit SD for the F4, F7 and L4 Nucleos
2018-02-27 09:12 AM
I have managed to get it working. I used the example told by @Clive One and the FatFs driver provided in the STM32Cube directory. The problem was that I instantiated the FatFS module using CubeMX and for some reason, something wasn't adding up.