stm32f1系列使用DMA方式读取SD卡——基于HAL库

最近学习使用DMA方式读取SD卡时发现无论怎么设置,只能使用DMA写入,不能读取。
在网上搜索时也只有F4系列的资料,查看后发现F1的DMA只有DMA2通道4一个是用来给SD卡使用的。

F4系列的DMA有单独的读取和写入通道,是不是F1系列不能使用DMA方式读写SD卡?

基于Monster 组和GPT的调写:

在 STM32F1 系列中,DMA 只有 DMA1 和 DMA2 两个通道,并且只有 DMA2 通道 4 可以用于 SD 卡的读写。因此,在 STM32F1 系列中,只能使用 DMA2 通道 4 来实现 SD 卡的 DMA 读写操作。

如果你想要使用 DMA 读写 SD 卡,需要进行以下设置:

  • 配置 DMA 控制器和 DMA 通道。需要设置 DMA 控制器和 DMA 通道的配置寄存器,包括 DMA 模式、传输数据的长度、数据的来源和目标地址等。
  • 配置 SD 卡控制器。需要设置 SD 卡控制器的时钟、传输数据的长度、数据的来源和目标地址等。
  • 开启 DMA 和 SD 卡控制器的传输。需要分别设置 DMA 控制器和 SD 卡控制器的传输使能位,使它们开始工作。
  • 请看👉 :stm32f4 串口空闲中断+DMA遇到的奇怪错位问题
  • 除此之外, 这篇博客: STM32F4xx系列使用HAL库配置DMA数据传输中的 DMA使用框架 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 1、建立(选取)传输通道

    存储器->存储器

    外设->存储器

    存储器->外设

    2、确定传输对象

    具体的功能:

    UART(源)-内存(目标)

    内存数据(源)-UART(目标)

    3、敲定传输细节

    确定由谁来产生DMA请求,外设的DMA请求对应通道

    通道优先级

    确定传输数据双方的数据格式

    确定数据是否需要一直采集(循环模式是否使能)

    是否需要传输标志\中断

    DMA请求映射表

     双缓冲区模式

    DMA可以分时的去填充两块存储区,CPU可以避开正在填充的那一块,处理已经填充好的那一块存储区域,这样可以加快数据的处理,提高程序执行的效率。

    FIFO的功能作用

    FIFO是一个缓冲区,用于在源数据传输到目标之前临时存储这些数据。同时它也有数据处理的作用

     单次传输和突发传输

    单次传输->1个请求->1次传输

    突发传输->1个请求->多次传输 配合FIFO使用

     

  • 以下回答由chatgpt基于相关博客总结生成:

    针对该问题,我们可以先分析一下SD卡读取的原理:SD卡读取应该是先从SD卡中读取数据,然后再存储到MCU中,因此DMA方式读取SD卡应该是将数据先存储到SD卡的缓存区域中,然后再使用DMA方式将数据从缓存区域中读取出来存储到MCU中。

    但是根据参考资料中的内容可以发现,这里提供的是DMA用于将外设(比如ADC、USART等)数据读取到内存中的方法,并没有直接提到DMA读取SD卡的方法。

    因此,我目前也无法提供确切的解决方案,建议在网上进行更深入的查找或咨询相关工程师。