一、介绍DMA 是一种无需 CPU 干预即可在外设与存储器之间直接传输数据的机制通过减少 CPU 开销来提升大量数据传输时的系统性能。CPU只需要一开始对DMA进行配置指定从哪个寄存器到哪个外部设备DAM搬完后会自动向CPU发送消息通知CPU搬完了STM32F407 有 2 个 DMA 控制器每个控制器有 8 个数据流每个数据流 有 8 个通道1 个数据流每次只能搬运 1 个通道的数据二、DMA 的仲裁器项目说明作用管理多个 DMA 通道对系统总线的竞争访问协调传输顺序软件优先级4级很高 高 中 低在 DMA_CCRx 寄存器中设置硬件优先级当软件优先级相同时通道编号越小优先级越高三、DMA事务操作说明从源地址读取数据通过 DMA_SxPAR外设地址或 DMA_SxM0AR存储器地址寻址从源端读取数据向目的地址写入数据通过 DMA_SxPAR 或 DMA_SxM0AR 寻址将读取的数据写入目的端传输计数器递减每次完整传输完成后DMA_SxNDTR 计数器减1记录剩余待传输的数据项数目可编程参数说明数据项数目由 DMA_SxNDTR 寄存器设置数据宽度可配置为 8 位、16 位或 32 位四、DMA传输4.1 DMA 传输方向配置DIR[1:0]传输模式源地址目标地址00外设 → 存储器DMA_SxPAR外设地址DMA_SxM0AR存储器地址01存储器 → 外设DMA_SxM0AR存储器地址DMA_SxPAR外设地址10存储器 → 存储器DMA_SxM0AR源存储器地址DMA_SxM0AR目标存储器地址通过DMA_SxCR 寄存器的 DIR[1:0] 位选择传输方向三种模式外设→存储器、存储器→外设、存储器→存储器存储器范围 0x2000000 至 0x200200000 共 1 28KB4.2 FIFOFIFO 大小每个数据流都有一个独立的 4 字16 字节FIFO。工作流程启用 FIFO 后源地址中的数据不会直接由 DMA 搬运到目标地址。数据先从源地址读取存入 FIFO 缓冲区中。当 FIFO 中积累的数据达到预设的阈值时DMA 才会将数据从 FIFO 中取出写入到目标地址。核心特点FIFO 起到了缓冲作用可以将多个小数据量合并为一次突发传输提高总线利用效率。五、指针增量控制位说明DMA_SxCR 寄存器中的PINC 位控制外设地址指针是否递增MINC 位控制存储器地址指针是否递增。递增模式当设置为增量模式时每次传输完成后下一次传输的地址 前一次地址 增量值。增量值由数据宽度决定字节8位时加1半字16位时加2字32位时加4。常量模式当设置为保持常量时每次传输都使用同一个内存地址反复从同一位置读取数据或写入同一位置。典型应用递增模式适合传输数组或连续内存块。常量模式适合反复读写同一个外设寄存器如 ADC 数据寄存器。数据宽度数据宽度通过 DMA_SxCR 寄存器的 PSIZE外设数据宽度和 MSIZE存储器数据宽度位配置。直接模式不用FIFO直接模式下源和目标的传输数据宽度必须相等。宽度由 DMA_SxCR 中的 PSIZE 位定义MSIZE 位在此模式下无效。FIFO 模式使用内部 FIFO 时FIFO 进行数据对齐和打包源和目标的数据宽度可以通过 PSIZE 和 MSIZE 位分别编程支持 8 位、16 位或 32 位两者可以不同。宽度不等时的传输计数当 PSIZE 和 MSIZE 不相等时DMA_SxNDTR 寄存器中配置的传输数据项数目其数据宽度等于外设总线的宽度由 PSIZE 位定义。举例PSIZE 配置为半字16位则实际传输的字节数 2 × NDTNDT 为 DMA_SxNDTR 中的计数值。六、循环模式循环模式的作用循环模式可用于处理循环缓冲区和连续数据流例如 ADC 扫描模式。如何使能通过 DMA_SxCR 寄存器中的 CIRC 位使能循环模式。工作流程当循环模式激活时每次传输完成且 DMA_SxNDTR 计数器减到 0 后计数器会自动重新加载为初始设置的数值。然后 DMA 继续响应新的 DMA 请求如此往复循环无需软件重新配置。典型应用场景适合需要连续不断传输数据的场景如 ADC 连续扫描、音频数据流等避免频繁在中断中重新配置 DMA。七、双缓冲模式使能通过将 DMA_SxCR 寄存器中的 DBM 位置 1 使能双缓冲模式。注意存储器到存储器模式不适用双缓冲模式。地址寄存器协作在此模式下DMA_SxM0AR 与 DMA_SxM1AR 两个存储器地址寄存器互相协作。每次事务结束时DMA 控制器会自动从一个存储器目标切换到另一个存储器目标。工作流程软件在处理一个存储器区域的同时DMA 传输可以继续填充或使用第二个存储器区域。两个缓冲区交替使用一个被 DMA 访问另一个被 CPU 访问。八、流控制器流控制器的定义控制要传输的数据数目的实体称为流控制器。通过 DMA_SxCR 寄存器中的 PFCTRL 位可以针对每个数据流独立配置。DMA 控制器作为流控制器适用于要传输的数据项数目确定的情况也可以通过软件实现不确定的情况。在使能 DMA 数据流之前由软件将要传输的数据项数目编程到 DMA_SxNDTR 寄存器中。DMA 按照这个计数进行传输每传一次减 1减到 0 时传输结束。外设作为流控制器适用于要传输的数据项数目未知的情况。当传输到最后一条数据时外设通过硬件向 DMA 控制器发出结束指示。仅限能够发出传输结束信号的外设支持此功能。外设流控制器时的特殊行为当外设作为流控制器时软件写入 DMA_SxNDTR 的值对 DMA 传输没有作用。一旦使能数据流硬件会将该值强制置为 0xFFFF。九、配置步骤配置项相关寄存器/位说明禁止数据流DMA_SxCR.EN写0禁止需等待当前传输完成才生效设置外设地址DMA_SxPAR外设端口寄存器地址在DR寄存器里面设置存储器地址DMA_SxM0AR / DMA_SxM1AR单缓冲用 M0AR双缓冲用 M0ARM1AR配置传输总数DMA_SxNDTR要传输的数据项数目选择 DMA 通道DMA_SxCR.CHSEL[2:0]选择外设 DMA 请求通道存储器到存储器可跳过选择流控制器DMA_SxCR.PFCTRL外设作为流控制器时置1仅限 SDIO 等配置优先级DMA_SxCR.PL[1:0]很高/高/中/低 四档配置 FIFO相关 FIFO 控制位存储器到存储器模式必须使能 FIFO配置传输参数DMA_SxCR 各控制位方向、增量模式、数据宽度、循环模式、双缓冲等激活数据流DMA_SxCR.EN置1 使能数据流开始传输十、DMA 搬运模式10.1 外设到存储器模式源地址外设的数据寄存器地址DMA_SxPAR目标地址存储器中的一段空间DMA_SxM0AR直接模式不使用 FIFO每完成一次从外设到存储器的数据传输数据立即移出并存储到目标地址。使能 FIFO每次产生外设请求数据从源外设传输到 FIFO 中。当 FIFO 达到预设的阈值级别时FIFO 的内容移出并存储到目标存储器中。10.2 存储器到外设模式源地址存储器中的一段空间DMA_SxM0AR目标地址外设的数据寄存器地址DMA_SxPAR直接模式不使用 FIFO每完成一次从存储器到外设的数据传输数据立即移出并存储到目标地址。使能 FIFO数据流使能后立即启动传输从源存储器读取数据将 FIFO 完全填充到阈值级别。每次发生外设请求FIFO 的内容移出并存储到目标外设中。当 FIFO 中剩余数据量小于或等于预设的阈值时DMA 控制器会自动从源地址存储器读取新数据将 FIFO 重新填满填到阈值级别或尽可能填满。这个过程叫做“完全重载 FIFO”目的是保证 FIFO 中始终有足够的数据等待外设请求避免外设等待数据。10.3 存储器到存储器模式源地址存储器中的一段空间DMA_SxM0AR目标地址存储器中的另一段空间DMA_SxM0AR注意存储器到存储器模式下只能使用 M0AR不能使用双缓冲直接模式不适用。存储器到存储器模式必须使能 FIFO。使能 FIFO通过将 DMA_SxCR 寄存器中的使能位EN置 1 来使能数据流时数据流会立即开始从源地址读取数据填充 FIFO直至达到预设的阈值级别。达到阈值级别后FIFO 中的内容便会移出并存储到目标地址中。当 FIFO 中剩余数据量低于阈值时DMA 会自动从源地址读取新数据将 FIFO 重新填充到阈值级别。这个过程不断重复直到 DMA_SxNDTR 计数器减到 0传输结束。10.4 DMA 控制器常用状态• 传输完成中断标志 TCIF • 半传输完成中断标志 HTIF • 数据传输错误中断标志 TEIF • FIFO 状态 FS 11、DMA相关地址11.1 DMA控制器基址控制器基址所属总线DMA10x4002 6000AHB1DMA20x4002 6400AHB111.2 寄存器映射偏移地址寄存器名称缩写偏移地址备注DMA 低中断状态寄存器DMA_LISR0x00数据流 0~3 中断状态DMA 高中断状态寄存器DMA_HISR0x04数据流 4~7 中断状态DMA 低中断标志清零寄存器DMA_LIFCR0x08清数据流 0~3 中断标志DMA 高中断标志清零寄存器DMA_HIFCR0x0C清数据流 4~7 中断标志DMA 数据流 x 配置寄存器DMA_SxCR0x10 0x18×xx 0~7DMA 数据流 x 数据项数寄存器DMA_SxNDTR0x14 0x18×xDMA 数据流 x 外设地址寄存器DMA_SxPAR0x18 0x18×xDMA 数据流 x 存储器 0 地址寄存器DMA_SxM0AR0x1C 0x18×xDMA 数据流 x 存储器 1 地址寄存器DMA_SxM1AR0x20 0x18×x双缓冲模式用DMA 数据流 x FIFO 控制寄存器DMA_SxFCR0x24 0x24×x注意偏移增量与上面不同12、HAL接口12.1 DMA 控制器初始化配置结构体typedef struct { uint32_t Channel; /* 数据流的通道编号 */ uint32_t Direction; /* 数据传输方向 */ uint32_t PeriphInc; /* 外设地址递增模式 */ uint32_t MemInc; /* 存储器地址递增模式 */ uint32_t PeriphDataAlignment; /* 外设数据宽度 */ uint32_t MemDataAlignment; /* 存储器数据宽度 */ uint32_t Mode; /* DMA 传输模式 */ uint32_t Priority; /* 数据流优先级 */ uint32_t FIFOMode; /* 直接模式/FIFO模式 */ uint32_t FIFOThreshold; /* FIFO阈值级别 */ uint32_t MemBurst; /* 存储器突发模式 */ uint32_t PeriphBurst; /* 外设突发模式 */ } DMA_InitTypeDef;12.2 HAL_DMA_Init() 函数项目内容函数功能初始化 DMA 控制器函数原型HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma)参数 hdmaDMA 句柄指针包含 DMA 配置信息返回值HAL_OK成功HAL_ERROR失败HAL_BUSY忙HAL_TIMEOUT超时作用根据句柄参数配置 DMA 数据流的通道、方向、地址递增、数据宽度、传输模式、优先级及 FIFO 等寄存器参数并重置句柄状态12.3 HAL_DMA_Start 函数项目内容函数功能开始 DMA 传输函数原型HAL_StatusTypeDef HAL_DMA_Start(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)参数 hdmaDMA 句柄指针包含 DMA 配置信息参数 SrcAddress源地址外设地址或存储器地址参数 DstAddress目标地址存储器地址或外设地址参数 DataLength待传输的数据项个数返回值HAL_OK成功HAL_ERROR失败HAL_BUSY忙HAL_TIMEOUT超时作用配置源地址、目标地址和数据长度寄存器后使能 DMA 数据流启动传输但该函数采用轮询方式会占用 CPU 资源实际开发中一般用中断方式HAL_DMA_Start_IT替代12.4 HAL_DMA_Start_IT 函数项目内容函数功能中断方式开始 DMA 传输函数原型HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)参数 hdmaDMA 句柄指针包含 DMA 配置信息参数 SrcAddress源地址外设地址或存储器地址参数 DstAddress目标地址存储器地址或外设地址参数 DataLength待传输的数据项个数返回值HAL_OK成功HAL_ERROR失败HAL_BUSY忙HAL_TIMEOUT超时作用配置源地址、目标地址和数据长度寄存器并使能中断然后启动 DMA 传输传输完成后由中断回调函数处理不占用 CPU 轮询资源12.5 HAL_UART_Transmit_DMA 函数项目内容函数功能使用 DMA 方式发送 UART 数据函数原型HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)参数 huartUART 句柄指针包含 UART 配置信息参数 pData待发送数据的缓冲区首地址参数 Size待发送的数据字节数返回值HAL_OK成功HAL_ERROR失败HAL_BUSY忙HAL_TIMEOUT超时作用配置 DMA 将内存中的数据自动传输到 UART 发送寄存器启动 DMA 传输实现后台发送发送完成后通过中断回调通知无需 CPU 逐字节等待12.6 HAL_UART_Receive_DMA 函数项目内容函数功能使用 DMA 方式接收 UART 数据函数原型HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)参数 huartUART 句柄指针包含 UART 配置信息参数 pData存放接收数据的缓冲区首地址参数 Size待接收的数据字节数返回值HAL_OK成功HAL_ERROR失败HAL_BUSY忙HAL_TIMEOUT超时作用配置 DMA 将 UART 接收寄存器的数据自动传输到内存缓冲区启动 DMA 传输实现后台接收接收完成后通过中断回调通知无需 CPU 逐字节等待
DMA控制器原理
一、介绍DMA 是一种无需 CPU 干预即可在外设与存储器之间直接传输数据的机制通过减少 CPU 开销来提升大量数据传输时的系统性能。CPU只需要一开始对DMA进行配置指定从哪个寄存器到哪个外部设备DAM搬完后会自动向CPU发送消息通知CPU搬完了STM32F407 有 2 个 DMA 控制器每个控制器有 8 个数据流每个数据流 有 8 个通道1 个数据流每次只能搬运 1 个通道的数据二、DMA 的仲裁器项目说明作用管理多个 DMA 通道对系统总线的竞争访问协调传输顺序软件优先级4级很高 高 中 低在 DMA_CCRx 寄存器中设置硬件优先级当软件优先级相同时通道编号越小优先级越高三、DMA事务操作说明从源地址读取数据通过 DMA_SxPAR外设地址或 DMA_SxM0AR存储器地址寻址从源端读取数据向目的地址写入数据通过 DMA_SxPAR 或 DMA_SxM0AR 寻址将读取的数据写入目的端传输计数器递减每次完整传输完成后DMA_SxNDTR 计数器减1记录剩余待传输的数据项数目可编程参数说明数据项数目由 DMA_SxNDTR 寄存器设置数据宽度可配置为 8 位、16 位或 32 位四、DMA传输4.1 DMA 传输方向配置DIR[1:0]传输模式源地址目标地址00外设 → 存储器DMA_SxPAR外设地址DMA_SxM0AR存储器地址01存储器 → 外设DMA_SxM0AR存储器地址DMA_SxPAR外设地址10存储器 → 存储器DMA_SxM0AR源存储器地址DMA_SxM0AR目标存储器地址通过DMA_SxCR 寄存器的 DIR[1:0] 位选择传输方向三种模式外设→存储器、存储器→外设、存储器→存储器存储器范围 0x2000000 至 0x200200000 共 1 28KB4.2 FIFOFIFO 大小每个数据流都有一个独立的 4 字16 字节FIFO。工作流程启用 FIFO 后源地址中的数据不会直接由 DMA 搬运到目标地址。数据先从源地址读取存入 FIFO 缓冲区中。当 FIFO 中积累的数据达到预设的阈值时DMA 才会将数据从 FIFO 中取出写入到目标地址。核心特点FIFO 起到了缓冲作用可以将多个小数据量合并为一次突发传输提高总线利用效率。五、指针增量控制位说明DMA_SxCR 寄存器中的PINC 位控制外设地址指针是否递增MINC 位控制存储器地址指针是否递增。递增模式当设置为增量模式时每次传输完成后下一次传输的地址 前一次地址 增量值。增量值由数据宽度决定字节8位时加1半字16位时加2字32位时加4。常量模式当设置为保持常量时每次传输都使用同一个内存地址反复从同一位置读取数据或写入同一位置。典型应用递增模式适合传输数组或连续内存块。常量模式适合反复读写同一个外设寄存器如 ADC 数据寄存器。数据宽度数据宽度通过 DMA_SxCR 寄存器的 PSIZE外设数据宽度和 MSIZE存储器数据宽度位配置。直接模式不用FIFO直接模式下源和目标的传输数据宽度必须相等。宽度由 DMA_SxCR 中的 PSIZE 位定义MSIZE 位在此模式下无效。FIFO 模式使用内部 FIFO 时FIFO 进行数据对齐和打包源和目标的数据宽度可以通过 PSIZE 和 MSIZE 位分别编程支持 8 位、16 位或 32 位两者可以不同。宽度不等时的传输计数当 PSIZE 和 MSIZE 不相等时DMA_SxNDTR 寄存器中配置的传输数据项数目其数据宽度等于外设总线的宽度由 PSIZE 位定义。举例PSIZE 配置为半字16位则实际传输的字节数 2 × NDTNDT 为 DMA_SxNDTR 中的计数值。六、循环模式循环模式的作用循环模式可用于处理循环缓冲区和连续数据流例如 ADC 扫描模式。如何使能通过 DMA_SxCR 寄存器中的 CIRC 位使能循环模式。工作流程当循环模式激活时每次传输完成且 DMA_SxNDTR 计数器减到 0 后计数器会自动重新加载为初始设置的数值。然后 DMA 继续响应新的 DMA 请求如此往复循环无需软件重新配置。典型应用场景适合需要连续不断传输数据的场景如 ADC 连续扫描、音频数据流等避免频繁在中断中重新配置 DMA。七、双缓冲模式使能通过将 DMA_SxCR 寄存器中的 DBM 位置 1 使能双缓冲模式。注意存储器到存储器模式不适用双缓冲模式。地址寄存器协作在此模式下DMA_SxM0AR 与 DMA_SxM1AR 两个存储器地址寄存器互相协作。每次事务结束时DMA 控制器会自动从一个存储器目标切换到另一个存储器目标。工作流程软件在处理一个存储器区域的同时DMA 传输可以继续填充或使用第二个存储器区域。两个缓冲区交替使用一个被 DMA 访问另一个被 CPU 访问。八、流控制器流控制器的定义控制要传输的数据数目的实体称为流控制器。通过 DMA_SxCR 寄存器中的 PFCTRL 位可以针对每个数据流独立配置。DMA 控制器作为流控制器适用于要传输的数据项数目确定的情况也可以通过软件实现不确定的情况。在使能 DMA 数据流之前由软件将要传输的数据项数目编程到 DMA_SxNDTR 寄存器中。DMA 按照这个计数进行传输每传一次减 1减到 0 时传输结束。外设作为流控制器适用于要传输的数据项数目未知的情况。当传输到最后一条数据时外设通过硬件向 DMA 控制器发出结束指示。仅限能够发出传输结束信号的外设支持此功能。外设流控制器时的特殊行为当外设作为流控制器时软件写入 DMA_SxNDTR 的值对 DMA 传输没有作用。一旦使能数据流硬件会将该值强制置为 0xFFFF。九、配置步骤配置项相关寄存器/位说明禁止数据流DMA_SxCR.EN写0禁止需等待当前传输完成才生效设置外设地址DMA_SxPAR外设端口寄存器地址在DR寄存器里面设置存储器地址DMA_SxM0AR / DMA_SxM1AR单缓冲用 M0AR双缓冲用 M0ARM1AR配置传输总数DMA_SxNDTR要传输的数据项数目选择 DMA 通道DMA_SxCR.CHSEL[2:0]选择外设 DMA 请求通道存储器到存储器可跳过选择流控制器DMA_SxCR.PFCTRL外设作为流控制器时置1仅限 SDIO 等配置优先级DMA_SxCR.PL[1:0]很高/高/中/低 四档配置 FIFO相关 FIFO 控制位存储器到存储器模式必须使能 FIFO配置传输参数DMA_SxCR 各控制位方向、增量模式、数据宽度、循环模式、双缓冲等激活数据流DMA_SxCR.EN置1 使能数据流开始传输十、DMA 搬运模式10.1 外设到存储器模式源地址外设的数据寄存器地址DMA_SxPAR目标地址存储器中的一段空间DMA_SxM0AR直接模式不使用 FIFO每完成一次从外设到存储器的数据传输数据立即移出并存储到目标地址。使能 FIFO每次产生外设请求数据从源外设传输到 FIFO 中。当 FIFO 达到预设的阈值级别时FIFO 的内容移出并存储到目标存储器中。10.2 存储器到外设模式源地址存储器中的一段空间DMA_SxM0AR目标地址外设的数据寄存器地址DMA_SxPAR直接模式不使用 FIFO每完成一次从存储器到外设的数据传输数据立即移出并存储到目标地址。使能 FIFO数据流使能后立即启动传输从源存储器读取数据将 FIFO 完全填充到阈值级别。每次发生外设请求FIFO 的内容移出并存储到目标外设中。当 FIFO 中剩余数据量小于或等于预设的阈值时DMA 控制器会自动从源地址存储器读取新数据将 FIFO 重新填满填到阈值级别或尽可能填满。这个过程叫做“完全重载 FIFO”目的是保证 FIFO 中始终有足够的数据等待外设请求避免外设等待数据。10.3 存储器到存储器模式源地址存储器中的一段空间DMA_SxM0AR目标地址存储器中的另一段空间DMA_SxM0AR注意存储器到存储器模式下只能使用 M0AR不能使用双缓冲直接模式不适用。存储器到存储器模式必须使能 FIFO。使能 FIFO通过将 DMA_SxCR 寄存器中的使能位EN置 1 来使能数据流时数据流会立即开始从源地址读取数据填充 FIFO直至达到预设的阈值级别。达到阈值级别后FIFO 中的内容便会移出并存储到目标地址中。当 FIFO 中剩余数据量低于阈值时DMA 会自动从源地址读取新数据将 FIFO 重新填充到阈值级别。这个过程不断重复直到 DMA_SxNDTR 计数器减到 0传输结束。10.4 DMA 控制器常用状态• 传输完成中断标志 TCIF • 半传输完成中断标志 HTIF • 数据传输错误中断标志 TEIF • FIFO 状态 FS 11、DMA相关地址11.1 DMA控制器基址控制器基址所属总线DMA10x4002 6000AHB1DMA20x4002 6400AHB111.2 寄存器映射偏移地址寄存器名称缩写偏移地址备注DMA 低中断状态寄存器DMA_LISR0x00数据流 0~3 中断状态DMA 高中断状态寄存器DMA_HISR0x04数据流 4~7 中断状态DMA 低中断标志清零寄存器DMA_LIFCR0x08清数据流 0~3 中断标志DMA 高中断标志清零寄存器DMA_HIFCR0x0C清数据流 4~7 中断标志DMA 数据流 x 配置寄存器DMA_SxCR0x10 0x18×xx 0~7DMA 数据流 x 数据项数寄存器DMA_SxNDTR0x14 0x18×xDMA 数据流 x 外设地址寄存器DMA_SxPAR0x18 0x18×xDMA 数据流 x 存储器 0 地址寄存器DMA_SxM0AR0x1C 0x18×xDMA 数据流 x 存储器 1 地址寄存器DMA_SxM1AR0x20 0x18×x双缓冲模式用DMA 数据流 x FIFO 控制寄存器DMA_SxFCR0x24 0x24×x注意偏移增量与上面不同12、HAL接口12.1 DMA 控制器初始化配置结构体typedef struct { uint32_t Channel; /* 数据流的通道编号 */ uint32_t Direction; /* 数据传输方向 */ uint32_t PeriphInc; /* 外设地址递增模式 */ uint32_t MemInc; /* 存储器地址递增模式 */ uint32_t PeriphDataAlignment; /* 外设数据宽度 */ uint32_t MemDataAlignment; /* 存储器数据宽度 */ uint32_t Mode; /* DMA 传输模式 */ uint32_t Priority; /* 数据流优先级 */ uint32_t FIFOMode; /* 直接模式/FIFO模式 */ uint32_t FIFOThreshold; /* FIFO阈值级别 */ uint32_t MemBurst; /* 存储器突发模式 */ uint32_t PeriphBurst; /* 外设突发模式 */ } DMA_InitTypeDef;12.2 HAL_DMA_Init() 函数项目内容函数功能初始化 DMA 控制器函数原型HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma)参数 hdmaDMA 句柄指针包含 DMA 配置信息返回值HAL_OK成功HAL_ERROR失败HAL_BUSY忙HAL_TIMEOUT超时作用根据句柄参数配置 DMA 数据流的通道、方向、地址递增、数据宽度、传输模式、优先级及 FIFO 等寄存器参数并重置句柄状态12.3 HAL_DMA_Start 函数项目内容函数功能开始 DMA 传输函数原型HAL_StatusTypeDef HAL_DMA_Start(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)参数 hdmaDMA 句柄指针包含 DMA 配置信息参数 SrcAddress源地址外设地址或存储器地址参数 DstAddress目标地址存储器地址或外设地址参数 DataLength待传输的数据项个数返回值HAL_OK成功HAL_ERROR失败HAL_BUSY忙HAL_TIMEOUT超时作用配置源地址、目标地址和数据长度寄存器后使能 DMA 数据流启动传输但该函数采用轮询方式会占用 CPU 资源实际开发中一般用中断方式HAL_DMA_Start_IT替代12.4 HAL_DMA_Start_IT 函数项目内容函数功能中断方式开始 DMA 传输函数原型HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)参数 hdmaDMA 句柄指针包含 DMA 配置信息参数 SrcAddress源地址外设地址或存储器地址参数 DstAddress目标地址存储器地址或外设地址参数 DataLength待传输的数据项个数返回值HAL_OK成功HAL_ERROR失败HAL_BUSY忙HAL_TIMEOUT超时作用配置源地址、目标地址和数据长度寄存器并使能中断然后启动 DMA 传输传输完成后由中断回调函数处理不占用 CPU 轮询资源12.5 HAL_UART_Transmit_DMA 函数项目内容函数功能使用 DMA 方式发送 UART 数据函数原型HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)参数 huartUART 句柄指针包含 UART 配置信息参数 pData待发送数据的缓冲区首地址参数 Size待发送的数据字节数返回值HAL_OK成功HAL_ERROR失败HAL_BUSY忙HAL_TIMEOUT超时作用配置 DMA 将内存中的数据自动传输到 UART 发送寄存器启动 DMA 传输实现后台发送发送完成后通过中断回调通知无需 CPU 逐字节等待12.6 HAL_UART_Receive_DMA 函数项目内容函数功能使用 DMA 方式接收 UART 数据函数原型HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)参数 huartUART 句柄指针包含 UART 配置信息参数 pData存放接收数据的缓冲区首地址参数 Size待接收的数据字节数返回值HAL_OK成功HAL_ERROR失败HAL_BUSY忙HAL_TIMEOUT超时作用配置 DMA 将 UART 接收寄存器的数据自动传输到内存缓冲区启动 DMA 传输实现后台接收接收完成后通过中断回调通知无需 CPU 逐字节等待