STM32F429I-Disco with SDCard

ChibiOS public support forum for topics related to the STMicroelectronics STM32 family of micro-controllers.

Moderator: RoccoMarco

kiwi
Posts: 13
Joined: Mon Feb 23, 2015 3:47 pm

Re: STM32F429I-Disco with SDCard

Post by kiwi »

Hi Giovanni,

thanks for pin pointing me, I got it working :)

best,
kiwi
kiwi
Posts: 13
Joined: Mon Feb 23, 2015 3:47 pm

Re: STM32F429I-Disco with SDCard

Post by kiwi »

Since I was asked by a PM, here is my working code.
First a simple main.c to test you configuration and then the configuration for GPIOC and GPIOD. Please note that I renamed the pin defines to fit their new function.

Code: Select all

/* ChibiOS */
#include "ch.h"
#include "hal.h"

/* FatFS */
#include "ff.h"

#include "main.h"

FATFS SDC_FS;

/* SDCDriver config. */
static SDCConfig sdccfg = {0};

int main(void)
{
  halInit();
  chSysInit();

  /* Initialize SDCard over SDIO */
  sdcObjectInit(&SDCD1);
  sdcStart(&SDCD1, &sdccfg);

  if(sdcConnect(&SDCD1) == CH_SUCCESS) {
    if(f_mount(0, &SDC_FS) == FR_OK) {
      FIL file;
      UINT written;

      if(f_open(&file, "test.txt", FA_CREATE_ALWAYS) == FR_OK) {
        f_write(&file, (void*)"a", 8, &written);
        f_close(&file);
      }
    }
  }

  while(TRUE) {
    chThdSleepMilliseconds(500);
  }

  return 1;
}


Code: Select all

#define GPIOC_FMC_SDNWE             0
#define GPIOC_SPI5_MEMS_CS          1
#define GPIOC_SPI5_LCD_CS           2
#define GPIOC_PIN3                  3
#define GPIOC_OTG_HS_PSO            4
#define GPIOC_OTG_HS_OC             5
#define GPIOC_LCD_HSYNC             6
#define GPIOC_LCD_G6                7
#define GPIOC_SD_D0                 8
#define GPIOC_SD_D1                 9
#define GPIOC_SD_D2                 10
#define GPIOC_SD_D3                 11   
#define GPIOC_SD_CLK                12
#define GPIOC_PIN13                 13
#define GPIOC_OSC32_IN              14
#define GPIOC_OSC32_OUT             15

/*
 * GPIOC setup:
 *
 * PC0  - FMC_SDNWE                 (alternate 12).
 * PC1  - SPI5_MEMS_CS              (output pushpull maximum).
 * PC2  - SPI5_LCD_CS               (output pushpull maximum).
 * PC3  - PIN3                      (input pullup).
 * PC4  - OTG_HS_PSO                (output pushpull maximum).
 * PC5  - OTG_HS_OC                 (input floating).
 * PC6  - LCD_HSYNC                 (alternate 14).
 * PC7  - LCD_G6                    (alternate 14).
 * PC8  - SD_D0                     (alternate 12).
 * PC9  - SD_D1                     (alternate 12).
 * PC10 - SD_D2                     (alternate 12).
 * PC11 - SD_D3                     (alternate 12).
 * PC12 - SD_CLK                    (alternate 12).
 * PC13 - PIN13                     (input pullup).
 * PC14 - OSC32_IN                  (input floating).
 * PC15 - OSC32_OUT                 (input floating).
 */
#define VAL_GPIOC_MODER             (PIN_MODE_ALTERNATE(GPIOC_FMC_SDNWE) |  \
                                     PIN_MODE_OUTPUT(GPIOC_SPI5_MEMS_CS) |  \
                                     PIN_MODE_OUTPUT(GPIOC_SPI5_LCD_CS) |   \
                                     PIN_MODE_INPUT(GPIOC_PIN3) |           \
                                     PIN_MODE_OUTPUT(GPIOC_OTG_HS_PSO) |    \
                                     PIN_MODE_INPUT(GPIOC_OTG_HS_OC) |      \
                                     PIN_MODE_ALTERNATE(GPIOC_LCD_HSYNC) |  \
                                     PIN_MODE_ALTERNATE(GPIOC_LCD_G6) |     \
                                     PIN_MODE_ALTERNATE(GPIOC_SD_D0) |           \
                                     PIN_MODE_ALTERNATE(GPIOC_SD_D1) |   \
                                     PIN_MODE_ALTERNATE(GPIOC_SD_D2) |     \
                                     PIN_MODE_ALTERNATE(GPIOC_SD_D3) |          \
                                     PIN_MODE_ALTERNATE(GPIOC_SD_CLK) |          \
                                     PIN_MODE_INPUT(GPIOC_PIN13) |          \
                                     PIN_MODE_INPUT(GPIOC_OSC32_IN) |       \
                                     PIN_MODE_INPUT(GPIOC_OSC32_OUT))
#define VAL_GPIOC_OTYPER            (PIN_OTYPE_PUSHPULL(GPIOC_FMC_SDNWE) |  \
                                     PIN_OTYPE_PUSHPULL(GPIOC_SPI5_MEMS_CS) |\
                                     PIN_OTYPE_PUSHPULL(GPIOC_SPI5_LCD_CS) |\
                                     PIN_OTYPE_PUSHPULL(GPIOC_PIN3) |       \
                                     PIN_OTYPE_PUSHPULL(GPIOC_OTG_HS_PSO) | \
                                     PIN_OTYPE_PUSHPULL(GPIOC_OTG_HS_OC) |  \
                                     PIN_OTYPE_PUSHPULL(GPIOC_LCD_HSYNC) |  \
                                     PIN_OTYPE_PUSHPULL(GPIOC_LCD_G6) |     \
                                     PIN_OTYPE_PUSHPULL(GPIOC_SD_D0) |       \
                                     PIN_OTYPE_PUSHPULL(GPIOC_SD_D1) |  \
                                     PIN_OTYPE_PUSHPULL(GPIOC_SD_D2) |     \
                                     PIN_OTYPE_PUSHPULL(GPIOC_SD_D3) |      \
                                     PIN_OTYPE_PUSHPULL(GPIOC_SD_CLK) |      \
                                     PIN_OTYPE_PUSHPULL(GPIOC_PIN13) |      \
                                     PIN_OTYPE_PUSHPULL(GPIOC_OSC32_IN) |   \
                                     PIN_OTYPE_PUSHPULL(GPIOC_OSC32_OUT))
#define VAL_GPIOC_OSPEEDR           (PIN_OSPEED_100M(GPIOC_FMC_SDNWE) |     \
                                     PIN_OSPEED_100M(GPIOC_SPI5_MEMS_CS) |  \
                                     PIN_OSPEED_100M(GPIOC_SPI5_LCD_CS) |   \
                                     PIN_OSPEED_2M(GPIOC_PIN3) |            \
                                     PIN_OSPEED_100M(GPIOC_OTG_HS_PSO) |    \
                                     PIN_OSPEED_100M(GPIOC_OTG_HS_OC) |     \
                                     PIN_OSPEED_100M(GPIOC_LCD_HSYNC) |     \
                                     PIN_OSPEED_100M(GPIOC_LCD_G6) |        \
                                     PIN_OSPEED_100M(GPIOC_SD_D0) |            \
                                     PIN_OSPEED_100M(GPIOC_SD_D1) |      \
                                     PIN_OSPEED_100M(GPIOC_SD_D2) |        \
                                     PIN_OSPEED_100M(GPIOC_SD_D3) |           \
                                     PIN_OSPEED_100M(GPIOC_SD_CLK) |           \
                                     PIN_OSPEED_2M(GPIOC_PIN13) |           \
                                     PIN_OSPEED_100M(GPIOC_OSC32_IN) |      \
                                     PIN_OSPEED_100M(GPIOC_OSC32_OUT))
#define VAL_GPIOC_PUPDR             (PIN_PUPDR_FLOATING(GPIOC_FMC_SDNWE) |  \
                                     PIN_PUPDR_FLOATING(GPIOC_SPI5_MEMS_CS) |\
                                     PIN_PUPDR_FLOATING(GPIOC_SPI5_LCD_CS) |\
                                     PIN_PUPDR_PULLUP(GPIOC_PIN3) |         \
                                     PIN_PUPDR_FLOATING(GPIOC_OTG_HS_PSO) | \
                                     PIN_PUPDR_FLOATING(GPIOC_OTG_HS_OC) |  \
                                     PIN_PUPDR_FLOATING(GPIOC_LCD_HSYNC) |  \
                                     PIN_PUPDR_FLOATING(GPIOC_LCD_G6) |     \
                                     PIN_PUPDR_FLOATING(GPIOC_SD_D0) |         \
                                     PIN_PUPDR_FLOATING(GPIOC_SD_D1) |   \
                                     PIN_PUPDR_FLOATING(GPIOC_SD_D2) |     \
                                     PIN_PUPDR_FLOATING(GPIOC_SD_D3) |        \
                                     PIN_PUPDR_FLOATING(GPIOC_SD_CLK) |        \
                                     PIN_PUPDR_PULLUP(GPIOC_PIN13) |        \
                                     PIN_PUPDR_FLOATING(GPIOC_OSC32_IN) |   \
                                     PIN_PUPDR_FLOATING(GPIOC_OSC32_OUT))
#define VAL_GPIOC_ODR               (PIN_ODR_HIGH(GPIOC_FMC_SDNWE) |        \
                                     PIN_ODR_HIGH(GPIOC_SPI5_MEMS_CS) |     \
                                     PIN_ODR_HIGH(GPIOC_SPI5_LCD_CS) |      \
                                     PIN_ODR_HIGH(GPIOC_PIN3) |             \
                                     PIN_ODR_HIGH(GPIOC_OTG_HS_PSO) |       \
                                     PIN_ODR_HIGH(GPIOC_OTG_HS_OC) |        \
                                     PIN_ODR_HIGH(GPIOC_LCD_HSYNC) |        \
                                     PIN_ODR_HIGH(GPIOC_LCD_G6) |           \
                                     PIN_ODR_HIGH(GPIOC_SD_D0) |             \
                                     PIN_ODR_HIGH(GPIOC_SD_D1) |         \
                                     PIN_ODR_HIGH(GPIOC_SD_D2) |           \
                                     PIN_ODR_HIGH(GPIOC_SD_D3) |            \
                                     PIN_ODR_HIGH(GPIOC_SD_CLK) |            \
                                     PIN_ODR_HIGH(GPIOC_PIN13) |            \
                                     PIN_ODR_HIGH(GPIOC_OSC32_IN) |         \
                                     PIN_ODR_HIGH(GPIOC_OSC32_OUT))
#define VAL_GPIOC_AFRL              (PIN_AFIO_AF(GPIOC_FMC_SDNWE, 12) |     \
                                     PIN_AFIO_AF(GPIOC_SPI5_MEMS_CS, 0) |   \
                                     PIN_AFIO_AF(GPIOC_SPI5_LCD_CS, 0) |    \
                                     PIN_AFIO_AF(GPIOC_PIN3, 0) |           \
                                     PIN_AFIO_AF(GPIOC_OTG_HS_PSO, 0) |     \
                                     PIN_AFIO_AF(GPIOC_OTG_HS_OC, 0) |      \
                                     PIN_AFIO_AF(GPIOC_LCD_HSYNC, 14) |     \
                                     PIN_AFIO_AF(GPIOC_LCD_G6, 14))
#define VAL_GPIOC_AFRH              (PIN_AFIO_AF(GPIOC_SD_D0, 12) |           \
                                     PIN_AFIO_AF(GPIOC_SD_D1, 12) |       \
                                     PIN_AFIO_AF(GPIOC_SD_D2, 12) |        \
                                     PIN_AFIO_AF(GPIOC_SD_D3, 12) |          \
                                     PIN_AFIO_AF(GPIOC_SD_CLK, 12) |          \
                                     PIN_AFIO_AF(GPIOC_PIN13, 0) |          \
                                     PIN_AFIO_AF(GPIOC_OSC32_IN, 0) |       \
                                     PIN_AFIO_AF(GPIOC_OSC32_OUT, 0))


Code: Select all

#define GPIOD_FMC_D2                0
#define GPIOD_FMC_D3                1
#define GPIOD_SD_CMD                2
#define GPIOD_LCD_G7                3
#define GPIOD_PIN4                  4
#define GPIOD_PIN5                  5
#define GPIOD_LCD_B2                6
#define GPIOD_PIN7                  7
#define GPIOD_FMC_D13               8
#define GPIOD_FMC_D14               9
#define GPIOD_FMC_D15               10
#define GPIOD_LCD_TE                11
#define GPIOD_LCD_RDX               12
#define GPIOD_LCD_WRX               13
#define GPIOD_FMC_D0                14
#define GPIOD_FMC_D1                15

/*
 * GPIOD setup:
 *
 * PD0  - FMC_D2                    (alternate 12).
 * PD1  - FMC_D3                    (alternate 12).
 * PD2  - SD_CMD                    (alternate 12).
 * PD3  - LCD_G7                    (alternate 14).
 * PD4  - PIN4                      (input pullup).
 * PD5  - PIN5                      (input pullup).
 * PD6  - LCD_B2                    (alternate 14).
 * PD7  - PIN7                      (input pullup).
 * PD8  - FMC_D13                   (alternate 12).
 * PD9  - FMC_D14                   (alternate 12).
 * PD10 - FMC_D15                   (alternate 12).
 * PD11 - LCD_TE                    (input floating).
 * PD12 - LCD_RDX                   (output pushpull maximum).
 * PD13 - LCD_WRX                   (output pushpull maximum).
 * PD14 - FMC_D0                    (alternate 12).
 * PD15 - FMC_D1                    (alternate 12).
 */
#define VAL_GPIOD_MODER             (PIN_MODE_ALTERNATE(GPIOD_FMC_D2) |     \
                                     PIN_MODE_ALTERNATE(GPIOD_FMC_D3) |     \
                                     PIN_MODE_ALTERNATE(GPIOD_SD_CMD) |           \
                                     PIN_MODE_ALTERNATE(GPIOD_LCD_G7) |     \
                                     PIN_MODE_INPUT(GPIOD_PIN4) |           \
                                     PIN_MODE_INPUT(GPIOD_PIN5) |           \
                                     PIN_MODE_ALTERNATE(GPIOD_LCD_B2) |     \
                                     PIN_MODE_INPUT(GPIOD_PIN7) |           \
                                     PIN_MODE_ALTERNATE(GPIOD_FMC_D13) |    \
                                     PIN_MODE_ALTERNATE(GPIOD_FMC_D14) |    \
                                     PIN_MODE_ALTERNATE(GPIOD_FMC_D15) |    \
                                     PIN_MODE_INPUT(GPIOD_LCD_TE) |         \
                                     PIN_MODE_OUTPUT(GPIOD_LCD_RDX) |       \
                                     PIN_MODE_OUTPUT(GPIOD_LCD_WRX) |       \
                                     PIN_MODE_ALTERNATE(GPIOD_FMC_D0) |     \
                                     PIN_MODE_ALTERNATE(GPIOD_FMC_D1))
#define VAL_GPIOD_OTYPER            (PIN_OTYPE_PUSHPULL(GPIOD_FMC_D2) |     \
                                     PIN_OTYPE_PUSHPULL(GPIOD_FMC_D3) |     \
                                     PIN_OTYPE_PUSHPULL(GPIOD_SD_CMD) |       \
                                     PIN_OTYPE_PUSHPULL(GPIOD_LCD_G7) |     \
                                     PIN_OTYPE_PUSHPULL(GPIOD_PIN4) |       \
                                     PIN_OTYPE_PUSHPULL(GPIOD_PIN5) |       \
                                     PIN_OTYPE_PUSHPULL(GPIOD_LCD_B2) |     \
                                     PIN_OTYPE_PUSHPULL(GPIOD_PIN7) |       \
                                     PIN_OTYPE_PUSHPULL(GPIOD_FMC_D13) |    \
                                     PIN_OTYPE_PUSHPULL(GPIOD_FMC_D14) |    \
                                     PIN_OTYPE_PUSHPULL(GPIOD_FMC_D15) |    \
                                     PIN_OTYPE_PUSHPULL(GPIOD_LCD_TE) |     \
                                     PIN_OTYPE_PUSHPULL(GPIOD_LCD_RDX) |    \
                                     PIN_OTYPE_PUSHPULL(GPIOD_LCD_WRX) |    \
                                     PIN_OTYPE_PUSHPULL(GPIOD_FMC_D0) |     \
                                     PIN_OTYPE_PUSHPULL(GPIOD_FMC_D1))
#define VAL_GPIOD_OSPEEDR           (PIN_OSPEED_100M(GPIOD_FMC_D2) |        \
                                     PIN_OSPEED_100M(GPIOD_FMC_D3) |        \
                                     PIN_OSPEED_100M(GPIOD_SD_CMD) |            \
                                     PIN_OSPEED_100M(GPIOD_LCD_G7) |        \
                                     PIN_OSPEED_2M(GPIOD_PIN4) |            \
                                     PIN_OSPEED_2M(GPIOD_PIN5) |            \
                                     PIN_OSPEED_100M(GPIOD_LCD_B2) |        \
                                     PIN_OSPEED_2M(GPIOD_PIN7) |            \
                                     PIN_OSPEED_100M(GPIOD_FMC_D13) |       \
                                     PIN_OSPEED_100M(GPIOD_FMC_D14) |       \
                                     PIN_OSPEED_100M(GPIOD_FMC_D15) |       \
                                     PIN_OSPEED_100M(GPIOD_LCD_TE) |        \
                                     PIN_OSPEED_100M(GPIOD_LCD_RDX) |       \
                                     PIN_OSPEED_100M(GPIOD_LCD_WRX) |       \
                                     PIN_OSPEED_100M(GPIOD_FMC_D0) |        \
                                     PIN_OSPEED_100M(GPIOD_FMC_D1))
#define VAL_GPIOD_PUPDR             (PIN_PUPDR_FLOATING(GPIOD_FMC_D2) |     \
                                     PIN_PUPDR_FLOATING(GPIOD_FMC_D3) |     \
                                     PIN_PUPDR_FLOATING(GPIOD_SD_CMD) |         \
                                     PIN_PUPDR_FLOATING(GPIOD_LCD_G7) |     \
                                     PIN_PUPDR_PULLUP(GPIOD_PIN4) |         \
                                     PIN_PUPDR_PULLUP(GPIOD_PIN5) |         \
                                     PIN_PUPDR_FLOATING(GPIOD_LCD_B2) |     \
                                     PIN_PUPDR_PULLUP(GPIOD_PIN7) |         \
                                     PIN_PUPDR_FLOATING(GPIOD_FMC_D13) |    \
                                     PIN_PUPDR_FLOATING(GPIOD_FMC_D14) |    \
                                     PIN_PUPDR_FLOATING(GPIOD_FMC_D15) |    \
                                     PIN_PUPDR_FLOATING(GPIOD_LCD_TE) |     \
                                     PIN_PUPDR_FLOATING(GPIOD_LCD_RDX) |    \
                                     PIN_PUPDR_FLOATING(GPIOD_LCD_WRX) |    \
                                     PIN_PUPDR_FLOATING(GPIOD_FMC_D0) |     \
                                     PIN_PUPDR_FLOATING(GPIOD_FMC_D1))
#define VAL_GPIOD_ODR               (PIN_ODR_HIGH(GPIOD_FMC_D2) |           \
                                     PIN_ODR_HIGH(GPIOD_FMC_D3) |           \
                                     PIN_ODR_HIGH(GPIOD_SD_CMD) |             \
                                     PIN_ODR_HIGH(GPIOD_LCD_G7) |           \
                                     PIN_ODR_HIGH(GPIOD_PIN4) |             \
                                     PIN_ODR_HIGH(GPIOD_PIN5) |             \
                                     PIN_ODR_HIGH(GPIOD_LCD_B2) |           \
                                     PIN_ODR_HIGH(GPIOD_PIN7) |             \
                                     PIN_ODR_HIGH(GPIOD_FMC_D13) |          \
                                     PIN_ODR_HIGH(GPIOD_FMC_D14) |          \
                                     PIN_ODR_HIGH(GPIOD_FMC_D15) |          \
                                     PIN_ODR_HIGH(GPIOD_LCD_TE) |           \
                                     PIN_ODR_HIGH(GPIOD_LCD_RDX) |          \
                                     PIN_ODR_HIGH(GPIOD_LCD_WRX) |          \
                                     PIN_ODR_HIGH(GPIOD_FMC_D0) |           \
                                     PIN_ODR_HIGH(GPIOD_FMC_D1))
#define VAL_GPIOD_AFRL              (PIN_AFIO_AF(GPIOD_FMC_D2, 12) |        \
                                     PIN_AFIO_AF(GPIOD_FMC_D3, 12) |        \
                                     PIN_AFIO_AF(GPIOD_SD_CMD, 12) |           \
                                     PIN_AFIO_AF(GPIOD_LCD_G7, 14) |        \
                                     PIN_AFIO_AF(GPIOD_PIN4, 0) |           \
                                     PIN_AFIO_AF(GPIOD_PIN5, 0) |           \
                                     PIN_AFIO_AF(GPIOD_LCD_B2, 14) |        \
                                     PIN_AFIO_AF(GPIOD_PIN7, 0))
#define VAL_GPIOD_AFRH              (PIN_AFIO_AF(GPIOD_SD_CMD, 12) |          \
                                     PIN_AFIO_AF(GPIOD_FMC_D13, 12) |       \
                                     PIN_AFIO_AF(GPIOD_FMC_D14, 12) |       \
                                     PIN_AFIO_AF(GPIOD_FMC_D15, 12) |       \
                                     PIN_AFIO_AF(GPIOD_LCD_TE, 0) |         \
                                     PIN_AFIO_AF(GPIOD_LCD_RDX, 0) |        \
                                     PIN_AFIO_AF(GPIOD_LCD_WRX, 0) |        \
                                     PIN_AFIO_AF(GPIOD_FMC_D0, 12) |        \
                                     PIN_AFIO_AF(GPIOD_FMC_D1, 12))
Post Reply