STM32学习:串口通讯(proteus仿真)

文章目录

  • 前言
  • 一、相关知识点
  • 二、电路搭建与硬件配置
    • 1、proteus电路搭建
      • 1、COMPIM元件
      • 2、VIRTUAL TERMINAL虚拟终端元件
      • 3、整体电路:
    • 2、CubeMx硬件电路配置
  • 三、串口通讯函数与程序编写
    • 1、串口通讯函数
      • 1、阻塞式发送函数
      • 2、非阻塞式发送函数
      • 3、阻塞式接收函数
      • 4、非阻塞式接受
      • 5、串口发送完毕中断回调函数
    • 2、程序编写
      • 1、宏定义与数据变量设定
    • 2、开机串口发送hello world!(main函数)
    • 3、等待接受串口发来的字符
    • 4、中断回调
  • 四、 proteus仿真与虚拟串口调试
    • 1、工具软件准备
      • 1、串口映射工具
      • 2、串口调试工具
    • 2、仿真电路调试
    • 1、数值匹配
    • 2、串口调试
      • 1、设置虚拟串口
      • 2、串口调试


前言

本次通过CubeMx+proteus进行stm32串口仿真

具体功能:

1、开机后,向串口1发送“Welcome”
2、串口1接收字节指令“0xa1",打开LED1,回传“LED1 OPEN!”
3、串口1接收字节指令“0xa2",关闭LED1,回传“LED1 Close!”
4、在串口发送过程中,打开LED2作为发送数据指示灯

一、相关知识点

STM32学习:串口通讯(proteus仿真)_第1张图片

二、电路搭建与硬件配置

1、proteus电路搭建

1、COMPIM元件

作用:把仿真电路中的数字量映射到计算机的物理端口
接法:将stm32的TX与COMPIM的TX相连,RX与RX相连,而不是像实物那样交叉相连(RX连TX,TX连RX)。STM32学习:串口通讯(proteus仿真)_第2张图片

2、VIRTUAL TERMINAL虚拟终端元件

作用:查看发送的数据信息
接法:将stm32的TX与虚拟终端的RX相连,RX与TX相连
STM32学习:串口通讯(proteus仿真)_第3张图片

3、整体电路:

STM32学习:串口通讯(proteus仿真)_第4张图片

2、CubeMx硬件电路配置

请添加图片描述STM32学习:串口通讯(proteus仿真)_第5张图片STM32学习:串口通讯(proteus仿真)_第6张图片STM32学习:串口通讯(proteus仿真)_第7张图片

三、串口通讯函数与程序编写

1、串口通讯函数

1、阻塞式发送函数

注意:要等待数据发完才能做其他任务(10000为超时等待10000ms后结束发送)
请添加图片描述

2、非阻塞式发送函数

注意:在阻塞式发送的基础上可以中断(Interrupt)
STM32学习:串口通讯(proteus仿真)_第8张图片STM32学习:串口通讯(proteus仿真)_第9张图片

3、阻塞式接收函数

要等待数据接收完才能做其他任务,所以不推荐
STM32学习:串口通讯(proteus仿真)_第10张图片

4、非阻塞式接受

STM32学习:串口通讯(proteus仿真)_第11张图片

5、串口发送完毕中断回调函数

请添加图片描述

2、程序编写

1、宏定义与数据变量设定

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

#define LED1_ON() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET);
#define LED1_OFF() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET);
#define LED2_ON() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
#define LED2_OFF() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);

uint8_t Tx_strl[] = "Hello World!\r\n";
uint8_t Tx_str2[] = "LED1_Open!\r\n";
uint8_t Tx_str3[] = "LED1_Close!\r\n";
uint8_t Rx_data = 0;

2、开机串口发送hello world!(main函数)

  /* USER CODE BEGIN 2 */
  LED2_ON();//led2亮作为数据传输指示灯
  HAL_UART_Transmit(&huart1,Tx_strl,sizeof(Tx_strl),1000);//阻塞式发送函数
  LED2_OFF();//led2灭作为数据传输指示灯

3、等待接受串口发来的字符

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	//HAL_UART_Receive_IT(&huart1,&Rx_dat,3);//等待接收字符
	HAL_UART_Receive_IT(&huart1,&Rx_data,1);  
  }

4、中断回调

HAL_UART_Receive_IT()函数执行之后,则进入中断,调用中断回调函数HAL_UART_RxCpltCallback()。
回调函数,根据接收的字符执行对应的操作,执行完相关操作。

//回调函数

void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART1);
	{
		if(Rx_data == 0x4f)
		{
			LED1_ON();
			
			LED2_ON();//led2亮作为数据传输指示灯
			HAL_UART_Transmit(&huart1,Tx_str2,sizeof(Tx_str2),1000);//阻塞式发送函数
			HAL_UART_Receive_IT(&huart1,&Rx_data,1);
			LED2_OFF();//led2灭作为数据传输指示灯
		}
		else if(Rx_data == 0x43)
		{
			LED1_OFF();
			
			LED2_ON();//led2亮作为数据传输指示灯
			HAL_UART_Transmit(&huart1,Tx_str3,sizeof(Tx_str3),1000);//阻塞式发送函数
			LED2_OFF();//led2灭作为数据传输指示灯
			HAL_UART_Receive_IT(&huart1,&Rx_data,1);
		}
	}
}

到此程序编写完毕

四、 proteus仿真与虚拟串口调试

1、工具软件准备

VSPD:虚拟串口软件
XCOM:串口调试工具
上述两个软件安装一路 next 即可。
百度云链接:
链接:https://pan.baidu.com/s/1CC5M5msN-RM-cUCdCMEUiQ?pwd=dfb3
提取码:dfb3

1、串口映射工具

创建虚拟串口。vspd是以串口对形式添加的,比如COM1,COM2成对,那么COM1的数据就只能发到COM2,COM2会自动接收COM1发送的数据。

使用方法:创建串口直接点击Add pair即可
STM32学习:串口通讯(proteus仿真)_第12张图片

2、串口调试工具

选择创建的虚拟串口之后,波特率与停止位的数值需要和程序中编写的一致
STM32学习:串口通讯(proteus仿真)_第13张图片

2、仿真电路调试

STM32学习:串口通讯(proteus仿真)_第14张图片

1、数值匹配

STM32学习:串口通讯(proteus仿真)_第15张图片
虚拟终端:
STM32学习:串口通讯(proteus仿真)_第16张图片STM32学习:串口通讯(proteus仿真)_第17张图片

2、串口调试

1、设置虚拟串口

STM32学习:串口通讯(proteus仿真)_第18张图片

2、串口调试

整体流程:
1.选择对应的虚拟串口
2.根据前面的代码设置对应波特率以及数据停止位
3.打开对应串口
4.开启proteus仿真

配置串口调试助手:STM32学习:串口通讯(proteus仿真)_第19张图片
打开proteus仿真,串口数据发送到串口调试助手
STM32学习:串口通讯(proteus仿真)_第20张图片

你可能感兴趣的:(学习笔记,stm32,stm32,单片机,学习)