基于中断/DMA方式的串口通信

一 实验目的
1 了解串口协议和RS-232标准,以及RS232电平与TTL电平的区别。
2 了解"USB/TTL转232"模块(以CH340芯片模块为例)的工作原理。
3 使用HAL库(或标准库)方式,设置USART1 波特率为115200,1位停止位,无校验 位。
4 掌握通过中断方式和DMA方式实现串口通信的方法。

二 实验任务
任务1
了解串口协议和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
在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察串口输出波形,并分析时序状态正确与否,计算波特率实际为多少。

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

STM32系统给上位机(win10)连续发送“hello windows!”;当上位机给stm32发送字符“stop”
后,stm32暂停发送“hello windows!”;发送一个字符“start”后,stm32继续发送;
步骤1
了解串口协议和RS-232标准,以及RS232电平与TTL电平的区别
串口通信概述
同步串行:数据传输以数据块(一组字符)为单位,在一个数据块内,字符与字符间无间隔,收发双方依靠独立的时钟线进行信号的同步。适用于大批量的数据传输。

异步串行:数据传输以单个字符为单位,字符和字符之间的间隙任意,字符内部每一位持续的时间相同。收发双方没有专门的时钟信号,而是依靠事先约定的字符格式和通信速率来完成通信。
在这里插入图片描述

RS-232标准接口(又称EIA RS-232)是常用的串行通信接口标准之一,它是由美国电子工业协会(EIA)联合贝尔系统公司、调制解调厂家及计算机终端生产厂家于1970年共同制定,其全名是“数据终端设备( DTE)和数据通信设备(DCE)之间串行二进制数据交换接口技术标准”。

TTL电平与RS232电平的区别
什么是TTL电平、RS232电平?它们有什么区别呢?

(一)、TTL电平标准

输出 L: <0.8V ; H:>2.4V。

输入 L: <1.2V ; H:>2.0V

TTL器件输出低电平要小于0.8V,高电平要大于2.4V。输入,低于1.2V就认为是0,高于2.0就认为是1。于是TTL电平的输入低电平的噪声容限就只有(0.8-0)/2=0.4V,高电平的噪声容限为(5-2.4)/2=1.3V。

(二)、RS232标准

在TXD和RXD数据线上:
  (1)逻辑1为-3~-15V的电压
  (2)逻辑0为3~15V的电压
在RTS、CTS、DSR、DTR和DCD等控制线上:
  (1)信号有效(ON状态)为3~15V的电压
  (2)信号无效(OFF状态)为-3~-15V的电压
这是由通信协议RS-232规定的。
RS-232:标准串口,最常用的一种串行通讯接口。有三种类型(A,B和C),它们分别采用不同的电压来表示on和off。最被广泛使用的是RS-232C,它将mark(on)比特的电压定义为-3V到-12V之间,而将space(off)的电压定义到+3V到+12V之间。传送距离最大为约15米,最高速率为20kb/s。RS-232是为点对点(即只用一对收、发设备)通讯而设计的,其驱动器负载为3~7kΩ。所以RS-232适合本地设备之间的通信。

步骤2
了解"USB/TTL转232"模块(以CH340芯片模块为例)的工作原理

CH340 是一个USB 总线的转接芯片,实现USB 转串口、USB 转IrDA 红外或者USB 转打印口。为了增加串口通讯的远距离传输及抗干扰能力,RS-232标准使用-15V 表示逻辑 1, +15V 表示逻辑 0。常常会使用 MH340芯片对 USB/TTL与RS-232电平的信号进行转换。

CH340工作原理图
在这里插入图片描述

步骤3
使用HAL库(或标准库)方式,设置USART1 波特率为115200,1位停止位,无校验位,分别采用中断方式、DMA方式完成下列任务:

STM32系统给上位机(win10)连续发送“hello windows!”;当上位机给stm32发送字符“stop”
后,stm32暂停发送“hello windows!”;发送一个字符“start”后,stm32继续发送;
一、中断方式的串口通信
CubeMX初始配置
1.RCC时钟配置
设置高速外部时钟HSE,选择外部时钟源
在这里插入图片描述

2.USART1配置使能
选择异步通信模式
在这里插入图片描述
3.串口中断使能
在这里插入图片描述
4.串口中断通信程序编写
相关标志位及发送接收字符串变量的定义

uint8_t RX_str; //串口接收变量
uint8_t flag=0; //串口发送的全局标志位
uint8_t Uart1_TXBuff[]="hello windows!\r\n";
uint8_t STOP[]="stop stm32!";
uint8_t START[]="go stm32!";

USART1初始化配置函数

/* USART1 init function */

void MX_USART1_UART_Init(void)
{

  /* USER CODE BEGIN USART1_Init 0 */

  /* USER CODE END USART1_Init 0 */

  /* USER CODE BEGIN USART1_Init 1 */

  /* USER CODE END USART1_Init 1 */
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }
``
main函数
在main函数中写入下列程序,将目标字符串发送至PC端的上位机,while语句中,满足条件则发送“hello windows!"

  HAL_UART_Receive_IT(&huart1, (uint8_t *)&RX_str, 1);   //打开串口接收中断
  
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
	if(flag==0)
	{
		HAL_UART_Transmit(&huart1, (uint8_t*)Uart1_TXBuff, sizeof(Uart1_TXBuff), 100);  //发送"hello windows!"
	}
	
	
	HAL_Delay(500);
	
    /* USER CODE BEGIN 3 */
  }

串口中断服务函数

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */

  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);      //串口接收中断服务函数入口
  /* USER CODE BEGIN USART1_IRQn 1 */

  /* USER CODE END USART1_IRQn 1 */
}

回调函数

/* USER CODE BEGIN 4 */

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(RX_str=='s'||RX_str==*STOP)
	{
		flag=1;
	}
	else if(RX_str =='t'||RX_str==*START)
	{
		flag=0;
	}
	HAL_UART_Receive_IT(&huart1, (uint8_t *)&RX_str, 1); //重新打开串口接收中断
}

/* USER CODE END 4 */

5、实验结果
使用串口通信助手进行串口通信
实现功能
1)当stm32接收到字符“s”时,停止持续发送“hello windows!”; 当接收到字符“t”时,持续发送“hello windows!”
2)当stm32接收到字符“stop stm32!”时,停止持续发送“hello windows!”; 当接收到字符“go stm32!”时,持续发送“hello windows!”
在这里插入图片描述

二、DMA方式的串口通信
1DMA概述
DMA,直接存储访器问,用于在外设与存储器之间以及存储器与存储器之间进行高速数据传输。DMA传输过程的初始化和启动由CPU完成,传输过程由DMA控制器来执行,无需CPU参与,从而节省CPU资源,提高利用率。
在这里插入图片描述
2DMA方式串口通信的CubeMX配置初始化
RCC时钟配置
在这里插入图片描述
USART1配置
在这里插入图片描述
使能中断
在这里插入图片描述
DMA设置
点击DMA Settings的Add添加通道,传输速率设置为中速Medium,模式设置为Normal,勾选Memory
在这里插入图片描述
点击System Core下的DMA,添加MEMTOMEN,


时钟树配置
在这里插入图片描述
3程序编写
在main.c文件添加代码

uint8_t Senbuff[] = "Hello world!\r\n";  //定义数据发送数组

实验结果
编译无错误后,烧录运行即可
在这里插入图片描述

任务2
在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察串口输出波形,并分析时序状态正确与否,计算波特率实际为多少。
Keil的软件仿真逻辑分析仪功能观察串口输出波形
详细教程见文章

1、首先,设置options for target:
①Target页的设置:
在这里插入图片描述

波特率:UART通信协议进行一个字节数据的传输时就是在信号线上产生八个高低电平的组合,数据传送速率用波特率来表示,即每秒钟传送的二进制位数。

在这里插入图片描述

已知:1位停止位,无校验位

1字符包含 1(起始位)+8(数据位)+0(校验位)+1(停止位)=10bit

计算得115200

实验总结

在本次实验中,我们深入了解了串口协议和RS-232标准,以及与TTL电平的区别。我们学习了"USB/TTL转232"模块(以CH340芯片模块为例)的工作原理,并成功设置了USART1波特率为115200,1位停止位,无校验位。

通过中断方式和DMA方式完成了任务1的要求,即当上位机发送字符"stop"后,STM32暂停发送"hello windows!";发送字符"start"后,STM32继续发送。这样的实验设计可以有效控制STM32的串口通信行为,提供了一种灵活的交互方式。

在没有示波器的条件下,我们使用Keil的软件仿真逻辑分析仪功能观察了串口输出波形,并分析了时序状态的正确性。我们还计算了波特率的实际数值,以确保通信的准确性。

通过这次实验,我们进一步掌握了串口通信的原理和方法,并且加深了对STM32中USART模块的理解。同时,我们熟悉了使用Keil的软件仿真逻辑分析仪功能进行波形观察和时序分析的操作。

总之,本次实验使我们对串口通信有了更深入的理解,并为以后的嵌入式开发提供了基础知识和技能。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值