【分享】用STM32CubeMX快速生成一个SD卡读写程序

2019-07-20 18:21发布

本帖最后由 adlu 于 2016-6-4 16:41 编辑

本帖介绍一个用 STM32CubeMX 快速生成一个 SD 卡读写程序的方法。

程序员只需要简单的配置步骤,就可以创建一个MDK工程。

输入少量代码,无需了解SD卡底层操作和繁杂的初始化过程,即可实现对SD卡扇区读/写访问。

真正的做到了解放程序员的目的,让程序员可以把精力放在更重要的事情上。

由于主要是配置操作,图片较多,因此只上传两张图片,有兴趣的朋友可以下载文档查看。
1.jpg
2.jpg
用STM32CubeMX快速生成一个SD卡读写程序.pdf (1.35 MB, 下载次数: 2008) 2016-6-4 16:37 上传 点击文件名下载附件


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
36条回答
释怀过客
1楼-- · 2019-07-24 22:46
adlu 发表于 2016-9-12 09:06
请先查看SD卡,确认SD卡是否进行了写保护。
或者先在电脑上进行操作,写文件进去,或者格式化SD卡。

res = 0X0D,  FR_NO_FILESYSTEM,                /* (13) There is no valid FAT volume */  这个错误,该怎么解决呢?
adlu
2楼-- · 2019-07-25 01:26
 精彩回答 2  元偷偷看……
释怀过客
3楼-- · 2019-07-25 04:33
adlu 发表于 2016-9-12 16:47
贴你的main函数出来看看

int main(void)
{

  /* USER CODE BEGIN 1 */
        FRESULT res;                                          /* FatFs function common result code */
  uint32_t byteswritten, bytesread;                     /* File write/read counts */
  uint8_t wtext[] = "This is STM32 working with FatFs"; /* File write buffer */
  uint8_t rtext[100];                                   /* File read buffer */
  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_SDIO_SD_Init();
  MX_FATFS_Init();

  /* USER CODE BEGIN 2 */
//        BSP_SD_Init();
        BSP_SD_GetCardInfo(&SDCardInfo);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
                if(f_mount(&SDFatFs, (TCHAR const*)SD_Path, 0) != FR_OK)
                {
                        /* FatFs Initialization Error */
                        while(1);
                }
                else
                {
                                /* Create and Open a new text file object with write access */
//                                if(f_open(&MyFile, "STM32.TXT", FA_CREATE_ALWAYS | FA_WRITE) != FR_OK)
//                                {
//                                        /* 'STM32.TXT' file Open for write Error */
//                                        while(1);
//                                }
                        ret_Error = f_open(&MyFile, "STM32.TXT", FA_CREATE_ALWAYS | FA_WRITE);
                        if(ret_Error != FR_OK)
                        {
                                if(ret_Error == FR_NO_FILESYSTEM)
                                {
                                        HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,GPIO_PIN_SET);
                                }
                                while(1);
                        }
                                else
                                {
                                        /* Write data to the text file */
                                        res = f_write(&MyFile, wtext, sizeof(wtext), (void *)&byteswritten);
                                       
                                        if((byteswritten == 0) || (res != FR_OK))
                                        {
                                                /* 'STM32.TXT' file Write or EOF Error */
                                                while(1);
                                        }
                                        else
                                        {
                                                /* Close the open text file */
                                                f_close(&MyFile);
                                               
                                        /* Open the text file object with read access */
                                        if(f_open(&MyFile, "STM32.TXT", FA_READ) != FR_OK)
                                        {
                                                /* 'STM32.TXT' file Open for read Error */
                                                while(1);
                                        }
                                        else
                                        {
                                                /* Read data from the text file */
                                                res = f_read(&MyFile, rtext, sizeof(rtext), (void *)&bytesread);
                                               
                                                if((bytesread == 0) || (res != FR_OK))
                                                {
                                                        /* 'STM32.TXT' file Read or EOF Error */
                                                        while(1);
                                                }
                                                else
                                                {
                                                        /* Close the open text file */
                                                        f_close(&MyFile);
                                                       
                                                        /* Compare read data with the expected data */
                                                        if((bytesread != byteswritten))
                                                        {               
                                                                /* Read data is different from the expected data */
                                                                while(1);
                                                        }
                                                        else
                                                        {
                                                /* Success of the demo: no error occurrence */
                                                                while(1);
                                                        }
                                                }
                                        }
                                }
                        }
                }
  }
  /* USER CODE END 3 */

}
释怀过客
4楼-- · 2019-07-25 07:01
adlu 发表于 2016-9-12 16:47
贴你的main函数出来看看

在线调试,程序卡在
if(ret_Error != FR_OK)
                        {
                                if(ret_Error == FR_NO_FILESYSTEM)
                                {
                                        HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,GPIO_PIN_SET);
                                }
                                while(1);
                        }
这个里面,错误类型res = 0X0D,  FR_NO_FILESYSTEM,                /* (13) There is no valid FAT volume */
adlu
5楼-- · 2019-07-25 12:57
 精彩回答 2  元偷偷看……
adlu
6楼-- · 2019-07-25 18:11
本帖最后由 adlu 于 2016-12-6 11:54 编辑
盼盼 发表于 2016-12-6 11:18
想咨询一下128G的卡使用FAT是否可以正常操作文件创建以及读写?我用的探索者F407,用的FAT的例程,4G的卡 ...

参考此帖“用STM32CubeMX快速生成一个SDIO+FATFS程序”
http://www.openedv.com/forum.php ... =1&extra=#pid475355

自己测试一下就知道结果了

一周热门 更多>