F746NG fatfs and micro sd example

Dependencies:   BSP_DISCO_F746NG FatFS mbed

This is a quick and dirty example about how to use micro sd card module with FatFs on STM32746G Discovery board. I simply use the FatFs library downloaded with DFP for STM32F7. The project shows how to read PPM image file from sd card, display on LCD and writing image to sd card.

Committer:
buyukesmeli
Date:
Sat Feb 03 14:43:35 2018 +0000
Revision:
1:28e2f24b11b3
Parent:
0:020195991898
Child:
2:19c2835ce409
Second Commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
buyukesmeli 0:020195991898 1 #include "mbed.h"
buyukesmeli 0:020195991898 2 #define USE_STM32746G_DISCOVERY
buyukesmeli 0:020195991898 3 #include "stm32f7xx_hal.h"
buyukesmeli 0:020195991898 4 #include "stm32746g_discovery.h"
buyukesmeli 0:020195991898 5 #include "stm32746g_discovery_sd.h"
buyukesmeli 0:020195991898 6 #include "string.h"
buyukesmeli 0:020195991898 7 #include "stm32746g_discovery_lcd.h"
buyukesmeli 0:020195991898 8 #include "ff_gen_drv.h"
buyukesmeli 0:020195991898 9 #include "sd_diskio.h"
buyukesmeli 0:020195991898 10
buyukesmeli 0:020195991898 11 #define FRAME_BUFFER 0xC0000000
buyukesmeli 0:020195991898 12 #define SD_IN_BUFFER 0xC0140000
buyukesmeli 0:020195991898 13 #define SD_OUT_BUFFER 0xC0280000
buyukesmeli 0:020195991898 14
buyukesmeli 0:020195991898 15 FATFS SDFatFs;
buyukesmeli 0:020195991898 16 FIL MyFile;
buyukesmeli 0:020195991898 17
buyukesmeli 0:020195991898 18
buyukesmeli 0:020195991898 19
buyukesmeli 0:020195991898 20
buyukesmeli 0:020195991898 21 static void LCD_LL_ConvertFrameToARGB8888(void *pSrc, void *pDst);
buyukesmeli 0:020195991898 22 static void LCD_LL_ConvertFrameToRGB888(void *pSrc, void *pDst);
buyukesmeli 0:020195991898 23 extern SD_HandleTypeDef uSdHandle;
buyukesmeli 0:020195991898 24 DMA2D_HandleTypeDef hdma2d_disco;
buyukesmeli 0:020195991898 25
buyukesmeli 0:020195991898 26 Serial pc(USBTX, USBRX);
buyukesmeli 0:020195991898 27 uint32_t i = 0, image_width = 0, image_height = 0;
buyukesmeli 0:020195991898 28 const char image_header[] = "P6\n# Generated by STM32\n272 480\n255\n";
buyukesmeli 0:020195991898 29
buyukesmeli 0:020195991898 30 char SDPath[4];
buyukesmeli 0:020195991898 31 char text [40];
buyukesmeli 0:020195991898 32 char c;
buyukesmeli 0:020195991898 33
buyukesmeli 0:020195991898 34 int main(void)
buyukesmeli 0:020195991898 35 {
buyukesmeli 0:020195991898 36 FRESULT res;
buyukesmeli 0:020195991898 37 uint32_t bytesread;
buyukesmeli 0:020195991898 38 uint32_t line_cnt=0;
buyukesmeli 0:020195991898 39 pc.baud(115200);
buyukesmeli 0:020195991898 40
buyukesmeli 0:020195991898 41 BSP_LCD_Init();
buyukesmeli 0:020195991898 42 BSP_LCD_DisplayOff();
buyukesmeli 0:020195991898 43 BSP_LCD_LayerDefaultInit(0, FRAME_BUFFER);
buyukesmeli 0:020195991898 44 BSP_LCD_SelectLayer(0);
buyukesmeli 0:020195991898 45 BSP_LCD_DisplayOn();
buyukesmeli 0:020195991898 46
buyukesmeli 0:020195991898 47 FATFS_LinkDriver(&SD_Driver, SDPath);
buyukesmeli 0:020195991898 48
buyukesmeli 0:020195991898 49 res = f_mount(&SDFatFs, (TCHAR const*)SDPath, 0);
buyukesmeli 0:020195991898 50 if(res!= FR_OK)
buyukesmeli 0:020195991898 51 pc.printf("Failed to mount SD\n");
buyukesmeli 0:020195991898 52
buyukesmeli 0:020195991898 53 res = f_open(&MyFile, "image.ppm", FA_READ);
buyukesmeli 0:020195991898 54 if(res!= FR_OK)
buyukesmeli 0:020195991898 55 pc.printf("Failed to open file\n");
buyukesmeli 0:020195991898 56
buyukesmeli 0:020195991898 57 while(1) {
buyukesmeli 0:020195991898 58
buyukesmeli 0:020195991898 59 res = f_read(&MyFile, &c, 1, (UINT*)&bytesread);
buyukesmeli 0:020195991898 60 if (c!='#')
buyukesmeli 0:020195991898 61 line_cnt++;
buyukesmeli 0:020195991898 62 if(line_cnt==2) {
buyukesmeli 0:020195991898 63 text[0] = c;
buyukesmeli 0:020195991898 64 res = f_read(&MyFile, &c, 1, (UINT*)&bytesread);
buyukesmeli 0:020195991898 65 i = 1;
buyukesmeli 0:020195991898 66 while(c!=' ') {
buyukesmeli 0:020195991898 67 text[i]=c;
buyukesmeli 0:020195991898 68 res = f_read(&MyFile, &c, 1, (UINT*)&bytesread);
buyukesmeli 0:020195991898 69 i++;
buyukesmeli 0:020195991898 70 }
buyukesmeli 0:020195991898 71 text[i]=0;
buyukesmeli 0:020195991898 72 image_width = atoi(text);
buyukesmeli 0:020195991898 73 res = f_read(&MyFile, &c, 1, (UINT*)&bytesread);
buyukesmeli 0:020195991898 74 i = 0;
buyukesmeli 0:020195991898 75 while(c!='\n') {
buyukesmeli 0:020195991898 76 text[i]=c;
buyukesmeli 0:020195991898 77 res = f_read(&MyFile, &c, 1, (UINT*)&bytesread);
buyukesmeli 0:020195991898 78 i++;
buyukesmeli 0:020195991898 79 }
buyukesmeli 0:020195991898 80 text[i]=0;
buyukesmeli 0:020195991898 81 image_height = atoi(text);
buyukesmeli 0:020195991898 82 } else {
buyukesmeli 0:020195991898 83 while(c!='\n')
buyukesmeli 0:020195991898 84 res = f_read(&MyFile, &c, 1, (UINT*)&bytesread);
buyukesmeli 0:020195991898 85 }
buyukesmeli 0:020195991898 86 if(line_cnt == 3)
buyukesmeli 0:020195991898 87 break;
buyukesmeli 0:020195991898 88
buyukesmeli 0:020195991898 89 }
buyukesmeli 0:020195991898 90
buyukesmeli 0:020195991898 91 if(image_width != 480 || image_height != 272)
buyukesmeli 0:020195991898 92 pc.printf("Image size should be 272x480");
buyukesmeli 0:020195991898 93
buyukesmeli 0:020195991898 94 for(i = 0; i < image_width*image_width*3; i = i + 512) {
buyukesmeli 0:020195991898 95 res = f_read(&MyFile, (void *)(SD_IN_BUFFER+i) , 512, (UINT*)&bytesread);
buyukesmeli 0:020195991898 96 }
buyukesmeli 0:020195991898 97 f_close(&MyFile);
buyukesmeli 0:020195991898 98
buyukesmeli 0:020195991898 99 LCD_LL_ConvertFrameToARGB8888((uint32_t *)(SD_IN_BUFFER), (uint32_t *)(FRAME_BUFFER));
buyukesmeli 0:020195991898 100
buyukesmeli 0:020195991898 101
buyukesmeli 0:020195991898 102 LCD_LL_ConvertFrameToRGB888((uint32_t *)(FRAME_BUFFER), (uint32_t *)(SD_OUT_BUFFER));
buyukesmeli 0:020195991898 103
buyukesmeli 0:020195991898 104 res = f_open(&MyFile, "image_ou.ppm", FA_CREATE_ALWAYS | FA_WRITE);
buyukesmeli 0:020195991898 105 if(res!= FR_OK)
buyukesmeli 0:020195991898 106 pc.printf("Failed to open file\n");
buyukesmeli 0:020195991898 107
buyukesmeli 0:020195991898 108
buyukesmeli 0:020195991898 109 res = f_write(&MyFile, image_header, 15, &bytesread);
buyukesmeli 0:020195991898 110 if(res!= FR_OK)
buyukesmeli 0:020195991898 111 pc.printf("Failed to write file 1\n");
buyukesmeli 0:020195991898 112
buyukesmeli 0:020195991898 113 for(i = 0; i < 480*272*3; i = i + 512) {
buyukesmeli 0:020195991898 114 res = f_write(&MyFile, (uint8_t *)(SD_OUT_BUFFER+i), 512, &bytesread);
buyukesmeli 0:020195991898 115 if(res!= FR_OK)
buyukesmeli 0:020195991898 116 pc.printf("Failed to write file\n");
buyukesmeli 0:020195991898 117 }
buyukesmeli 1:28e2f24b11b3 118
buyukesmeli 1:28e2f24b11b3 119 pc.printf("Done!\n");
buyukesmeli 0:020195991898 120 f_close(&MyFile);
buyukesmeli 0:020195991898 121 FATFS_UnLinkDriver(SDPath);
buyukesmeli 0:020195991898 122
buyukesmeli 0:020195991898 123 while (1) {
buyukesmeli 0:020195991898 124 }
buyukesmeli 0:020195991898 125 }
buyukesmeli 0:020195991898 126 extern "C" {
buyukesmeli 0:020195991898 127 void BSP_SDMMC_IRQHandler(void)
buyukesmeli 0:020195991898 128 {
buyukesmeli 0:020195991898 129 HAL_SD_IRQHandler(&uSdHandle);
buyukesmeli 0:020195991898 130 }
buyukesmeli 0:020195991898 131 void BSP_SDMMC_DMA_Tx_IRQHandler(void)
buyukesmeli 0:020195991898 132 {
buyukesmeli 0:020195991898 133 HAL_DMA_IRQHandler(uSdHandle.hdmatx);
buyukesmeli 0:020195991898 134 }
buyukesmeli 0:020195991898 135 void BSP_SDMMC_DMA_Rx_IRQHandler(void)
buyukesmeli 0:020195991898 136 {
buyukesmeli 0:020195991898 137 HAL_DMA_IRQHandler(uSdHandle.hdmarx);
buyukesmeli 0:020195991898 138 }
buyukesmeli 0:020195991898 139 static void LCD_LL_ConvertFrameToARGB8888(void *pSrc, void *pDst)
buyukesmeli 0:020195991898 140 {
buyukesmeli 0:020195991898 141 /* Enable DMA2D clock */
buyukesmeli 0:020195991898 142 __HAL_RCC_DMA2D_CLK_ENABLE();
buyukesmeli 0:020195991898 143
buyukesmeli 0:020195991898 144 /* Configure the DMA2D Mode, Color Mode and output offset */
buyukesmeli 0:020195991898 145 hdma2d_disco.Init.Mode = DMA2D_M2M_PFC;
buyukesmeli 0:020195991898 146 hdma2d_disco.Init.ColorMode = DMA2D_ARGB8888;
buyukesmeli 0:020195991898 147 hdma2d_disco.Init.OutputOffset = 0;
buyukesmeli 0:020195991898 148
buyukesmeli 0:020195991898 149 /* Foreground Configuration */
buyukesmeli 0:020195991898 150 hdma2d_disco.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
buyukesmeli 0:020195991898 151 hdma2d_disco.LayerCfg[1].InputAlpha = 0xFF;
buyukesmeli 0:020195991898 152 hdma2d_disco.LayerCfg[1].InputColorMode = CM_RGB888;
buyukesmeli 0:020195991898 153 hdma2d_disco.LayerCfg[1].InputOffset = 0;
buyukesmeli 0:020195991898 154
buyukesmeli 0:020195991898 155 hdma2d_disco.Instance = DMA2D;
buyukesmeli 0:020195991898 156
buyukesmeli 0:020195991898 157 /* DMA2D Initialization */
buyukesmeli 0:020195991898 158 if(HAL_DMA2D_Init(&hdma2d_disco) == HAL_OK) {
buyukesmeli 0:020195991898 159 if(HAL_DMA2D_ConfigLayer(&hdma2d_disco, 1) == HAL_OK) {
buyukesmeli 0:020195991898 160 if (HAL_DMA2D_Start(&hdma2d_disco, (uint32_t)pSrc, (uint32_t)pDst, 480, 272) == HAL_OK) {
buyukesmeli 0:020195991898 161 /* Polling For DMA transfer */
buyukesmeli 0:020195991898 162 HAL_DMA2D_PollForTransfer(&hdma2d_disco, 10);
buyukesmeli 0:020195991898 163 }
buyukesmeli 0:020195991898 164 }
buyukesmeli 0:020195991898 165 } else {
buyukesmeli 0:020195991898 166
buyukesmeli 0:020195991898 167 }
buyukesmeli 0:020195991898 168 }
buyukesmeli 0:020195991898 169 static void LCD_LL_ConvertFrameToRGB888(void *pSrc, void *pDst)
buyukesmeli 0:020195991898 170 {
buyukesmeli 0:020195991898 171 /* Enable DMA2D clock */
buyukesmeli 0:020195991898 172 __HAL_RCC_DMA2D_CLK_ENABLE();
buyukesmeli 0:020195991898 173
buyukesmeli 0:020195991898 174 /* Configure the DMA2D Mode, Color Mode and output offset */
buyukesmeli 0:020195991898 175 hdma2d_disco.Init.Mode = DMA2D_M2M_PFC;
buyukesmeli 0:020195991898 176 hdma2d_disco.Init.ColorMode = DMA2D_RGB888;
buyukesmeli 0:020195991898 177 hdma2d_disco.Init.OutputOffset = 0;
buyukesmeli 0:020195991898 178
buyukesmeli 0:020195991898 179 /* Foreground Configuration */
buyukesmeli 0:020195991898 180 hdma2d_disco.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
buyukesmeli 0:020195991898 181 hdma2d_disco.LayerCfg[1].InputAlpha = 0xFF;
buyukesmeli 0:020195991898 182 hdma2d_disco.LayerCfg[1].InputColorMode = CM_ARGB8888;
buyukesmeli 0:020195991898 183 hdma2d_disco.LayerCfg[1].InputOffset = 0;
buyukesmeli 0:020195991898 184
buyukesmeli 0:020195991898 185 hdma2d_disco.Instance = DMA2D;
buyukesmeli 0:020195991898 186
buyukesmeli 0:020195991898 187 /* DMA2D Initialization */
buyukesmeli 0:020195991898 188 if(HAL_DMA2D_Init(&hdma2d_disco) == HAL_OK) {
buyukesmeli 0:020195991898 189 if(HAL_DMA2D_ConfigLayer(&hdma2d_disco, 1) == HAL_OK) {
buyukesmeli 0:020195991898 190 if (HAL_DMA2D_Start(&hdma2d_disco, (uint32_t)pSrc, (uint32_t)pDst, 480, 272) == HAL_OK) {
buyukesmeli 0:020195991898 191 /* Polling For DMA transfer */
buyukesmeli 0:020195991898 192 HAL_DMA2D_PollForTransfer(&hdma2d_disco, 10);
buyukesmeli 0:020195991898 193 }
buyukesmeli 0:020195991898 194 }
buyukesmeli 0:020195991898 195 } else {
buyukesmeli 0:020195991898 196
buyukesmeli 0:020195991898 197 }
buyukesmeli 0:020195991898 198 }
buyukesmeli 0:020195991898 199
buyukesmeli 0:020195991898 200 }