最近学习使用DMA方式读取SD卡时发现无论怎么设置,只能使用DMA写入,不能读取。
在网上搜索时也只有F4系列的资料,查看后发现F1的DMA只有DMA2通道4一个是用来给SD卡使用的。
F4系列的DMA有单独的读取和写入通道,是不是F1系列不能使用DMA方式读写SD卡?
在 STM32F1 系列中,DMA 只有 DMA1 和 DMA2 两个通道,并且只有 DMA2 通道 4 可以用于 SD 卡的读写。因此,在 STM32F1 系列中,只能使用 DMA2 通道 4 来实现 SD 卡的 DMA 读写操作。
如果你想要使用 DMA 读写 SD 卡,需要进行以下设置:
1、建立(选取)传输通道
存储器->存储器
外设->存储器
存储器->外设
2、确定传输对象
具体的功能:
UART(源)-内存(目标)
内存数据(源)-UART(目标)
3、敲定传输细节
确定由谁来产生DMA请求,外设的DMA请求对应通道
通道优先级
确定传输数据双方的数据格式
确定数据是否需要一直采集(循环模式是否使能)
是否需要传输标志\中断
DMA请求映射表
双缓冲区模式
DMA可以分时的去填充两块存储区,CPU可以避开正在填充的那一块,处理已经填充好的那一块存储区域,这样可以加快数据的处理,提高程序执行的效率。
FIFO的功能作用
FIFO是一个缓冲区,用于在源数据传输到目标之前临时存储这些数据。同时它也有数据处理的作用
单次传输和突发传输
单次传输->1个请求->1次传输
突发传输->1个请求->多次传输 配合FIFO使用
针对该问题,我们可以先分析一下SD卡读取的原理:SD卡读取应该是先从SD卡中读取数据,然后再存储到MCU中,因此DMA方式读取SD卡应该是将数据先存储到SD卡的缓存区域中,然后再使用DMA方式将数据从缓存区域中读取出来存储到MCU中。
但是根据参考资料中的内容可以发现,这里提供的是DMA用于将外设(比如ADC、USART等)数据读取到内存中的方法,并没有直接提到DMA读取SD卡的方法。
因此,我目前也无法提供确切的解决方案,建议在网上进行更深入的查找或咨询相关工程师。