Jump to content

A problem with reading a file from a microsd card


pur300

Recommended Posts

Hello,

I'm currently working on a project(STM32f4) which uses a chibios and ugfx library and i have a problem reading from a file. When i use a method gfileOpen() it always returns zero(NULL). I've added all necessary define statements into a gfxconf.h config file(#define GFX_USE_OS_CHIBIOS TRUE, #define GFX_USE_GFILE TRUE, #define GFILE_NEED_FATFS TRUE and #define GFILE_NEED_NOAUTOMOUNT FALSE) and i've also enabled a SDC subsystem in a halconf.h config file(#define HAL_USE_SDC TRUE).

Here is my test code:

#include "gfx.h"

GFILE *file;

long length = -1;

int main(void) {

gfxInit();

file = gfileOpen("test.txt", "r");

if(file != NULL){

length = gfileGetSize(file);

}

while(1) {

gfxSleepMilliseconds(1000);

}

return 0;
}

Here is my makefile:

##############################################################################
# Build global options
# NOTE: Can be overridden externally.
#

# Compiler options here.
ifeq ($(USE_OPT),)
USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16
endif

# C specific options here (added to USE_OPT).
ifeq ($(USE_COPT),)
USE_COPT =
endif

# C++ specific options here (added to USE_OPT).
ifeq ($(USE_CPPOPT),)
USE_CPPOPT = -fno-rtti
endif

# Enable this if you want the linker to remove unused code and data
ifeq ($(USE_LINK_GC),)
USE_LINK_GC = yes
endif

# Linker extra options here.
ifeq ($(USE_LDOPT),)
USE_LDOPT =
endif

# Enable this if you want link time optimizations (LTO)
ifeq ($(USE_LTO),)
USE_LTO = no
endif

# If enabled, this option allows to compile the application in THUMB mode.
ifeq ($(USE_THUMB),)
USE_THUMB = yes
endif

# Enable this if you want to see the full log while compiling.
ifeq ($(USE_VERBOSE_COMPILE),)
USE_VERBOSE_COMPILE = no
endif

#
# Build global options
##############################################################################

##############################################################################
# Architecture or project specific options
#

# Enables the use of FPU on Cortex-M4 (no, softfp, hard).
ifeq ($(USE_FPU),)
USE_FPU = no
endif

#
# Architecture or project specific options
##############################################################################

##############################################################################
# Project, sources and paths
#

# Define project name here
PROJECT = ch

# Imported source files and paths
CHIBIOS = ../../chibios
GFXLIB = ../../ugfx
include $(CHIBIOS)/boards/ST_STM32F4_DISCOVERY/board.mk
include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk
include $(CHIBIOS)/os/hal/hal.mk
include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk
include $(CHIBIOS)/os/kernel/kernel.mk
include $(GFXLIB)/gfx.mk
include $(GFXLIB)/boards/base/STM32F407/board.mk # board

# Define linker script file here
LDSCRIPT= $(PORTLD)/STM32F407xG.ld
#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld

# C sources that can be compiled in ARM or THUMB mode depending on the global
# setting.
CSRC = $(PORTSRC) \
$(KERNSRC) \
$(TESTSRC) \
$(HALSRC) \
$(PLATFORMSRC) \
$(BOARDSRC) \
$(GFXSRC) \
$(CHIBIOS)/os/various/devices_lib/accel/lis302dl.c \
$(CHIBIOS)/os/various/chprintf.c \
main.c

# C++ sources that can be compiled in ARM or THUMB mode depending on the global
# setting.
CPPSRC =

# C sources to be compiled in ARM mode regardless of the global setting.
# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler
# option that results in lower performance and larger code size.
ACSRC =

# C++ sources to be compiled in ARM mode regardless of the global setting.
# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler
# option that results in lower performance and larger code size.
ACPPSRC =

# C sources to be compiled in THUMB mode regardless of the global setting.
# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler
# option that results in lower performance and larger code size.
TCSRC =

# C sources to be compiled in THUMB mode regardless of the global setting.
# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler
# option that results in lower performance and larger code size.
TCPPSRC =

# List ASM source files here
ASMSRC = $(PORTASM)

INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \
$(HALINC) $(PLATFORMINC) $(BOARDINC) \
$(GFXINC) \
$(CHIBIOS)/os/various/devices_lib/accel \
$(CHIBIOS)/os/various

#
# Project, sources and paths
##############################################################################

##############################################################################
# Compiler settings
#

MCU = cortex-m4

#TRGT = arm-elf-
TRGT = arm-none-eabi-
CC = $(TRGT)gcc
CPPC = $(TRGT)g++
# Enable loading with g++ only if you need C++ runtime support.
# NOTE: You can use C++ even without C++ support if you are careful. C++
# runtime support makes code size explode.
LD = $(TRGT)gcc
#LD = $(TRGT)g++
CP = $(TRGT)objcopy
AS = $(TRGT)gcc -x assembler-with-cpp
OD = $(TRGT)objdump
SZ = $(TRGT)size
HEX = $(CP) -O ihex
BIN = $(CP) -O binary

# ARM-specific options here
AOPT =

# THUMB-specific options here
TOPT = -mthumb -DTHUMB

# Define C warning options here
CWARN = -Wall -Wextra -Wstrict-prototypes

# Define C++ warning options here
CPPWARN = -Wall -Wextra

#
# Compiler settings
##############################################################################

##############################################################################
# Start of default section
#

# List all default C defines here, like -D_DEBUG=1
DDEFS =

# List all default ASM defines here, like -D_DEBUG=1
DADEFS =

# List all default directories to look for include files here
DINCDIR =

# List the default directory to look for the libraries here
DLIBDIR =

# List all default libraries here
DLIBS =

#
# End of default section
##############################################################################

##############################################################################
# Start of user section
#

# List all user C define here, like -D_DEBUG=1
UDEFS =

# Define ASM defines here
UADEFS =

# List all user directories here
UINCDIR =

# List the user directory to look for the libraries here
ULIBDIR =

# List all user libraries here
ULIBS =

#
# End of user defines
##############################################################################

RULESPATH = $(CHIBIOS)/os/ports/GCC/ARMCMx
include $(RULESPATH)/rules.mk

What could be wrong? Microsd card is partitioned in FAT and there is also test.txt file on it which i would like to read. P.S i'm using Open407V-D development board(http://www.wvshare.com/product/Open407V-D-Standard.htm) which has a SDIO socket.

Link to comment
Share on other sites

Hello pur300 and welcome to the communit!

Have you made sure that the pins of your MCU are properly configured?

Also, try out one of the ChibiOS/RT demos that use FatFS on the STM32F4 first. This helps you to make sure that the actual hardware is running without any problems.

Otherwise, can you try to call gfileMount() manually in order to check its return value? If it fails you can step through the code to reveal the actual problem.

~ Tectu

Link to comment
Share on other sites

I've tried to configure pins in a board.h header file. I've configured GPIOC pins 8,9,10,11,12 and GPIOD pin 2 as an alternate function(AF12).

Here is my board.h file: http://pastebin.com/MPenTVWT

After that i've tried to configure and activate SDC peripheral with functions sdcStart() and sdcConnect(). Function sdcConnect() which initializes an sd card always returns false.

Here is my test code:

#include "ch.h"
#include "hal.h"

bool_t test = false;

SDCConfig conf = {0};

int main(void){

halInit(); // board/device initialization

chSysInit(); // brings up the kernel and sets up "main" as a thread

sdcStart(&SDCD1, &conf);

test = sdcConnect(&SDCD1);

while(1){

chThdSleepMilliseconds(1000);

}

return 0;

}

Link to comment
Share on other sites

This looks like a ChibiOS/RT issue then. I'm sadly not able to verify the pin asignment of your project until the weekend.

Probably taking this to the ChibiOS/RT forum would speed up the process of finding the issue.

If you have your SD card working under ChibiOS/RT it should just work without any problems with the GFILE module.

~ Tectu

Link to comment
Share on other sites

I've managed to read a content of a file in chibios, but i haven't been able to do it in ugfx. I have also configured all pins in board.h file which is located under ugfx/boards/base/STM32F407/chibios_board directory(i copied board files from chibios dir) the same as i did in the chibios board.h file.

Do i have to add #define GFILE_NEED_CHIBIOSFS TRUE or #define GFILE_NEED_FATFS TRUE in ugfxconf.h file?

Link to comment
Share on other sites

I configured ugfx lib and now it finally reads files from an sd card. Is it necessary to add sdcStart() and sdcConnect() function calls before i can use gfile module? Doesn't ugfx lib call all the necessary underlying chibios initialization functions for its modules? Do i have to explicitly call halInit() and chSysInit() before i can use ugfx and gos module, or is it enough just to call gfxInit()?

Link to comment
Share on other sites

Glad to hear that you got it working now!

Is it necessary to add sdcStart() and sdcConnect() function calls before i can use gfile module? Doesn't ugfx lib call all the necessary underlying chibios initialization functions for its modules?

With the current implementation you have to do this manually in your own application code as this is hardware/peripheral specific. For a display or touchscreen you would simply do it in the init() routine of the board file. The GFILE module does however not have a board file. This is probably something we should consider to redesign. Just call them manually for now.

Do i have to explicitly call halInit() and chSysInit() before i can use ugfx and gos module, or is it enough just to call gfxInit()?

You can actually specify the behavior of the gfxInit() call. There is a setting in the configuration file called GFX_NO_OS_INIT. If this is set to FALSE gfxInit() will automatically call halInit() and chSysInit(). If it is set to TRUE you will have to call them manually.

~ Tectu

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...