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

文章目录

  • 一、功能需求分析
  • 二、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.rhkb.cn/news/297346.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flink运行机制相关概念介绍

Flink运行机制相关概念介绍 1. 流式计算和批处理2. 流式计算的状态与容错3. Flink简介及其在业务系统中的位置4. Flink模型5. Flink的架构6. Flink的重要概念7. Flink的状态、状态分区、状态缩放(rescale)和Key Group8. Flink数据交换9. 时间语义10. 水位…

sky06笔记下

1.边沿检测 检测输入信号din的上升沿&#xff0c;并输出pulse module edge_check ( clk, rstn, din, pulse ); input wire clk,rstn; input wire din; output reg pulse;wire din_dly;always (posedge clk or negedge rstn)beginif(!rstn)din_dly < 1b0;elsedin_dly < d…

【Qt】:常用控件(四:显示类控件)

常用控件 一.Lable二.LCD Number 一.Lable QLabel 可以⽤来显⽰⽂本和图⽚. 代码⽰例:显⽰不同格式的⽂本 代码⽰例:显⽰图⽚ 此时,如果拖动窗⼝⼤⼩,可以看到图⽚并不会随着窗⼝⼤⼩的改变⽽同步变化 为了解决这个问题,可以在Widget中重写resizeEvent函数。当用户把窗口从A拖…

【Android、 kotlin】kotlin学习笔记

基本语法 fun main(){val a2var b "Hello"println("$ (a - 1} $b Kotlin!")} Variables 只赋值一次用val read-only variables with val 赋值多次用var mutable variables with var Standard output printin() and print() functions String templ…

【JavaScript】函数 ⑦ ( 函数定义方法 | 命名函数 | 函数表达式 )

文章目录 一、函数定义方法1、命名函数2、函数表达式3、函数表达式示例 一、函数定义方法 1、命名函数 定义函数的标准方式 就是 命名函数 , 也就是之前讲过的 声明函数 ; 函数 声明后 , 才能被调用 ; 声明函数的语法如下 : function functionName(parameters) { // 函数体 …

SpringBoot整合ELK8.1.x实现日志中心教程

目录 背景 环境准备 环境安装 1.JDK安装 2.安装Elasticsearch 3.安装zookeeper 4.安装Kafka 5.安装logstash 6.安装file beat 解决方案场景 1.日志采集 1.1 应用日志配置 1.1.1 创建logback-spring.xml文件 1.1.2 创建LoggerFactory 1.1.3 trace日志的记录用法 …

flutter官方案例context_menus【搭建与效果查看】【省时】

案例地址 https://github.com/flutter/samples/tree/main/context_menus 1&#xff1a;运行查看有什么可以快捷使用的&#xff0c;更新了些什么&#xff0c;可不可以直接复制粘贴 主要内容&#xff1a;在web端中模拟手机类型的点击长按操作&#xff0c;不能直接运行在安卓与io…

解决VScode中matplotlib图像中文显示问题

一、更改配置文件 参考这个文件路径找到自己Python环境下的matplotlibrc文件并用记事本打开。 用ctrl F寻找下面的这两行并将前面的#删除&#xff0c;保存并退出。 font.family: sans-serif font.serif: DejaVu Serif, Bitstream Vera Serif, Computer Modern Roman, N…

基于springboot实现校园资料分享平台系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现校园资料分享平台演示 摘要 随着信息互联网购物的飞速发展&#xff0c;国内放开了自媒体的政策&#xff0c;一般企业都开始开发属于自己内容分发平台的网站。本文介绍了校园资料分享平台的开发全过程。通过分析企业对于校园资料分享平台的需求&#xff0c;创…

WPF中通过自定义Panel实现控件拖动

背景 看到趋时软件的公众号文章&#xff08;WPF自定义Panel&#xff1a;让拖拽变得更简单&#xff09;&#xff0c;发现可以不通过Drag的方法来实现ListBox控件的拖动&#xff0c;而是通过对控件的坐标相加减去实现控件的位移等判断&#xff0c;因此根据文章里面的代码,边理解边…

跳跃游戏-java

题目描述: 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 解题思想: …

Android 性能优化之黑科技开道(一)

1. 缘起 在开发电视版智家 App9.0 项目的时候&#xff0c;发现了一个性能问题。电视系统原本剩余的可用资源就少&#xff0c;而随着 9.0 功能的进一步增多&#xff0c;特别是门铃、门锁、多路视频同屏监控后等功能的增加&#xff0c;开始出现了卡顿情况。 经过调研分析发现有…

【蓝桥杯嵌入式】RTC——实时时钟

一、RTC简介 RTC RTC—real time clock&#xff0c;实时时钟&#xff0c;主要包含日历、闹钟和自动唤醒这三部分的功能&#xff0c;其中的日历功能我们使用的最多。日历包含两个32bit的时间寄存器&#xff0c;可直接输出时分秒&#xff0c;星期、月、日、年。 从Cubemx里的配置…

HTTPS传输过程

HTTPS&#xff1a;超文本传输安全协议 相较于HTTP明文传输&#xff0c;HTTPS增加了SSL/TLS进行了加密增加了通信的安全性。 SSL和TLS是两个不同的加密方法&#xff0c;SSL是TLS的前身&#xff0c;现在绝大多数浏览器使用的是TLS&#xff0c;所以着重了解以下TLS的概念即可。 首…

接口测试之测试原则、测试用例、测试流程......

一、接口的介绍 软件测试中&#xff0c;常说的接口有两种&#xff1a;图形用户接口&#xff08;GUI&#xff0c;人与程序的接口&#xff09;、应用程序编程接口&#xff08;API&#xff09;。 接口&#xff08;API&#xff09;是系统与系统之间&#xff0c;模块与模块之间或者…

Open3D(C++) 法向量精细化处理

目录 一、算法原理1、原理概述2、参考文献二、代码实现三、结果展示1、平滑前1、平滑后本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。

在集群中使用deepspeed如果端口被占用可以使用deepspeed参数更改

在集群中使用deepspeed如果端口被占用可以使用deepspeed参数更改 这一次G老师不好使了 在集群中使用deepspeed默认的端口号29500被占用&#xff0c;显示更改居然不起作用 G老师给的方法也不好使 #!/bin/bash MASTER_ADDRlocalhost MASTER_PORT29501 # 选择一个未被占用的端…

C++ 11是如何封装Thread库的?

引言 C11 标准引入了一个重要的特性&#xff0c;即原生线程支持&#xff0c;这标志着C语言在并发编程领域迈出了坚实的步伐。在此之前&#xff0c;开发人员在进行跨平台的多线程编程时&#xff0c;不得不依赖于操作系统提供的特定API&#xff0c;如Windows API或POSIX Threads…

接口调用成功后端却一直返回404

vuespringboot 我在vue.config.js中配置了向后端的反向代理 然后使用了axios向后端发送post请求 可以看到可以接收到前端传来的值 但是前端控制台却报了 “xhr.js:245POST http://localhost:7777/api/login 404 (Not Found)” 最后询问我那智慧的堂哥... ... 解决办法是把C…

《QT实用小工具·五》串口助手

1、概述 源码放在文章末尾 该项目实现了串口助手的功能&#xff0c;可在界面上通过串口配置和网络配置进行串口调试。 基本功能 支持16进制数据发送与接收。支持windows下COM9以上的串口通信。实时显示收发数据字节大小以及串口状态。支持任意qt版本&#xff0c;亲测4.7.0 到…