OpenEdv-开源电子网

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

F4的SDIO中的DMA设置求助,另发现了个注释的错误(有点鸡蛋里面挑骨头,还请原子哥莫怪)

[复制链接]

6

主题

123

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1281
金钱
1281
注册时间
2012-5-27
在线时间
200 小时
发表于 2014-12-11 19:01:21 | 显示全部楼层 |阅读模式
5金钱

内容如题:

我发现的注释里面的一个小问题,就是时钟的注释:

其中SDIOCLK为48M,若初始时始终不能高于400KHz,则分频至少为120,然后减去2就是118,对应的十六进制为0x76,刚好就是SDIO_INIT_CLK_DIV的宏定义值。

所以此处的注释应该为SDIOCLK = 48MHz, SDIO_CK = HCLK/(118 + 2) = 400 KHz


还有就是另外一点我比较佩服的是关于读取操作中的字节对其问题,原子哥也考虑到了,当开始我没看明白,后来想了想才看懂什么意思:

在读取磁盘的操作中有一个判断指向buf的指针的地址是否对4求余为零,如果不为零就先读取到指定的四字节对齐的__align(4) u8 SDIO_DATA_BUFFER[512];中,然后复制到要操作的buf;当然如果已经对齐了,就直接读就是了,分别是读单个块还是多个块。

u8 SD_ReadDisk(u8*buf,u32 sector,u8 cnt)
{
 u8 sta=SD_OK;
 long long lsector=sector;
 u8 n;
 if(CardType!=SDIO_STD_CAPACITY_SD_CARD_V1_1)lsector<<=9;
 if((u32)buf%4!=0)
 {
   for(n=0;n<cnt;n++)
  {
    sta=SD_ReadBlock(SDIO_DATA_BUFFER,lsector+512*n,512);//单个sector的读操作
   memcpy(buf,SDIO_DATA_BUFFER,512);
   buf+=512;
  }
 }else
 {
  if(cnt==1)sta=SD_ReadBlock(buf,lsector,512);     //单个sector的读操作
  else sta=SD_ReadMultiBlocks(buf,lsector,512,cnt);//多个sector 
 }
 return sta;
}


最后有一个问题,也是我想问的一个,关于读取过程中使用DMA方式的,如果遇到了用于读取的指针不为4字节对齐的话?!!!!

好吧,我没问题了,我懂了,是我理解错了,我没疑问了。

是我一开始看错了,如果不为四字节对其的话,是要先读取到四字节对其的中去,然后放到要存的buf中,我自己给自己解答了,是我没看好。所以不存在对齐的问题。

最佳答案

查看完整内容[请看2#楼]

谢谢楼主指出。另外提醒大家,DMA方式,如果还开其它DMA,容易出错。所以建议大家用查询方式。综合实验,如果改为DMA方式就乱套了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-11 19:01:22 | 显示全部楼层
谢谢楼主指出。另外提醒大家,DMA方式,如果还开其它DMA,容易出错。所以建议大家用查询方式。综合实验,如果改为DMA方式就乱套了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

6

主题

123

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1281
金钱
1281
注册时间
2012-5-27
在线时间
200 小时
 楼主| 发表于 2014-12-11 21:48:11 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
感谢原子哥,不怪我就行。本来刚开始学SDIO的时候用F1的板子,其中的SD卡实验使用的是SPI模式,也查了一些SDIO的资料,不过感觉没有看懂。然后等F4的板子出来后,发现里面有使用SDIO的解释,就仔细对比着看了下,发现效果不错,我竟然看懂了,知道SDIO控制器是怎么个工作流程了,然后在计算时钟的时候发现注释用的是F1的,就提了出来,不怪我就好,我只是发表我的看法而已。然后对比着看了下查询和DMA模式,对工作原理也有了一定的了解。
正如你说的,DMA方式容易出错,并且每次读取扇区的时候,都要对DMA进行下初始化,感觉有点浪费时间,希望可以精简下,那样就可以节省很大的CPU开销。当然,最后我还是觉得查询的方式靠谱点。
回复

使用道具 举报

0

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2019-7-2
在线时间
27 小时
发表于 2019-7-16 16:53:18 | 显示全部楼层
STM32F103 发表于 2014-12-11 21:48
回复【2楼】正点原子:
---------------------------------
感谢原子哥,不怪我就行。本来刚开始学SDIO的时 ...

我丢,我因为这个注释纠结了一个下午。心态崩了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-27 05:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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