打印

STM32H7 SD卡程序分享(2019-6.27更新完整例程)

[复制链接]
261|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
丑帅丑帅的|  楼主 | 2018-7-6 17:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.驱动包括DMA和非DMA 操作,在H文件宏定义控制
#define  SD_DMA       1   //是否使用DMA

2.关于SD卡的速度问题H7的板子没有1.8v所以最高速度为50M的 时钟,数据速度为25M
如果,你不是高速卡只支持25M的时钟频率,所以在这uSdHandle.Init.ClockDiv    = 4;
设置为这个4 意思是ClockDiv 时钟分频
SD卡速度计算 SDMMC_CK = SDMMCCLK / (2 * ClockDiv)  ,
SDMMCCLK 的时钟是用的PLL1 的 Q1 时钟分频为4 是200M
对于高速卡想用50M的时钟  需要在HAL库自己加点东西 在SD的HAL C文件中,
HAL_SD_ConfigWideBusOperation函数,2020 if判断 添加      
else if(hsd->SdCard.CardType == CARD_SDHC_SDXC)
{
      Init.ClockDiv = hsd->Init.ClockDiv;;
}

前提 你的卡支持高速读写,例如三星的32G  那款读90M  写20M的。 其他卡 你可以测试一下可能会不稳定,在写的时候,这个没长时间测试抱歉。

3.关于非DMA 的操作方法
使用写函数的时候
if (BSP_SD_WriteBlocks(...) == MSD_OK)                      //操作成功
{           
      timer = HAL_GetTick() + SD_TIMEOUT;                     //超时处理
      while(timer > HAL_GETTICK())
      {   
           if(BSP_SD_GetCardState() == SD_TRANSFER_OK)//SD卡状态查询
           {
                  break;
           }
      }
}

读函数处理是一样的

4.DMA的操作
使用写函数的时候           如果需要使用系统 参考ST STM32Cube_FW_H7_V1.2.0\Projects\STM32H743I_EVAL\Applications\FatFs\FatFs_uSD_DMA_RTOS 下的例程根据不同的RTOS 自行修改就行

alignedAddr = (uint32_t)buff & ~0x1F;                        //字节对其处理   我没有做透写所以需要刷
SCB_CleanDCache_by_Addr((uint32_t*)alignedAddr, count*BLOCKSIZE + ((uint32_t)count - alignedAddr));    //cache处理 DMA发送之前需要处理              读函数在读取完成后处理cache

if(BSP_SD_WriteBlocks_DMA((uint32_t*)buff,(uint32_t) (sector),count) == MSD_OK)                                //DMA 写操作
{
      timer = HAL_GetTick() + SD_TIMEOUT;                                                                                    //先要等待DMA 完成
      while(timer > HAL_GetTick())
      {
          if (BSP_SD_GetDmaState() == SD_TRANSFER_OK)                                                                  //这个处理在DMA的回调函数中
         {
               break;
         }
     }
  
     timer = HAL_GetTick() + SD_TIMEOUT;
     while(timer > HAL_GetTick())                                                                                                      //在等待 SD 卡的状态
     {
          if (BSP_SD_GetCardState() == SD_TRANSFER_OK)
          {
               break;
          }
     }
}

2019-6.27更新
如果SD卡 无法识别吧时钟分频改为4

可以看下我这个帖子

使用特权

评论回复

相关帖子

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

本版积分规则

741

主题

742

帖子

0

粉丝