IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> VSPD+XCOM+Proteus仿真stm32串口通信 -> 正文阅读

[嵌入式]VSPD+XCOM+Proteus仿真stm32串口通信

本文说明

功能要求

  1. 开机后,向串口1发送“Welcome”
  2. 串口1接收字节指令“0xA1",打开LED1,回传“LED1 ON”
  3. 串口1接收字节指令“0xA2",关闭LED1,回传“LED1 OFF”
  4. 在串口发送过程中,打开LED2作为发送数据指示灯

相关软件使用说明
STM32CubeMX+Keil+Proteus相关的安装、使用、配置等基础操作不再赘述,有关内容的详细介绍如下
STM32CubeMX+Keil5+Proteus实现按键控制LED灯(入门篇).

串行接口相关知识点

  1. 通信方式:串行通信和并行通信
  2. 模式:单工、半双工、全双工(任意时刻是否能同时发送和接收数据)
  3. 异步串行通信:通信双方在没有同步时钟的前提下,将一个字符按位进行传输的通信方式
  4. 串口转USB接口:CH340、CP2012
  5. STM32芯片的串口USART功能十分强大,大多时候采用异步串行通信
    USART1_TX与PA9复用, USART1_RX与PA10复用
    USART2_TX与PA2复用, USART2_RX与PA3复用

HAL库中串口发送的重要函数

阻塞式发送函数(要等待数据发完才能做其他任务)
HAL_UART_Transmit()

非阻塞式发送函数
HAL_UART_Transmit_IT()
看函数名,多了个_IT, 即在阻塞式发送的基础上可以中断(Interrupt)

串口发送完毕中断回调函数
void HAL_UART_TxCpltCallback()

举例说明串口发送函数的作用

假如我们使用非阻塞式的串口发送函数,将发送数组dat_Txd中的前5个数据发送到USART1,在发送完数据后,翻转PB9引脚的输出电平

HAL_UART_Transmit_IT(&huart1,dat_Txd,5);
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART1) //判断发送数据的串口
	{
		HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);
	}
}

如果是使用阻塞式发送函数,则代码变为如下内容

HAL_UART_Transmit(&huart1,dat_Txd,5,10000);  //超时等待10000ms
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);

HAL库中串口接收的重要函数

阻塞式接收函数(要等待数据接收完才能做其他任务,所以不推荐)
HAL_UART_Transmit()

非阻塞式接收函数(推荐使用)
HAL_UART_Transmit_IT()

串口发送完毕中断回调函数
void HAL_UART_RxCpltCallback()

举例说明串口接收函数的作用

假如使用非阻塞式的串口发送函数,接收USART1中的一个字节,将其保存在dat_Rxd,在发送完数据后,若该字节位0x5A,则翻转PB9引脚的输出电平

HAL_UART_Transmit_IT(&huart1,dat_Rxd,1);
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART1) //判断发送数据的串口
	{
		if(dat_Rxd == 0x5A)
			HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);
	}
}

STM32CubeMX配置USART

Mode选择Asynchronous(异步的)
Baud Rate(波特率)选择9600Bits/s
然后使能一下NVIC,勾选USART1 interrupt Enabled即可

在这里插入图片描述
其他的配置内容不再赘述,详情可查看本文开头写的本文说明一章
然后生成代码即可

Keil编写代码逻辑

首先定义一些变量

#define LED1_ON  HAL_GPIO_WritePin(GPIOA,LED1_Pin,GPIO_PIN_RESET); 
#define LED1_OFF HAL_GPIO_WritePin(GPIOA,LED1_Pin,GPIO_PIN_SET); 
#define LED2_ON  HAL_GPIO_WritePin(GPIOA,LED2_Pin,GPIO_PIN_RESET); 
#define LED2_OFF HAL_GPIO_WritePin(GPIOA,LED2_Pin,GPIO_PIN_SET); 

uint8_t Tx_str1[]= "Welcome!\r\n";
uint8_t Tx_str2[]= "LED1 ON!\r\n";
uint8_t Tx_str3[]= "LED1 OFF!\r\n";
uint8_t Tx_str4[]= "Command Not Found!\r\n";
uint8_t Rx_dat = 0; //接收字符变量

然后在主函数内实现开机发送Welcome

  /* USER CODE BEGIN 2 */
	LED2_ON;         																						//发送指示灯LED2亮
	HAL_UART_Transmit(&huart1,Tx_str1,sizeof(Tx_str1),1000);    //阻塞式发送函数
	LED2_OFF;         																					//发送结束时,指示灯LED2灭
	HAL_UART_Receive_IT(&huart1,&Rx_dat,1);                     //等待接收字符
  /* USER CODE END 2 */

发送函数执行结束后,要等待串口发来的字符
而每当HAL_UART_Receive_IT()函数执行之后,则进入中断,进入回调函数HAL_UART_RxCpltCallback()

因此我们需要编辑我们的回调函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART1)
	{		
		switch(Rx_dat)
		{
			case 0x4f:
				LED1_ON;
				LED2_ON;         																						//发送指示灯LED2亮
				HAL_UART_Transmit(&huart1,Tx_str2,sizeof(Tx_str2),1000);   //阻塞式发送函数
				LED2_OFF;         																					//发送结束时,指示灯LED2灭
			break;
			
			case 0x43:
				LED1_OFF;
				LED2_ON;         																						//发送指示灯LED2亮
				HAL_UART_Transmit(&huart1,Tx_str3,sizeof(Tx_str3),1000);   //阻塞式发送函数
				LED2_OFF;         																					//发送结束时,指示灯LED2灭				
			break;
			
			default:
				LED2_ON;         																						//发送指示灯LED2亮
				HAL_UART_Transmit(&huart1,Tx_str4,sizeof(Tx_str4),1000);   //阻塞式发送函数
				LED2_OFF;                                                   //发送结束时,指示灯LED2灭			
			break;
		}	
		HAL_UART_Receive_IT(&huart1,&Rx_dat,1);                     //等待接收字符
	}
}

简单解释一下程序,进行回调函数,根据接收的字符执行对应的操作
执行完相关操作,跳出switch case继续等待接收串口发来的字符

编译运行生成hex文件,准备仿真

Proteus仿真

原理图如下

在这里插入图片描述
第一次仿真串口,查了查,需要在元件库里找名为COMPIM的元件

COMPIM是Proteus中一个极其有用的虚拟元件,COMPIM可以建立起一种映射,把仿真电路中的数字量映射到计算机的物理端口

找到这个元件,拖进原理图,编辑一些属性,如图
其中Physical Port(物理端口)就是我们要在计算机中建立的映射物理端口
波特率都设置成9600

在这里插入图片描述
除了虚拟串口,我们还需要一个虚拟终端来查看发送的数据信息
点击左侧长得像电流表的图标,找到VIRTUAL TERMIN(虚拟终端),放进原理图
在这里插入图片描述

第一次见比较陌生,介绍一下这个虚拟终端
这个虚拟终端有四个引脚,分别是
RXD 一 数据接收引脚
TXD 一 数据发送引脚
RTS 一 请求发送信号
CTS 一 清除传送,是对RTS的响应信号

左键这个虚拟终端,出现了一堆参数,如图

在这里插入图片描述
Baud Rate 一 传输波特率
Data Bits 一 数据传输位数
Parity 一 奇偶校验位
Stop Bits 一 数据传输的停止位
Send XON / XOFF 发送允许/禁止

这些好像哪里见过,找到usart.c文件的UART_Init函数中,发现完全一致
这也就是我们为什么要设置波特率为9600

在这里插入图片描述
一开始一脸茫然,不知道怎么将芯片的MCU和这两个元件连线
后来查了查才知道STM32芯片给了专门的TX引脚PA9和RX引脚PA10

那我们就把芯片的TX引脚和COMPIM的TXD相连,芯片的RX引脚和COMPIM的RXD相连,再将COMPIM的RXD与VIRTUAL TERMIN的RXD相连即可。详情可看上方的原理图

老规矩导入Hex文件,设置主频72MHz

虚拟串口VSPD

VSPD官方地址: https://www.eltima.com/products/vspdxp/
试用15天,使用方法官网里也有写

我自己用的是老版本的(反正能用就行,学习使用)
百度网盘链接: https://pan.baidu.com/s/1yeD-ydJwI6ZnEops64iEbA
提取码:o889

在这里插入图片描述
打开软件,创建COM3和COM4两个虚拟端口即可
两个串口已经可以正常通信了

串口调试工具XCOM

我用的是XCOM2.6版本的
百度网盘链接: https://pan.baidu.com/s/162fd9CoiddZdTguCPth1vQ
提取码:xaw1

由于软件是正点原子的
所以你也可以去正点原子的论坛里下载最近发布的版本来使用

打开串口调试工具XCOM,选择串口COM4->COM3,打开串口
(刚才在Proteus里设置COMPIM的串口是COM3)

在这里插入图片描述
开始测试串口通信
开机发送Welcome,正确
发送字符O,回传LED1 ON,LED1亮,正确

在这里插入图片描述
发送字符C,回传LED1 OFF,LED1灭,正确

在这里插入图片描述
发送字符Z,回传Command Not Found,正确

在这里插入图片描述

存在的问题(待解决)

连续输入两个字符,没有任何问题
从第三个字符输入开始,回传的信息都是LED1 OFF
如图,依次发送O C Z O C,回传的信息是错误的

在这里插入图片描述
应该是程序的问题,具体来说是HAL_UART_Receive_IT()函数执行之后,则进入中断,然后进入回调函数HAL_UART_RxCpltCallback()

这之间可能出现了程序的死锁?
花了很长时间改程序,调试串口也没能解决,先贴在这儿吧

其实就是想等待大佬救一下23333

总结

  1. 主要学习了使用VSPD配置虚拟串口和XCOM串口调试工具
  2. 熟悉使用Proteus里COMPIM串口元件和虚拟终端
  3. 学习了串口通信的相关原理和主要函数的运行过程
  4. 学习使用STM32CubeMX配置USART
  5. 用一个具体项目来实现串口通信

我是爱学习的诸葛铁锤,觉得有用的话点个赞哈,啾咪

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-25 11:50:39  更:2021-07-25 11:50:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:31:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码