基于DMA方式的串口通信

一、主要任务

了解串口协议和RS-232标准,以及RS232电平与TTL电平的区别;了解"USB/TTL转232"模块(以CH340芯片模块为例)的工作原理。 使用HAL库(或标准库)方式,设置USART1 波特率为115200,1位停止位,无校验位,分别采用中断方式、DMA方式完成下列任务:

STM32系统给上位机(win10)连续发送“hello windows!”;当上位机给stm32发送字符“stop”后,stm32暂停发送“hello windows!”;发送一个字符“start”后,stm32继续发送;

二、关于串口

2.1串口协议

通用异步收发器UART是一种串行、异步、全双工的通信协议,将所需传输的数据一位接一位的传输,在USRT通讯
协议中信号线上的状态为高电平代表‘1’,低电平代表‘0’。其特点是通信线路简单,只要一对传输线就可以实现双向通信,大大降低成本,但传输速度较慢。
串口协议用于与其他模块之间的信息交互,包含接收模块和发送模块,信号传输线上根据波特率完成码元的接收和发送,因而接收模块主要完成串并转换,串并转换是接收和发送模块必备的基本功能,发送模块完成串并转换,接收模块完成串并转换
在这里插入图片描述

2.2RS-232标准

串口通信的物理层有很多标准及变种,我们主要讲解RS-232标准,RS-232标准主要规定了信号的用途、通讯接口以及信号的电平标准。
使用RS-232标准的串口设备间常见的通讯结构如下:
在这里插入图片描述
上面的通讯方式中,两个通讯设备的“DB9接口”之间通过串口信号线建立起连接,串口信号线中使用“RS-232标准”传输数据信号。由于RS-232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个“电平转换芯片”转换成控制器能识别的“TTL标准”的电平信号,才能实现通讯。

2.3TTL标准与RS-232标准的区别

下图为TTL电平标准与RS232电平标准
在这里插入图片描述
常见的电子电路中使用TTL的电平标准,理想状态下,使用5V表示二进制逻辑1,使用0V表示逻辑0;而为了增加串口通讯的远距离传输及抗干扰能力,它使用-15V表示逻辑1,+15V表示逻辑0。在表示同一个信号的RS232与TTL电平的对比图:
在这里插入图片描述
由于控制器一般使用TTL电平标准,所以常常会使用MA3232芯片对TTL及RS-22电平的信号进行相互转换。

2.4USB转TTL原理

  • 串口发送

串口应用发送数据->USB串口驱动获取数据->驱动将数据经过USB通道发送给USB串口设备->USB串口设备接收到数据通过串口发送

  • 串口接收

USB串口设备接收串口数据->将串口数据经过USB打包后上传给USB主机->USB串口驱动获取到通过USB上传的串口数据->驱动将数据保存在串口缓冲区提供给串口应用读取

  • USB转串口CH340接线

下图是USB转串口模块的一些功能模块的标示,USB转串口电路板背后还预留了一些全信号输出的接口,可以将电线直接焊接在这些引脚上来使用预留的功能
在这里插入图片描述下图是对USB转串口模块的引脚标示
在这里插入图片描述

三、使用DMA实现串口发送和接受

3.1使用HAL库建立项目

选择芯片STM32F103C8T6
在这里插入图片描述
配置RCC
在这里插入图片描述
配置SRS
在这里插入图片描述
配置串口,并选择异步,可以看到串口的相关参数,波特率为115200,1位停止位,无检验位
在这里插入图片描述
配置DMA
在这里插入图片描述
设置DMA参数,RX和TX参数相同,将模式设置为普通,地址递增:外设不递增,存储器递增,FIFO使用:不使能,数据宽度:字节在这里插入图片描述
使能串口中断与DMA中断
在这里插入图片描述

为项目命名,并选择MDK-ARM在这里插入图片描述
勾选.c/.h文件,最后导出项目,在Keil中打开
在这里插入图片描述

3.3DMA方式的串口通信

3.3.1DMA概述

1.直接访问寄存器(DMA):用于在外设与存储器之间以及存储器与存储器之间进行高速数据传输。DMA传输过程的初始化和启动由CPU完成,传输过程由DMA控制器来执行,无须CPU资源,提高利用率。
2.DMA数据传输的四个要素:

  • 传输源:DMA数据传输的来源
  • 传输目标:DMA数据传输的目的
  • 传输数量:DMA传输数据的数量
  • 触发信号:启动一次DMA数据传输的动作
3.3.2DMA方式的接口函数

1.串口DMA方式发送函数

HAL_UART_Transmit_DMA

该函数在DMA方式下发送一定数量的数据
入口参数1huart:串口句柄的地址
入口参数2pData:待发送数据的首地址
入口参数3Size:待发送数据的个数
2.串口DMA方式接收函数

HAL_UART_Receive_DMA

该函数在DMA方式下接收一定数量的数据
入口参数1huart:串口句柄的地址
入口参数2pData:待接收数据的首地址
入口参数3Size:待接收数据的个数
3.获取未传输数据个数函数

_HAL_DMA_GET_COUNTER

该函数用于获取DMA数据流中未传输数据的个数
参数_HANDLE_:串口句柄的地址

3.4代码编写

添加用户宏定义及定义变量(在主函数外定义)

uint8_t hello[]="hello windows\r\n";
uint8_t RecCount=0;//接收数据个数
uint8_t RxFlag=0;//接收完成标志,0表示接收未完成,1表示接收完成

添加用户初始化代码(在main函数中添加)

  __HAL_UART_ENABLE_IT (&huart2,UART_IT_IDLE);//使能IDLE中断
  HAL_UARTEx_ReceiveToIdle_DMA(&huart2, RxBuffer, length);

接收中断回调函数

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
		if(strcmp((uint8_t *)RxBuffer,"start")==0)
		RxFlag =1;//设置接收完成标志
	else 
		RxFlag=0;
	if(huart->Instance ==USART2 )
	{		
		  HAL_UARTEx_ReceiveToIdle_DMA(&huart2, RxBuffer, length);
	}
	
}

while代码:

while (1)
  {
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
	  if(RxFlag ==1)//判断数据是否接收完成
	  {
		  HAL_UART_Transmit_DMA (&huart2 ,(uint8_t *)hello ,sizeof (hello ));
	  }
	  HAL_Delay(300);
  }
  /* USER CODE END 3 */
3.5代码实现

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值