STM32F4 USART1 使用DMA发送、接收数据
参考文章:
STM32F4 UART1 DMA发送和接收不定长度数据
STM32F4使用DMA收发数据
一、为什么使用DMA方式收发数据
DMA,全称Direct Memory Access ,即直接存储器访问。DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM与I/O设备开辟一条直接传送的同类,能使CPU的效率大大提高。直接存储器访问(DMA)用于在外设与存储器之间以及存储器与存储器与存储器之间提供数据传输。它无需CPU参与而自动移动数据,即DMA就是一个数据搬运工。
二、怎么使用DMA
既然DMA是一个数据搬运工,那么根据数据传输三要素,必须知道数据的源、目的和长度。在STM32F4中还需要设置数据传输方向等其它项,具体参考代码。
三、STM32F4 DMA简介
STM32F4有2个DMA,每个DMA控制器有8个数据流,每个数据流有多达8个通道,但是仅DMA2数据流能够执行存储器到存储器之间的数据传输。其中DMA2的请求映射如下:
从图中可以看出串口1的接收和发送分别位于DMA2数据流2(或数据流5)的通道4和数据流7的通道4。
四、代码解析
本程序的功能为把接收到的数据发送出去。
1、main函数
功能:系统初始化,将串口1接收到的数据通过串口1用DMA方式发送出去。
int main(void)
{
/*******初始化*******/
USART1_Initializes();
DMA_Initializes();
NVIC_Initializes();
while(1)
{
if(USART1_RX_LEN!=0)
{
DMA_USART1_Send(DMA_USART1_RX_BUF,USART1_RX_LEN); //发送接收到的数据
USART1_RX_LEN=0; //接收状态清零
}
}
}
2、串口初始化
要使用串口收发数据,首先得初始化串口。本例中串口1管脚选用PA9、PA10,因为用到了RS485通讯,还有一个管脚PA6作为控制收发,这些都需要进行初始化配置。串口1的波特率配置为1200000,可以根据需要进行选择,波特率低的话传输会比较稳定,数据不容易出错。
void USART1_Initializes(void)
{
USART1_GPIO_Configuration();
USART1_MODE_Configuration();
}
void USART1_GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* RCC时钟配置 */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //使能GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //使能USART1时钟
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1); //GPIOA9复用为USART1
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1); //GPIOA10复用为USART1
/* 定义USART-TX 引脚为复用输出 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //IO口的第9pin发送、第10pin接收
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;