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中,我自己给自己解答了,是我没看好。所以不存在对齐的问题。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。