发新帖我要提问
12
返回列表
打印
[开发工具]

STM32CubeMX-19 | 使用SDMMC接口读写SD卡数据

[复制链接]
楼主: phosphate
手机看帖
扫描二维码
随时随地手机跟帖
21
phosphate|  楼主 | 2020-4-13 14:56 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
编译下载后串口助手输出结果如下:

使用特权

评论回复
22
phosphate|  楼主 | 2020-4-13 14:57 | 只看该作者
擦除SD卡块数据
为了验证实验的正确性或,先擦除数据:

/* 擦除SD卡块 */
printf("------------------- Block Erase -------------------------------\r\n");
sdcard_status = HAL_SD_Erase(&hsd1, 0, 512);
if (sdcard_status == 0)
{
    printf("Erase block ok\r\n");
}
else
{
    printf("Erase block fail\r\n");
}

使用特权

评论回复
23
phosphate|  楼主 | 2020-4-13 14:58 | 只看该作者
读取SD卡块数据
首先开辟一个全局缓冲区,用于存放从SD卡读出的数据:

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uint8_t read_buf[512];
/* USER CODE END 0 */

使用特权

评论回复
24
phosphate|  楼主 | 2020-4-13 14:58 | 只看该作者
然后在之前读取信息的代码之后添加读取数据的代码:

/* 读取未操作之前的数据 */
printf("------------------- Read SD card block data Test ------------------\r\n");
sdcard_status = HAL_SD_ReadBlocks(&hsd1,(uint8_t *)read_buf,0,1,0xffff);
if(sdcard_status == 0)
{
    printf("Read block data ok \r\n" );
    for(i = 0; i < 512; i++)
    {
        printf("0x%02x ", read_buf[i]);
        if((i+1)%16 == 0)
        {
            printf("\r\n");
        }
    }
}
else
{
    printf("Read block data fail!\r\n " );
}

使用特权

评论回复
25
phosphate|  楼主 | 2020-4-13 14:59 | 只看该作者
向SD卡块写入数据
同样的,开辟一个全局缓冲区,用于存放即将要写入SD卡的数据:

     uint8_t write_buf[512];

使用特权

评论回复
26
phosphate|  楼主 | 2020-4-13 14:59 | 只看该作者
然后在之前读取数据的代码之后添加的代码,将缓冲区的数据赋初值:

/* 填充缓冲区数据 */
for(i = 0; i < 512; i++)
{
    write_buf[i] = i % 256;
}

使用特权

评论回复
27
phosphate|  楼主 | 2020-4-13 15:00 | 只看该作者
然后继续添加代码,将该缓冲区数据写入SD卡:

/* 向SD卡块写入数据 */
printf("------------------- Write SD card block data Test ------------------\r\n");
sdcard_status = HAL_SD_WriteBlocks(&hsd1,(uint8_t *)write_buf,0,1,0xffff);
if(sdcard_status == 0)
{
    printf("Write block data ok \r\n" );
}
else
{
    printf("Write block data fail!\r\n " );
}

使用特权

评论回复
28
phosphate|  楼主 | 2020-4-13 15:00 | 只看该作者
添加完之后,为了检查数据是否正常写入,再将数据读出:

/* 读取操作之后的数据 */
printf("------------------- Read SD card block data after Write ------------------\r\n");
sdcard_status = HAL_SD_ReadBlocks(&hsd1,(uint8_t *)read_buf,0,1,0xffff);
if(sdcard_status == 0)
{
    printf("Read block data ok \r\n" );
    for(i = 0; i < 512; i++)
    {
        printf("0x%02x ", read_buf[i]);
        if((i+1)%16 == 0)
        {
            printf("\r\n");
        }
    }
}

使用特权

评论回复
29
phosphate|  楼主 | 2020-4-13 15:02 | 只看该作者
将程序编译下载,最终的实验结果如下:








使用特权

评论回复
30
phosphate|  楼主 | 2020-4-13 15:02 | 只看该作者
至此,我们已经学会如何使用硬件SDMMC接口读取SD数据,STM32CubeMX系列教程完结。

使用特权

评论回复
31
晓伍| | 2020-5-7 14:43 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
32
八层楼| | 2020-5-7 14:43 | 只看该作者
一楼的图片太吸引人了

使用特权

评论回复
33
观海| | 2020-5-7 14:44 | 只看该作者
哪些系列的芯片有这种接口呢

使用特权

评论回复
34
guanjiaer| | 2020-5-7 14:44 | 只看该作者
啥时候我也能写成功啊

使用特权

评论回复
35
heimaojingzhang| | 2020-5-7 14:45 | 只看该作者
代码清晰明了啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则