[开发工具] STM32CubeMX-19 | 使用SDMMC接口读写SD卡数据

[复制链接]
1965|36
 楼主| phosphate 发表于 2020-4-13 14:56 | 显示全部楼层
编译下载后串口助手输出结果如下:

886335e940d220f5b7.png
 楼主| phosphate 发表于 2020-4-13 14:57 | 显示全部楼层
擦除SD卡块数据
为了验证实验的正确性或,先擦除数据:

  1. /* 擦除SD卡块 */
  2. printf("------------------- Block Erase -------------------------------\r\n");
  3. sdcard_status = HAL_SD_Erase(&hsd1, 0, 512);
  4. if (sdcard_status == 0)
  5. {
  6.     printf("Erase block ok\r\n");
  7. }
  8. else
  9. {
  10.     printf("Erase block fail\r\n");
  11. }
 楼主| phosphate 发表于 2020-4-13 14:58 | 显示全部楼层
读取SD卡块数据
首先开辟一个全局缓冲区,用于存放从SD卡读出的数据:

  1. /* Private user code ---------------------------------------------------------*/
  2. /* USER CODE BEGIN 0 */
  3. uint8_t read_buf[512];
  4. /* USER CODE END 0 */
 楼主| phosphate 发表于 2020-4-13 14:58 | 显示全部楼层
然后在之前读取信息的代码之后添加读取数据的代码:

  1. /* 读取未操作之前的数据 */
  2. printf("------------------- Read SD card block data Test ------------------\r\n");
  3. sdcard_status = HAL_SD_ReadBlocks(&hsd1,(uint8_t *)read_buf,0,1,0xffff);
  4. if(sdcard_status == 0)
  5. {
  6.     printf("Read block data ok \r\n" );
  7.     for(i = 0; i < 512; i++)
  8.     {
  9.         printf("0x%02x ", read_buf[i]);
  10.         if((i+1)%16 == 0)
  11.         {
  12.             printf("\r\n");
  13.         }
  14.     }
  15. }
  16. else
  17. {
  18.     printf("Read block data fail!\r\n " );
  19. }
 楼主| phosphate 发表于 2020-4-13 14:59 | 显示全部楼层
向SD卡块写入数据
同样的,开辟一个全局缓冲区,用于存放即将要写入SD卡的数据:

     uint8_t write_buf[512];
 楼主| phosphate 发表于 2020-4-13 14:59 | 显示全部楼层
然后在之前读取数据的代码之后添加的代码,将缓冲区的数据赋初值:

  1. /* 填充缓冲区数据 */
  2. for(i = 0; i < 512; i++)
  3. {
  4.     write_buf[i] = i % 256;
  5. }
 楼主| phosphate 发表于 2020-4-13 15:00 | 显示全部楼层
然后继续添加代码,将该缓冲区数据写入SD卡:

  1. /* 向SD卡块写入数据 */
  2. printf("------------------- Write SD card block data Test ------------------\r\n");
  3. sdcard_status = HAL_SD_WriteBlocks(&hsd1,(uint8_t *)write_buf,0,1,0xffff);
  4. if(sdcard_status == 0)
  5. {
  6.     printf("Write block data ok \r\n" );
  7. }
  8. else
  9. {
  10.     printf("Write block data fail!\r\n " );
  11. }
 楼主| phosphate 发表于 2020-4-13 15:00 | 显示全部楼层
添加完之后,为了检查数据是否正常写入,再将数据读出:

  1. /* 读取操作之后的数据 */
  2. printf("------------------- Read SD card block data after Write ------------------\r\n");
  3. sdcard_status = HAL_SD_ReadBlocks(&hsd1,(uint8_t *)read_buf,0,1,0xffff);
  4. if(sdcard_status == 0)
  5. {
  6.     printf("Read block data ok \r\n" );
  7.     for(i = 0; i < 512; i++)
  8.     {
  9.         printf("0x%02x ", read_buf[i]);
  10.         if((i+1)%16 == 0)
  11.         {
  12.             printf("\r\n");
  13.         }
  14.     }
  15. }
 楼主| phosphate 发表于 2020-4-13 15:02 | 显示全部楼层
将程序编译下载,最终的实验结果如下:
695145e940e3f306bf.png

923785e940e4f1ae47.png

34505e940e5f3a7d1.png

60045e940e6b3b362.png

944845e940e73246e8.png
 楼主| phosphate 发表于 2020-4-13 15:02 | 显示全部楼层
至此,我们已经学会如何使用硬件SDMMC接口读取SD数据,STM32CubeMX系列教程完结。
晓伍 发表于 2020-5-7 14:43 | 显示全部楼层
非常感谢楼主分享
八层楼 发表于 2020-5-7 14:43 | 显示全部楼层
一楼的图片太吸引人了
观海 发表于 2020-5-7 14:44 | 显示全部楼层
哪些系列的芯片有这种接口呢
guanjiaer 发表于 2020-5-7 14:44 | 显示全部楼层
啥时候我也能写成功啊
heimaojingzhang 发表于 2020-5-7 14:45 | 显示全部楼层
代码清晰明了啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部