硬汉嵌入式论坛

 找回密码
 立即注册
查看: 541|回复: 3
收起左侧

[有问必答] SD卡的DMA配置问题

[复制链接]

32

主题

103

回帖

199

积分

高级会员

积分
199
发表于 2023-10-10 11:12:23 | 显示全部楼层 |阅读模式
V5的手册里说内存1字节对齐,外设4字节对齐
微信截图_20231010110908.png






我看V5107a的代码时,发现并没有这样设置,也没有对DMA的内存地址,BufferDST进行4字节对齐。

请问这是怎么回事,哪种是正确的。谢谢
微信截图_20231010111007.png
请问应该以哪个为准,谢谢。


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106856
QQ
发表于 2023-10-10 12:35:12 | 显示全部楼层
第1个截图是新版本,好用的。

最后一个截图是老版,不再推荐,没有处理字节对齐问题。
回复

使用道具 举报

32

主题

103

回帖

199

积分

高级会员

积分
199
 楼主| 发表于 2024-1-2 16:31:25 | 显示全部楼层
eric2013 发表于 2023-10-10 12:35
第1个截图是新版本,好用的。

最后一个截图是老版,不再推荐,没有处理字节对齐问题。

你好,如果这里字节不对齐会出现什么问题呢?我看标准库的文件,STM324x7i_eval.c里的void SD_LowLevel_DMA_RxConfig(uint32_t *BufferDST, uint32_t BufferSize)函数,也没有4字节对齐的处理。
[C] 纯文本查看 复制代码
/**
  * @brief  Configures the DMA2 Channel4 for SDIO Rx request.
  * @param  BufferDST: pointer to the destination buffer
  * @param  BufferSize: buffer size
  * @retval None
  */
void SD_LowLevel_DMA_RxConfig(uint32_t *BufferDST, uint32_t BufferSize)
{
  DMA_InitTypeDef SDDMA_InitStructure;

  DMA_ClearFlag(SD_SDIO_DMA_STREAM, SD_SDIO_DMA_FLAG_FEIF | SD_SDIO_DMA_FLAG_DMEIF | SD_SDIO_DMA_FLAG_TEIF | SD_SDIO_DMA_FLAG_HTIF | SD_SDIO_DMA_FLAG_TCIF);

  /* DMA2 Stream3  or Stream6 disable */
  DMA_Cmd(SD_SDIO_DMA_STREAM, DISABLE);

  /* DMA2 Stream3 or Stream6 Config */
  DMA_DeInit(SD_SDIO_DMA_STREAM);

  SDDMA_InitStructure.DMA_Channel = SD_SDIO_DMA_CHANNEL;
  SDDMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SDIO_FIFO_ADDRESS;
  SDDMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)BufferDST;
  SDDMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
  SDDMA_InitStructure.DMA_BufferSize = BufferSize;
  SDDMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  SDDMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  SDDMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
  SDDMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
  SDDMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  SDDMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
  SDDMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;
  SDDMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
  SDDMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_INC4;
  SDDMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_INC4;
  DMA_Init(SD_SDIO_DMA_STREAM, &SDDMA_InitStructure);
  DMA_ITConfig(SD_SDIO_DMA_STREAM, DMA_IT_TC, ENABLE);
  DMA_FlowControllerConfig(SD_SDIO_DMA_STREAM, DMA_FlowCtrl_Peripheral);

  /* DMA2 Stream3 or Stream6 enable */
  DMA_Cmd(SD_SDIO_DMA_STREAM, ENABLE);
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106856
QQ
发表于 2024-1-2 16:41:31 | 显示全部楼层
伊森亨特 发表于 2024-1-2 16:31
你好,如果这里字节不对齐会出现什么问题呢?我看标准库的文件,STM324x7i_eval.c里的void SD_LowLevel_D ...

不对齐,各种奇葩问题。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-7 21:10 , Processed in 0.479244 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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