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

2019-07-20 22:30发布

内容如题: 我发现的注释里面的一个小问题,就是时钟的注释: 其中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中,我自己给自己解答了,是我没看好。所以不存在对齐的问题。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
正点原子
1楼-- · 2019-07-21 01:18
 精彩回答 2  元偷偷看……
STM32F103
2楼-- · 2019-07-21 02:27
回复【2楼】正点原子:
---------------------------------
感谢原子哥,不怪我就行。本来刚开始学SDIO的时候用F1的板子,其中的SD卡实验使用的是SPI模式,也查了一些SDIO的资料,不过感觉没有看懂。然后等F4的板子出来后,发现里面有使用SDIO的解释,就仔细对比着看了下,发现效果不错,我竟然看懂了,知道SDIO控制器是怎么个工作流程了,然后在计算时钟的时候发现注释用的是F1的,就提了出来,不怪我就好,我只是发表我的看法而已。然后对比着看了下查询和DMA模式,对工作原理也有了一定的了解。
正如你说的,DMA方式容易出错,并且每次读取扇区的时候,都要对DMA进行下初始化,感觉有点浪费时间,希望可以精简下,那样就可以节省很大的CPU开销。当然,最后我还是觉得查询的方式靠谱点。
leafhui
3楼-- · 2019-07-21 08:00
 精彩回答 2  元偷偷看……

一周热门 更多>