木子临枫 2021-10-20 15:47 采纳率: 28.6%
浏览 335
已结题

stm32H743 sd使用dma问题 HAL_SD_ReadBlocks_DMA()读到数据全是0

请教一个下个 我使用stm32h743 sd使用dma 使用cubemx 生成的代码 通过HAL_SD_WriteBlocks_DMA()和 HAL_SD_ReadBlocks_DMA()函数读写 sd卡 ,读到的数据是0.

__align(4) uint8_t  write_buf[512];
__align(4) uint8_t  read_buf[512];
void sd_test(void)
{
        u32 i = 0, status;
        HAL_SD_CardStateTypeDef State;
  HAL_SD_CardCIDTypeDef SD_CardCID;
        State = HAL_SD_GetCardState(&hsd1);
        if(State == HAL_SD_CARD_TRANSFER)
        {
                HAL_SD_GetCardCID(&hsd1,&SD_CardCID);
                printf("\r\n Initialize SD card successfully!\r\n\r\n");
                printf(" SD card information! \r\n");
                printf(" CardCapacity  : %llu \r\n",((unsigned long long)hsd1.SdCard.BlockSize*hsd1.SdCard.BlockNbr));
                printf(" CardBlockSize : %d \r\n",hsd1.SdCard.BlockSize);
                printf(" RCA           : %d \r\n",hsd1.SdCard.RelCardAdd);
                printf(" CardType      : %d \r\n",hsd1.SdCard.CardType);
                printf(" ManufacturerID: %d \r\n",SD_CardCID.ManufacturerID);
        }
        else
        {
                printf("SD卡初始化失败\n" );
                while(1); // 停机
        }
       
        for(i = 0; i < 512; i++)
        {
                write_buf[i] = i % 256;
        }
        printf("------------------- Write SD card block data Test ------------------\r\n");
//status = HAL_SD_WriteBlocks(&hsd1,(uint8_t *)write_buf,0,1,0xffff);
status = HAL_SD_WriteBlocks_DMA(&hsd1,(uint8_t *)write_buf,0,512);
//status = BSP_SD_WriteBlocks_DMA((uint32_t *)write_buf,0,100);
if(status == 0)
{
    printf("Write block data ok \r\n" );
}
else
{
    printf("Write block data fail!\r\n " );
}
delay_ms(2000);
       
printf("------------------- Read SD card block data after Write ------------------\r\n");
status = HAL_SD_ReadBlocks_DMA(&hsd1,(uint8_t *)read_buf,0,512);
//status = BSP_SD_ReadBlocks_DMA((uint32_t *)read_buf, 2 ,100);
if(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 %d\r\n", status);
}


  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 10月28日
    • 创建了问题 10月20日

    悬赏问题

    • ¥15 求差集那个函数有问题,有无佬可以解决
    • ¥15 MATLAB动图问题
    • ¥15 【提问】基于Invest的水源涵养
    • ¥20 微信网友居然可以通过vx号找到我绑的手机号
    • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
    • ¥15 解riccati方程组
    • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
    • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
    • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
    • ¥50 树莓派安卓APK系统签名