STM32F103系列微控制器是基于ARM Cortex-M3内核的高效能、低成本的微处理器,广泛应用于各种嵌入式系统设计。在实际应用中,串口通信是设备间数据交换的重要方式,而DMA(直接内存访问)则可以提高数据传输效率,减轻CPU负担。本文将深入探讨STM32F103如何实现串口2(UART2)的DMA通信。
一、串口2(UART2)简介
STM32F103的UART2模块提供了全双工异步串行通信功能,支持多种波特率和数据格式,如8位数据、奇偶校验位选择、停止位数量等。通过UART2,微控制器可以与外部设备进行高速、可靠的串行通信。
二、DMA简介
DMA是一种硬件机制,允许数据在内存和外设之间直接传输,无需CPU介入。在STM32中,有多个DMA通道,每个通道可以连接到不同的外设,如串口、SPI、I2C等。当启用DMA时,CPU可以执行其他任务,而数据传输由DMA控制器自动完成,从而提高了系统性能。
三、STM32F103串口2 DMA配置
1. 启用DMA:首先需要开启STM32的DMA功能,通常在RCC_APB1PeriphClockCmd函数中设置RCC_APB1PeriphDMA1或RCC_APB1PeriphDMA2,根据STM32型号选择相应的DMA时钟。
2. 配置DMA通道:选择一个空闲的DMA通道,如DMA1_Channel4或DMA1_Channel5,连接到UART2的TX或RX。在DMA_Init函数中设置传输模式、数据大小、优先级等参数。
3. 配置UART2:在UART_Init函数中设置波特率、数据格式等,并启用UART2的DMA发送或接收功能。
4. DMA传输初始化:使用DMA舵手(DMA_InitTypeDef)结构体初始化传输参数,如传输方向、地址、数据长度等。调用DMA_Init函数完成初始化。
5. 链接DMA和UART2:通过DMA舵手结构体中的DMA_PeripheralBaseAddr和DMA_MemoryBaseAddr字段,设置DMA与UART2寄存器的连接。对于发送,设置DMA_PeripheralInc为DMA_PeripheralInc_Disable,表示UART2地址不增加;对于接收,设置DMA_MemoryInc为DMA_MemoryInc_Enable,表示内存地址递增。
6. 启动DMA传输:调用DMA_Cmd函数启动传输。对于发送,使用DMA_Start_IT启动并设置中断;对于接收,同样启动但可选择是否设置中断。
四、中断处理
为了实时监控数据传输状态,通常会启用DMA中断。在中断服务函数中,可以检查DMA_FLAG_TCR(传输完成)标志,判断传输是否完成,然后执行相应操作,如关闭DMA、清零标志、处理下一次传输等。
五、实例代码
```c
// DMA初始化
DMA_InitTypeDef DMA_InitStructure;
DMA_InitStructure.DMA_Channel = DMA_Channel_4; // 选择通道
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; // 数据流向:UART2到内存
DMA_InitStructure.DMA_BufferSize = BufferSize;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init(DMA1_Channel4, &DMA_InitStructure);
// UART2 DMA发送配置
UART_DMACmd(UART2, UART_DMAReq_Tx, ENABLE); // 启用UART2的DMA发送
// 启动DMA
DMA_Cmd(DMA1_Channel4, ENABLE); // 启动DMA传输
```
六、注意事项
1. 保证DMA通道与UART2之间的连接正确。
2. 调整DMA优先级以适应系统需求。
3. 适当处理DMA和UART中断,防止数据丢失或溢出。
4. DMA传输过程中,避免修改与传输相关的寄存器,除非已经停止了DMA。
总结,STM32F103的串口2通过DMA通信可以实现高效的数据传输,降低CPU负载,提高系统响应速度。理解并熟练掌握这一技术,对开发高性能的STM32应用具有重要意义。