2026/4/18 16:09:15
网站建设
项目流程
上海婚纱网站设计,网站建设的技术风险,公司网站php,wordpress实现301跳转详解简介
DMA(Direct Memory Access,直接内存访问)是一种允许外设直接与内存进行数据传输的技术,无需 CPU 干预,可大大提高数据传输效率。STM32F407 系列芯片配备了 2 个 DMA 控制器(DMA1 和 DMA2),共 16 个数据流,每个数据流可配置为不同的外设通道,支持多种传输模式,…简介DMA(Direct Memory Access,直接内存访问)是一种允许外设直接与内存进行数据传输的技术,无需 CPU 干预,可大大提高数据传输效率。STM32F407 系列芯片配备了 2 个 DMA 控制器(DMA1 和 DMA2),共 16 个数据流,每个数据流可配置为不同的外设通道,支持多种传输模式,如内存到内存、外设到内存、内存到外设等。本文从 DMA 的基本原理出发,详细讲解 STM32F407 DMA 的配置方法、代码实现、传输模式以及实际应用案例,帮助你快速掌握 DMA 的使用技巧。一、DMA核心概念与分类1.1 基本概念DMA 是一种允许外设直接与内存进行数据传输的技术,其主要特点包括:减轻 CPU 负担:数据传输过程中 CPU 可执行其他任务提高传输效率:避免 CPU 中断处理的开销支持多种传输模式:内存到内存、外设到内存、内存到外设支持多种触发方式:可由外设事件触发,实现自动化传输支持多种数据宽度:8 位、16 位、32 位关键参数:数据流:DMA 控制器中的数据传输通道通道:每个数据流可配置为不同的外设通道传输方向:内存到内存、外设到内存、内存到外设数据宽度:8 位、16 位、32 位传输模式:正常模式、循环模式、双缓冲模式1.2 STM32F407 的 DMA 资源STM32F407 系列芯片配备了 2 个 DMA 控制器:DMA 控制器数据流数量通道数量时钟源适用场景DMA178AHB1主要服务于 APB1 外设DMA298AHB2主要服务于 APB2 外设和 AHB 外设DMA1 数据流与通道对应关系:数据流通道0通道1通道2通道3通道4通道5通道6通道7Stream0SPI3_RXUART3_RXTIM4_CH1/TIM4_TRGOI2C1_RXTIM2_CH1/TIM2_TRGO---Stream1-SPI3_TXTIM4_CH2I2C1_TXTIM2_CH2/TIM2_UPTIM3_CH4/TIM3_UP--Stream2--TIM4_CH3I2C2_RXTIM2_CH3TIM3_CH1/TIM3_TRGO--Stream3--TIM4_UPI2C2_TXTIM2_CH4TIM3_CH2--Stream4-----TIM3_CH3DAC1_CH1/DAC1_CH2TIM5_TRGO/TIM5_CH4Stream5------DAC2_CH1TIM5_CH1/TIM5_CH2/TIM5_CH3Stream6-------TIM6_UP/TIM7_UPStream7--------DMA2 数据流与通道对应关系:数据流通道0通道1通道2通道3通道4通道5通道6通道7Stream0ADC1SPI1_RXUSART1_RX-----Stream1--------Stream2----USART1_TX---Stream3--------Stream4--------Stream5--------Stream6--------Stream7--------关键特性:支持 8 位、16 位、32 位数据宽度支持正常模式、循环模式、双缓冲模式支持内存到内存、外设到内存、内存到外设传输支持外设和内存地址自动递增支持多种中断:传输完成、半传输完成、传输错误等支持 FIFO 模式和突发传输二、DMA工作原理2.1 基本工作原理DMA 的基本工作原理是通过 DMA 控制器直接控制数据在外设和内存之间的传输,无需 CPU 干预。传输流程:CPU 配置 DMA 传输参数(源地址、目的地址、传输长度等)CPU 使能 DMA 传输DMA 控制器根据配置参数执行数据传输传输完成后,DMA 控制器触发中断(如果使能)CPU 在中断服务函数中处理传输完成事件2.2 传输模式DMA 支持多种传输模式:正常模式:传输完成后,DMA 控制器停止工作需要重新配置 DMA 参数才能进行下一次传输适用于单次传输场景循环模式:传输完成后,DMA 控制器自动重新开始传输无需 CPU 干预,可实现连续传输适用于连续数据采集或输出场景双缓冲模式:使用两个缓冲区交替进行数据传输在一个缓冲区传输时,CPU 可以处理另一个缓冲区的数据适用于需要实时处理数据的场景2.3 数据流配置DMA 数据流的配置参数包括:外设地址:外设数据寄存器的地址可配置为固定地址或自动递增内存地址:内存缓冲区的地址可配置为固定地址或自动递增传输长度:要传输的数据项数量最大值为 65535数据宽度:外设数据宽度:8 位、16 位、32 位内存数据宽度:8 位、16 位、32 位传输方向:外设到内存:从外设读取数据到内存内存到外设:从内存发送数据到外设内存到内存:从内存一个区域复制数据到另一个区域优先级:低、中、高、非常高当多个数据流同时请求时,根据优先级决定传输顺序三、DMA配置与代码实现3.1 标准库配置步骤以 DMA2 Stream0 Channel0(ADC1)为例,使用标准库配置 DMA 的基本步骤:使能 DMA 时钟配置 DMA 数据流参数配置 DMA 通道配置 DMA 中断(可选)使能 DMA 数据流3.2 代码实现(DMA2 Stream0 Channel0,ADC1)#include"stm32f4xx.h"#defineADC1_DMA_BUFFER_SIZE100uint16_tADC1_DMA_Buffer[ADC1_DMA_BUFFER_SIZE];/** * @brief 初始化DMA2 Stream0 Channel0(ADC1) * @param 无 * @retval 无 */voidDMA2_Stream0_Init(void){DMA_InitTypeDef DMA_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;// 1. 使能DMA2时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);// 2. 配置DMA2 Stream0DMA_DeInit(DMA2_Stream0);while(DMA_GetCmdStatus(DMA2_Stream0)!=DISABLE