STM32-05基于HAL库(CubeMX+MDK+Proteus)串行通信案例(中断方式接收命令)

news2025/3/10 6:34:28

文章目录

  • 一、功能需求分析
  • 二、Proteus绘制电路原理图
  • 三、STMCubeMX 配置引脚及模式,生成代码
  • 四、MDK打开生成项目,编写HAL库的功能代码
  • 五、运行仿真程序,调试代码

一、功能需求分析

在中断机制实现按键检测的案例之后,我们介绍串行通信,而使用串行通信的方式采用中断方式实现,即在完成发送或者接收数据后,会触发串行通信的发送和接收callback函数,执行回调函数功能。
在单片机通信方式中,通常有两种,串行通信和并行通信。
串行通信即一次只发送一位数据,多次发送完成。
并行通信即一次发送多位数据,一次完成。
下面有一张关于两种通信方式的基础知识点,概括很全面,大家可以自己理解。
在这里插入图片描述需求分析:

  1. 仿真方式,实现COM1和COM2的通信,COM2发送命令,COM1执行命令并返回结果;
  2. 接线方式,COM1连接STM32,RXD和TXD并联,STM32使用第一组串口线,PA9(TXD)PA10(RXD);PA0-PA2分别连接LED1-LED3;
  3. 通信协议:
    COM2发送字符a,LED1熄灭;
    COM2发送字符b,LED1点亮;
    COM2发送字符c,LED2熄灭;
    COM2发送字符d,LED2点亮;
    COM2发送字符e,LED3熄灭;
    COM2发送字符f,LED3点亮;

使用到的工具:

工具软件功能
Proteus绘制原理图
STM32CubeMX图形化配置生成MDK项目
MDK编写下位机代码
XCOM串口调试住手
VSPD虚拟串口驱动

用到的工具比较多,这里梳理一下思路:
本案例的功能是通过串口通信实现命令下发和命令执行以及结果反馈的功能。
具体实现选择的是通过单个字符,比如‘a’命令,点亮LED1;
但是如果想实现串口通信,需要提供两个物理串口,而且是不同PC机的,同一台PC机无法实现自己的两个串口通信。
所以,这里使用到了VSPD,它可以将一台PC的两个端口虚拟连接,实现数据收发,解决了我们硬件的限制。

在这里插入图片描述

二、Proteus绘制电路原理图

绘制电路原理图的步骤:创建画布=》芯片选型及放置=》元器件选型及放置=》连接电路=》修改元器件参数=》仿真运行。

下图为所需元器件清单,其中比较重要的是COMPIM,它可以将Proteus中的虚拟元器件连接到PC机实际的串口,这个元器件是我们实现仿真串行通信的关键。
在这里插入图片描述
下图为电路原理图。
在这里插入图片描述绘制完成后,双击COMPIM配置串行通信参数,注意,这个地方配置的参数,需要我们在CubeMX中配置相同参数,而且在串口助手测试时,也是用相同参数,即8N1+115200。
在这里插入图片描述

三、STMCubeMX 配置引脚及模式,生成代码

接下来,根据原理图绘制,创建CubeMX项目,配置引脚及工作模式,生成MDK项目代码。

创建项目,在Pinout配置模块,点击PA0,选择GPIO_Output推挽输出模式,同理,配置PA1、PA2。
在这里插入图片描述配置串口引脚及参数,PA9和PA10配置成TX和RX模式,在连接选项处,配置通信模式为asynchronous异步通信模式,8N1+115200的串口通信参数。
在这里插入图片描述

在clock单元,配置系统时钟为72MHz。
在这里插入图片描述在Project单元,填写项目名称、保存路径、IDE和版本。
在这里插入图片描述

在 code generator中,配置添加库的方式为所需库,用户代码在每次项目重新生成时保留。
在这里插入图片描述
配置完成,通过以上步骤,完成了2个LED引脚的模式配置及时钟配置,接下来,点击GENERATE,生成项目代码。
在这里插入图片描述
找到生成路径,可以看到项目目录文件。
在这里插入图片描述

四、MDK打开生成项目,编写HAL库的功能代码

从上面步骤中,生成了MDK项目。
在MDK-ARM目录中,找到项目快捷方式(.uvprojx),打开项目。
在这里插入图片描述

找到main.c文件,添加两部分代码。

在此之前,查阅API手册,解释下面的函数。
HAL_UART_Transmit(&huart1, (uint8_t )pCmd, len, 0xFFFF);
函数功能为发送串口数据,里面四个参数,&huart1为串口的指针, (uint8_t )pCmd发送数据数组首地址,len数据长度,超市时间0xFFFF。
在这里插入图片描述HAL_UART_Receive_IT(&huart1, (uint8_t )&Rx_Byte, 1);
函数功能为在非阻塞状态下接收串口数据,里面三个参数,串口指针,接收数组首地址,数据大小。
在这里插入图片描述1. 用户变量声明
/
Private variables ---------------------------------------------------------
/
/
USER CODE BEGIN PV /
uint8_t Rx_Byte;
uint8_t Rx_Buff[256];
uint8_t Rx_Count;
/
USER CODE END PV */
2. 串口接收中断回调函数

/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	unsigned char *pCmd = NULL;
	int len = 0;
	
	UNUSED(huart);
	
	switch(Rx_Byte)
	{
		case 'a':
			pCmd = "command a\r\n";
		  len = strlen(pCmd);
			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
			break;
				
		case 'b':
			pCmd = "command b\r\n";
		  len = strlen(pCmd);
			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
			break;
						
		case 'c':
			pCmd = "command c\r\n";
		  len = strlen(pCmd);
			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
			break;
								
		case 'd':
			pCmd = "command d\r\n";
		  len = strlen(pCmd);
			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
			break;
										
		case 'e':
			pCmd = "command e\r\n";
		  len = strlen(pCmd);
			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
			break;
												
		case 'f':
			pCmd = "command f\r\n";
		  len = strlen(pCmd);
			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
			break;
												
		default:
			pCmd = "command cmd\r\n";
			len = strlen(pCmd);
			break;												
	}

	HAL_UART_Transmit(&huart1, (uint8_t *)pCmd, len, 0xFFFF);
	HAL_UART_Receive_IT(&huart1, (uint8_t *)&Rx_Byte, 1);
}
/* USER CODE END 4 */

在这里插入图片描述在项目中勾选生成HEX选项,HEX文件就是MDK编译生成的十六进制文件,作为烧录到开发板的源程序文件使用,当然,这里我们使用仿真,在Proteus中加载HEX即可。
在这里插入图片描述点击编译程序,生成HEX文件。在编译窗口显示生成了以下信息,则编译成功,保证 0 errors再进行下一步。
在这里插入图片描述

五、运行仿真程序,调试代码

在Proteus中,双击芯片,选择加载程序路径。
01_LED\LED-MDK\MDK-ARM\LED-MDK
上面是我的项目的HEX文件目录路径。在这里插入图片描述

测试步骤略显复杂,需要一点耐心:

  1. 使用VPSD工具COM1和COM2配对,这样就可以用XCOM和Proteus来模拟两个串口了。在这里插入图片描述2. 打开XCOM串口助手,配置串口参数,打开COM2。在这里插入图片描述3. 打开Proteus,启动仿真开始测试。
    在这里插入图片描述

可以看到,六个字符发送后,会对应控制LED状态,并返回执行信息,功能正常。

代码链接:STM32-05基于HAL库(CubeMX+MDK+Proteus)串行通信案例(中断方式接收命令)

至此,我们已经完成了STM32的串口通信案例,后面,会给大家介绍更多的功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1569652.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】复杂度(长期维护)

本篇博客主要是浅谈数据结构概念及时间复杂度,并做长期的维护更新,有需要借鉴即可。 复杂度目录 一、初识数据结构1.基础概念2.如何学好数据结构 二、复杂度1.复杂度2.时间复杂度①有限数的时间复杂度②函数的时间复杂度③二分查找时间复杂度④递归拓展练…

1.k8s架构

k8s集群架构 一个Kubernetes集群至少包含一个控制平面(control plane),以及一个或多个工作节点(worker node)。控制平面(Control Plane) : 控制平面负责管理工作节点和维护集群状态。所有任务分配都来自于控制平面。工作节点(Worker Node) : 工作节点负责执行由控制…

Selenium的简单防反爬和浏览器配置

# Selenium的简单使用:https://zhuanlan.zhihu.com/p/557463669 # 防反爬参考:https://blog.csdn.net/weixin_51368459/article/details/125462178 from selenium import webdriver from selenium.webdriver.edge.options import Options# 设置浏览器驱动…

Linux初学(十四)LampLnmp

一、简介 LAMP和LNMP是两种常见的web服务器组合。具体如下: LAMP:LAMP代表的是Linux(操作系统) Apache(HTTP服务器) MySQL(数据库) PHP(编程语言)。这个组合被…

基于Spring Boot的职称评审管理系统

基于Spring Boot的职称评审管理系统 开发语言:Java框架:springbootJDK版本:JDK1.8数据库工具:Navicat11开发软件:eclipse/myeclipse/idea 部分系统展示 前台首页界面 用户注册登录界面 管理员登录界面 个人中心界面…

【Canvas技法】图解绘制圆弧的重要函数 arc(x,y,r,startAngle,endAngle,clockWise)

【一图释疑】 【绘制上图用代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>Html5/Canvas中绘制圆弧的重要函数 arc(x,y,r,startA…

Datacom HCIP笔记-路由策略与路由控制 之一

1、流量可达性控制的2种手段 对流量下手&#xff0c;拒绝流量通过 对路由下手&#xff0c;过滤掉可达的路由信息 Filter-PolicyRIP&#xff0c;OSPF&#xff0c;ISIS&#xff0c;BGP协议都可以使用filter-policy对路由进行过滤。 对协议接收的路由进行过滤&#xff1a;filter-p…

【Qt 学习笔记】Qt 开发环境的搭建 | Qt 安装教程

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt 开发环境的搭建 | Qt 安装教程 文章编号&#xff1a;Qt 学习笔记 /…

Calico IPIP和BGP TOR的数据包走向

IPIP Mesh全网互联 文字描述 APOD eth0 10.7.75.132 -----> APOD 网关 -----> A宿主机 cali76174826315网卡 -----> Atunl0 10.7.75.128 封装 ----> Aeth0 10.120.181.20 -----> 通过网关 10.120.181.254 -----> 下一跳 BNODE eth0 10.120.179.8 解封装 --…

一个线程池的理解

最近看到一个线程池&#xff0c;写的实在太好&#xff0c;于是想深入理解一下。原始代码出处&#xff1a;GitHub - Ahajha/CTPL: Modern and efficient C Thread Pool Library 由于平时的工程一般只支持到C11,而拿到的代码应该是在C20下才能编译通过&#xff0c;因此也做了一些…

Kubernetes(K8s)技术解析

1. K8s简介 Kubernetes&#xff08;简称K8s&#xff09;是一个开源的容器编排平台&#xff0c;旨在简化容器化应用程序的部署、扩展和管理。为开发者和运维人员提供了丰富的功能和灵活的解决方案&#xff0c;帮助他们更轻松地构建、部署和管理云原生应用程序。以下是关于Kubern…

3.Swagger整合

一、引入相关依赖 <!-- 图像化依赖 --> <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version> </dependency> <!--引入swagger2依赖 --> <d…

SQL注入---盲注

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.盲注概述 注是一种SQL注入攻击的形式&#xff0c;在这种攻击中&#xff0c;攻击者向目标应用程序发送恶意注入代码&#xff0c;然后通过观察应用程序的响应来推断出数据库中的信息。与常规的…

C++中二叉搜索树的模拟实现(二叉搜索树是map,set的底层原理)

搜索二叉树 定义 搜索二叉树:左子树小于根,右子树大于根.搜索二叉树的中序序列是升序的.所以对于二叉树而言,它的左子树和右子数都是二叉搜索树 下图就是二叉搜索树 二叉搜索树的性质: 二叉搜索树的中序遍历出的数据是有序的,并且二叉树搜索树在查找某个数的时候,一般情况下…

Outlook会议邀请邮件在答复后就不见了

时常会有同事找到我说&#xff0c;Outlook答复会议邀请邮件后收件箱就找不到会议邀请的邮件了。 这其实是Outlook的的一个机制&#xff0c;会把应答后的会议邀请邮件从收件箱自动删除&#xff0c;到已删除的邮件那里就能找到。如果不想要自动删除&#xff0c;改一个设置即可。…

kafka 高吞吐设计分析

说明 本文基于 kafka 2.7 编写。author blog.jellyfishmix.com / JellyfishMIX - githubLICENSE GPL-2.0 概括 支撑 kafka 高吞吐的设计主要有以下几个方面: 网络 nio 主从 reactor 设计模式 顺序写。 零拷贝。 producer producer 开启压缩后是批量压缩&#xff0c;bro…

k8s部署微服务例子

一、部署服务 需要部署minio、nacos、mysql、consul、elasticsearch、视频解析服务、nfs、skywalking-oap及ui。 二、三个微服务程序 minio服务解析视频-》上传到minio进行存储&#xff0c;构造领域对象信息保存到hive&#xff08;hive on spark&#xff09;异步处理-》元数据…

c#程序报错引用无效解决办法之一:检查引用的文件路径

直接右键然后打开本地 打开这个.csproj文件&#xff0c;直接对着路径看看里面的路径对不对。 一般是很多人一起开发&#xff0c;然后这个文件路径被推送上来的问题

前端三剑客 —— CSS (第四节)

目录 内容回顾&#xff1a; 1.常见样式 2.特殊样式 特殊样式 过滤效果 动画效果 动画案例&#xff1a; 渐变效果 其他效果&#xff1a; 多列效果 字体图标&#xff08;icon&#xff09; 内容回顾&#xff1a; 1.常见样式 text-shadow x轴 y轴 阴影的模糊程度 阴影的…

kubectl explain资源文档命令

学习并使用了一段时间的kubernetes&#xff0c;发现对k8s还是了解甚少&#xff0c;于是利用上下班通勤的时间又去B站看一些大佬的视频&#xff0c;又来重学巩固一遍知识&#xff0c;并做些记录。 之前在学习使用过程中未成了解过explain这个命令&#xff0c;因为自己部署的版本…