STM32上SPI+DMA实现大批量读取flash数据

本文介绍了如何使用STM32通过SPI接口结合DMA技术,实现大容量读取Flash数据。作者指出配置DMA通道时需要注意选择正确的SPI请求,初始化发送和接收缓冲区,并详细阐述了DMA初始化过程。在读写操作中,作者强调了全双工模式与只读模式的区别,以及使用DMA传输完成标志确保数据完整传输的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近做项目需要使用SPI+DMA,为了做实验感受DMA传输数据块,本人以SPI+DMA来读取flash中的数据。网上有很多例程是spi直接读取flash,无法提高性能。因为只是简单的实验SPI的DMA功能,所以在写数据时并没有考虑页写一些制约,只是简单的将1k大小的数据写入flash,然后用DMA读出这1K大小的数据,相信SPI和DMA的配置大家都很熟悉了,本人在此不在强调,只是说几点注意点的:

(1)DMA关于SPI通道的选择,在stm32中,SPI1_RX读请求是DMA通道2,SPI1_TX发送请求是DMA通道3。刚开始我在配置通道的时候没仔细看,看的是SPI/I2S2_RX这个请求,把通道配置成了通道四和通道五,结果一直无法出来结果。所以这个是第一个要注意的。


(2)设置发送和接收缓冲区,并且对发送缓冲区初始化,本例中我设定发送和接收缓冲区大小是1K,可以根据自己需要设定,本帖子起抛砖引玉作用。

uint32_t Tx_Buffer[256];
uint32_t Rx_Buffer[256];

对发送缓冲区初始化:

for(i = 0; i< 256; i++)
{
Tx_Buffer[i] = i;
}

下面是对DMA的初始化,本例中没有用到中断。

void DMA_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;

/*开启时钟*/
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

### STM32F103C8T6 DMA1 引脚分配 STM32F103C8T6 是一款基于 ARM Cortex-M3 内核的微控制器,其 DMA 控制器 (Direct Memory Access, DMA) 提供了一种无需 CPU 干预即可传输数据的方法。DMA1 在该芯片中有多个通道,用于连接不同的外设。 #### DMA1 的功能概述 DMA1 支持多达 7 个独立请求线,并通过这些线路与各种片上外设相连[^1]。每个通道可以配置为支持特定的外设操作模式,例如 ADC 转换、SPI 数据传输或 USART 发送/接收缓冲区填充等。 #### 关于引脚映射的具体说明 需要注意的是,DMA 自身并不直接对应具体的 GPIO 引脚;相反,它是作为后台机制来处理由某些 I/O 或内部模块触发的数据移动任务。因此,在讨论 “DMA1 引脚”时实际上是指哪些外围设备能够利用 DMA 功能来进行高效通信。以下是几个典型例子: - **ADC**: 如果使用模拟数字转换器,则可以通过设置相应的寄存器使能 DMA 请求以连续采集多路输入信号并存储到内存中[^2]。 - **USART/SPI/I²C**: 这些串行接口都可以借助 DMA 实现大批量数据交换而不需要频繁中断服务程序干预。例如 PA9 和 PA10 分别被定义为 USART1_TX 和 USART1_RX,默认情况下可启用关联的 DMA 流程完成异步发送和接受过程[^3]。 对于确切了解某个具体型号上的所有可能组合及其默认映射关系,请查阅官方提供的《STM32F1xx Reference Manual》文档部分章节关于“Peripheral mapping on APB buses”的描述以及相应表格中的细节信息[^4]。 ```c // 配置 DMA 初始化结构体示例代码片段 DMA_InitTypeDef DMA_InitStruct; /* 设置要使用的 DMA 通道 */ DMA_InitStruct.DMA_Channel = DMA_CHANNEL_5; /* 定义方向:从外设读取至内存写入 */ DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC; /* 缓冲大小设定 */ DMA_InitStruct.DMA_BufferSize = Buffer_Size; ... ``` 上述 C 语言伪码展示了如何初始化一个典型的 DMA 事务前必要的参数指定流程的一部分。 ---
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值