OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 11659|回复: 15

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

[复制链接]

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
发表于 2018-7-14 23:16:15 | 显示全部楼层 |阅读模式
本帖最后由 qiousanxi 于 2019-6-27 19:41 编辑

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

可以看下我这个帖子

Bsp_sdcard.rar

2.58 KB, 下载次数: 482

SD卡初始化

FreeRtos -Fatfs.zip

3.86 MB, 下载次数: 645

整个工程

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2018-7-15 00:18:34 | 显示全部楼层
回复 支持 反对

使用道具 举报

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
 楼主| 发表于 2018-7-15 08:30:08 | 显示全部楼层

原子哥睡得这么晚!!!
回复 支持 反对

使用道具 举报

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
 楼主| 发表于 2018-7-16 09:27:25 | 显示全部楼层
The SDMMC host interface embeds a dedicated DMA controller allowing high-speed
transfers between the interface and the SRAM.

数据了手册有说明SD卡的是专用DMA,这个DMA 只能到SRAM 到不了 DTCM。注意了
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2018-11-3
在线时间
38 小时
发表于 2019-6-22 23:00:19 | 显示全部楼层
楼主能提供具体工程吗 我用这个驱动移植到fatfs里 不成功
回复 支持 反对

使用道具 举报

0

主题

286

帖子

0

精华

高级会员

Rank: 4

积分
950
金钱
950
注册时间
2018-4-21
在线时间
264 小时
发表于 2019-6-27 14:49:17 来自手机 | 显示全部楼层
谢谢分享!!
回复 支持 反对

使用道具 举报

3

主题

36

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
229
金钱
229
注册时间
2014-3-13
在线时间
65 小时
发表于 2019-6-27 17:14:28 | 显示全部楼层
向大佬学习
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2019-4-9
在线时间
11 小时
发表于 2019-7-29 17:05:09 | 显示全部楼层
给大佬点赞
回复 支持 反对

使用道具 举报

10

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2019-7-28
在线时间
45 小时
发表于 2019-7-29 17:49:12 来自手机 | 显示全部楼层
不错,我下载了学习
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2019-5-4
在线时间
18 小时
发表于 2019-9-24 16:11:21 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2019-5-4
在线时间
18 小时
发表于 2019-9-29 22:50:41 | 显示全部楼层
驱动移植后,SD用DMA 不成功
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2019-11-30
在线时间
13 小时
发表于 2019-12-1 09:52:36 | 显示全部楼层
驱动用起来挺好的。但是里面没看到像F4那样的DMA的定义,比如用DMA通道几之类的,
-是H7不需要定义直接能用了么?
-还是在其他地方有额外的定义呀。咋就能用DMA了呢?
回复 支持 反对

使用道具 举报

27

主题

427

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4369
金钱
4369
注册时间
2017-5-30
在线时间
579 小时
发表于 2019-12-1 09:57:05 | 显示全部楼层
baoxinqiang 发表于 2019-12-1 09:52
驱动用起来挺好的。但是里面没看到像F4那样的DMA的定义,比如用DMA通道几之类的,
-是H7不需要定义直接能 ...

1,H7 的SDMMC1 有独有的一个IDMA,开启中断就是使能了。
2,使用这个IDMA的时候注意要自己手动去做四字节对齐,ST没有帮你做,
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2019-11-30
在线时间
13 小时
发表于 2019-12-1 10:52:51 | 显示全部楼层
whj467467274672 发表于 2019-12-1 09:57
1,H7 的SDMMC1 有独有的一个IDMA,开启中断就是使能了。
2,使用这个IDMA的时候注意要自己手动去做四字 ...

好的,谢谢
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2017-10-26
在线时间
6 小时
发表于 2021-3-6 10:13:57 | 显示全部楼层
我用H7的例程, FTL_Init();  //
        exfuns_init();                                                        //为fatfs相关变量申请内存                                 
        res=f_mount(fs[0],"0:",1);                                         //挂载SD卡
        if(res != FR_OK)
                printf("sd卡挂载失败!");
        res=f_mount(fs[1],"1:",1);                                 //挂载FLASH.       
这个例程总是挂载失败。但又能读出根目当的文件夹。能新建一个文本文件,能写入,但是读时打开文件失败。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2017-10-26
在线时间
6 小时
发表于 2021-3-6 10:15:21 | 显示全部楼层
chengxingjun 发表于 2021-3-6 10:13
我用H7的例程, FTL_Init();  //
        exfuns_init();                                                        //为fatfs相关变量申请内存                                 
        res=f_mount ...

这个文件是官方例程。求老大指点
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-13 20:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表