斗阴

核心内容摘要

探索“辶臿辶喿辶17”:一场关于未来生活方式的畅想
烈焰红唇,舞动乾坤:不知火舞与三位少年的奇遇记

国产Yeezy451:国色天香,颠覆想象的潮流新篇章

DMADirect Memory Access直接存储器访问提供在外设与内存、存储器和存储器之间的高速数据传输使用。

它允许不同速度的硬件装置来沟通而不需要依赖于CPU在这个时间中CPU对于内存的工作来说就无法使用。

目录三种搬运方式工作方式DMA控制器DMA优先级管理DMA传输方式指针递增模式DMA数据对齐方式DMA寄存器及库函数介绍函数使用说明启用 DMA1 时钟初始化 DMA启动 DMA 传输链接 DMA 到外设UART DMA 传输检查 DMA 标志启用/禁用 DMA示例代码片段三种搬运方式存储器→存储器例如复制某特别大的数据buf存储器→外设 例如将某数据buf写入串口TDR寄存器外设→存储器 例如将串口RDR寄存器写入某数据buf工作方式DMA控制器STM32F103有2个DMA控制器DMA1有7个通道DMA 2有5个通道。

一个通道每次只能搬运一个外设的数据如果同时有多个外设的DMA请求则按照优先级进行响应。

STM32F103C8T6只有DMA1DMA优先级管理优先级管理采用软件硬件软件每个通道的优先级可以在DMA_CCRx寄存器中设置有4个等级最高级高级中级低级硬件如果2个请求它们的软件优先级相同则较低编号的通道比较高编号的通道有较高的优先权。

比如如果软件优先级相同通道2优先于通道4DMA传输方式DMA_Mode_Normal正常模式一次DMA数据传输完后停止DMA传送 也就是只传输一次DMA_Mode_Circular循环传输模式当传输结束时硬件自动会将传输数据量寄存器进行重装进行下一轮的数据传输。

也就是多次传输模式指针递增模式外设和存储器指针在每次传输后可以自动向后递增或保持常量。

当设置为增量模式时下一个要传输的地址将是前一个地址加上增量值DMA数据对齐方式源-目标一般右对齐多的高位补0DMA寄存器及库函数介绍常用库函数__HAL_RCC_DMA1_CLK_ENABLE(…)HAL_DMA_Init(…)HAL_DMA_Start(…)__HAL_LINKDMA(…)HAL_UART_Transmit_DMA(…)HAL_UART_Receive_DMA(…)__HAL_DMA_GET_FLAG(…)__HAL_DMA_ENABLE(…)__HAL_DMA_DISABLE(…)函数使用说明启用 DMA1 时钟__HAL_RCC_DMA1_CLK_ENABLE()用于启用 DMA1 控制器的时钟。

在使用 DMA 功能前必须调用此函数以确保 DMA 控制器正常工作。

初始化 DMAHAL_DMA_Init()用于初始化 DMA 通道。

需要传入一个DMA_HandleTypeDef结构体指针该结构体包含 DMA 配置参数如传输方向、数据宽度、源和目标地址等。

启动 DMA 传输HAL_DMA_Start()启动 DMA 传输。

需要指定源地址、目标地址和传输长度。

通常在初始化 DMA 后调用此函数开始数据传输。

链接 DMA 到外设__HAL_LINKDMA()用于将 DMA 通道与外设如 UART关联。

通常传入外设句柄、DMA 句柄和 DMA 句柄的成员变量名。

UART DMA 传输HAL_UART_Transmit_DMA()和HAL_UART_Receive_DMA()分别用于通过 DMA 发送和接收 UART 数据。

需要传入 UART 句柄、数据缓冲区指针和数据长度。

检查 DMA 标志__HAL_DMA_GET_FLAG()用于检查 DMA 传输状态标志如传输完成标志TC或半传输标志HT。

通常用于轮询方式检查传输状态。

启用/禁用 DMA__HAL_DMA_ENABLE()和__HAL_DMA_DISABLE()分别用于启用或禁用 DMA 通道。

可用于动态控制 DMA 传输的启停。

示例代码片段以下是一个简单的 UART DMA 传输示例DMA_HandleTypeDef hdma_usart1_tx; UART_HandleTypeDef huart1; // 启用 DMA1 时钟 __HAL_RCC_DMA1_CLK_ENABLE(); // 初始化 DMA hdma_usart1_tx.Instance DMA1_Channel4; hdma_usart1_tx.Init.Direction DMA_MEMORY_TO_PERIPH; hdma_usart1_tx.Init.PeriphInc DMA_PINC_DISABLE; hdma_usart1_tx.Init.MemInc DMA_MINC_ENABLE; hdma_usart1_tx.Init.PeriphDataAlignment DMA_PDATAALIGN_BYTE; hdma_usart1_tx.Init.MemDataAlignment DMA_MDATAALIGN_BYTE; hdma_usart1_tx.Init.Mode DMA_NORMAL; hdma_usart1_tx.Init.Priority DMA_PRIORITY_LOW; HAL_DMA_Init(hdma_usart1_tx); // 链接 DMA 到 UART __HAL_LINKDMA(huart1, hdmatx, hdma_usart1_tx); // 启动 UART DMA 传输 uint8_t data[] Hello DMA!; HAL_UART_Transmit_DMA(huart1, data, sizeof(data));

浏览器观看B站视频的最佳设置-浏览器观看B站视频的最佳设置应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123