STM32F4 USART1 使用DMA发送、接收数据

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的请求映射如下:
DMA1请求映射
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;                
  • 18
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值