html5模板网站,北京软件开发平均工资,建筑网格布,wordpress 云虚拟主机目录
DMA介绍
STM32F1 DMA框图
DMA处理过程
DMA通道
DMA优先级
DMA相关寄存器介绍 F1
DMA通道x配置寄存器#xff08;DMA_CCRx#xff09;
DMA中断状态寄存器#xff08;DMA_ISR#xff09;
DMA中断标志清除寄存器#xff08;DMA_IFCR#xff09;
DMA通道x传输…目录
DMA介绍
STM32F1 DMA框图
DMA处理过程
DMA通道
DMA优先级
DMA相关寄存器介绍 F1
DMA通道x配置寄存器DMA_CCRx
DMA中断状态寄存器DMA_ISR
DMA中断标志清除寄存器DMA_IFCR
DMA通道x传输数量寄存器DMA_CNDTR
DMA通道x外设地址寄存器DMA_CPARx
DMA通道x存储器地址寄存器DMA_CMARx DMA相关HAL库驱动介绍
以DMA方式传输串口数据配置步骤
DMA介绍
DMA全称Direct Memory Access即直接存储器访问。
DMA传输 将数据从一个地址空间复制到另一个地址空间。 数据搬运工
DMA传输无需CPU直接控制传输也没有中断处理方式那样保留现场和恢复现场过程通过硬件为RAM和IO设备开辟一条直接传输数据的通道使得CPU的效率大大提高
作用为CPU减负
传输方向内存---外设、外设---内存、内存---内存 STM32F1 DMA框图 ①DMA请求
DMA传输数据先向DMA控制器发送请求
②DMA通道
不同外设向DMA的不同通道发送请求
DMA1有7个通道DMA2有5个通道
③DMA优先级 多个DMA通道同时发来请求时就有先后响应处理的顺序问题这个由仲裁器管理
优先级管理也分软件阶段和硬件阶段
注意DMA2仅存在大容量产品和互联型产品 DMA处理过程 DMA通道
DMA1 每个通道用来管理来自于一个或多个外设对存储器访问的请求。且都有一个仲裁器用于处理DMA请求间的优先级。 DMA优先级
仲裁器管理DMA通道请求分为两个阶段软件阶段(1)、硬件阶段(2)
第一阶段软件阶段每个通道的优先级可在DMA_CCRx寄存器中设置有四个等级最高、高、中和低优先级。
第二阶段硬件阶段如果两个请求有相同软件优先级较低编号的通道比较高编号的通道有较高的优先级。
大容量芯片中DMA1控制器拥有高于DMA2控制器的优先级
注意多个请求通过逻辑或输入到DMA控制器只能有一个请求有效。 DMA相关寄存器介绍 F1 DMA通道x配置寄存器DMA_CCRx 主要设置:
是否为存储器到存储器模式MEM2MEM
数据传输方向DIR
通道优先级PL[1:0]
循环模式CIRC
外设/存储器增量模式PINC/MINC
外设/存储器数据宽度PSIZE[1:0]/MSZE[1:0]
使能中断TEIE传输错误中断、HTIE半传输中断、TCIE传输完成中断
开启通道EN DMA中断状态寄存器DMA_ISR 注意当设置了允许中断时将会产生中断 DMA中断标志清除寄存器DMA_IFCR DMA通道x传输数量寄存器DMA_CNDTR 最大数据传输数目65535 非循环模式下传输结束后要开始新的DMA传输需要在关闭DMA通道情况下在该寄存器中重新写入传输数目。 DMA通道x外设地址寄存器DMA_CPARx DMA通道x存储器地址寄存器DMA_CMARx DMA相关HAL库驱动介绍 DMA外设相关结构体DMA_HandleTypeDef 和 DMA_InitTypeDef 以DMA方式传输串口数据配置步骤
(USART1_TX DMA1_CH4)
1、使能DMA时钟
__HAL_RCC_DMA1_CLK_ENABLE
2、初始化DMA
HAL_DMA_Init函数初始化DMA相关参数
__HAL_LINKDMA函数连接DMA和外设
3、使能串口的DMA发送启动传输
HAL_UART_Transmit_DMA
查询DMA传输状态 __HAL_DMA_GET_FLAG 查询通道传输状态
__HAL_DMA_GET_COUNTER 获取当前传输剩余数据量
DMA中断使用
HAL_NVIC_EnableIRQ
HAL_NVIC_SetPriority
编写中断服务函数 xxx_IRQHandler 在使用DMA来搬运数据到串口UART中需要注意的事项
将 DMA 与 USART1 连接
__HAL_LINKDMA(g_uart1_handle, hdmatx, g_dma_handle);
__HAL_LINKDMA 宏用于将 DMA 句柄 (g_dma_handle) 与 USART1 的发送 DMA (hdmatx) 进行关联。这确保了 DMA 在发送数据时能够正确地与 UART1 进行交互。
启动 UART 的 DMA 传输
HAL_UART_Transmit_DMA(g_uart1_handle, g_sendbuf, SEND_BUF_SIZE);
使用 HAL_UART_Transmit_DMA 启动 UART 数据的 DMA 传输其中 g_sendbuf 是待发送的数据缓冲区SEND_BUF_SIZE 是数据的大小。
等待 DMA 传输完成
while (1)
{if ( __HAL_DMA_GET_FLAG(g_dma_handle, DMA_FLAG_TC4)) /* 等待 DMA1_Channel4 传输完成 */{__HAL_DMA_CLEAR_FLAG(g_dma_handle, DMA_FLAG_TC4);HAL_UART_DMAStop(g_uart1_handle); /* 传输完成以后关闭串口DMA */break;}使用 __HAL_DMA_GET_FLAG 检查 DMA 是否完成传输如果完成则通过 __HAL_DMA_CLEAR_FLAG 清除 DMA 传输完成标志。然后调用 HAL_UART_DMAStop 停止 DMA 传输。