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.mzph.cn/news/792655.shtml

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

相关文章

无问芯穹 MaaS AI 平台公测免费试用笔记:二

上一篇笔记中,聊过了无问芯穹的 MaaS 服务中的“虚拟机”产品。本篇文章来聊聊最近宣传中提到的大手笔免费百亿 Token 用量的“大模型服务平台” 吧。 分享下这个支持异构芯片推理的国产 “Replicate”、模型市场服务使用的经验和小技巧。 写在前面 本篇文章根据…

004 CSS介绍2

文章目录 css最常用属性link元素进制css颜色表示浏览器的渲染流程(不含js) css最常用属性 font-size 文字大小 color:前景色(文字颜色) background-color:背景色 width:宽度 height:高度 link元素 也可以用来创建站点图标 link元素常见属性 href:指定被链接资源的URL rel:指…

AcWing-游戏

1388. 游戏 - AcWing题库 所需知识:博弈论,区间dp 由于双方都采取最优的策略来取数字,所以结果为确定的,有可能会有多个不同的过程,但是我们只需要关注最终结果就行了。 方法一: 定义dp[i][j] 表示区间…

【Linux】-进程知识铺垫①计算机硬件的组织:冯诺依曼体系结构详细解读②关于操作系统对软硬件及用户的意义

目录 ​编辑 1.关于计算机的体系结构 1.1 冯诺依曼体系结构的诞生 2.冯诺依曼体系结构 2.1 cpu:运算器:更多的是让cpu具有特殊的数据计算功能: 2.2 控制器 2.3输入设备 2.4输出设备 3.计算机各个硬件设备之间的关系 4.内存与计算机效率 5.关于为什么总说…

从A项目跳转到B项目,Vue两个不同项目之间实现跳转

最近遇到一个需求,就是有两个不同的项目,姑且叫项目A与项目B吧,前端技术栈都是Vue,现在登录成功A项目后希望点击A项目里某个按钮可以跳转到B项目里的某个页面,然后点击B项目里某个按钮可以跳回到A项目里的某个页面。 实现思路是:当用户点击A项目的跳转按钮时,通过window…

springboot和redis与jwt实现jwt的token双重拦截

添加自定义拦截器 package com.juejiu.config;import com.juejiu.utils.TokenGenerate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; imp…

安装Docker(CentOS)

Docker 分为 CE 和 EE 两大版本。CE 即社区版(免费,支持周期 7 个月),EE 即企业版,强调安全,付费使用,支持周期 24 个月。 Docker CE 分为 stable test 和 nightly 三个更新频道。 官方网站上…

PyCharm配置Python环境

在PyCharm中配置Python环境是一个相对简单的过程。下面是一步一步的指导,帮助你设置PyCharm以使用特定的Python解释器: 步骤 1: 打开PyCharm设置 打开PyCharm。点击菜单栏中的 File,然后选择 Settings(Windows和Linux&#xff0…

Free MyBatis Tool插件的进阶使用指南(消灭dao层的繁琐编码)

目录 零、起因一、怎么使用Free MyBatis Tool插件?1 基本使用2 进阶使用(搞清楚Options的用法)2.1 概览2.2 详述2.2.0 Options(一项都不勾选)2.2.1 Use-Lombok【消除UserDO中的getter和setter代码】2.2.2 Comment&…

计算并输出1~100之间的所有带正负号交替的 2^n / n! 序列之和

#include <stdio.h> int main(){int sign1; // 记录当前项的符号&#xff0c;正负交替int n; // 循环变量&#xff0c;用于遍历1到100double sum0.0; // 记录总和 // 外层循环&#xff0c;遍历n从1到100 for(n1;n<100;n){ double nr1.0; // 记录当前项的分…

机电一体化系统设计学习笔记——检测传感技术

一、检测传感技术 1. 传感器的定义 传感器是一种用来感知、检测、测量并将环境中的物理量、化学量或生物量转换为可供人们识别或处理的电信号或其他形式的信号的器件或装置。 2.传感器的功能 感知与检测&#xff1a;传感器可以感知环境中的各种物理量、化学量或生物量&…

ChatGPT 在做什么,为什么有效?

原文&#xff1a;What Is ChatGPT Doing … and Why Does It Work? 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 序言 这本简短的书试图从第一原理解释 ChatGPT 是如何工作的。在某种程度上&#xff0c;这是关于技术的故事。但它也是关于科学的故事。以及关于哲学…

【软件架构学习】一、基本概念

【软件架构学习】一、基本概念 &#xff08;一&#xff09;系统与子系统&#xff08;二&#xff09;模块与组件*&#xff08;三&#xff09;框架与架构* &#xff08;一&#xff09;系统与子系统 系统 &#xff1a;泛指一群有关联的个体组成&#xff0c;根据某种规则运作&…

item_search-按关键字搜索淘宝商品:如何通过获取以下关键字、搜索类型、排序方式参数提升用户体验、优化营销策略、提高转化率

在淘宝购物的过程中&#xff0c;搜索功能无疑是用户与商品之间的重要桥梁。通过输入关键字&#xff0c;用户可以迅速找到所需的商品&#xff0c;而搜索结果的准确性和相关性则直接关系到用户的购物体验和满意度。因此&#xff0c;如何通过优化关键字、搜索类型和排序方式参数&a…

应急响应实战笔记04Windows实战篇(5)

第5篇&#xff1a;挖矿病毒&#xff08;一&#xff09; 0x00 前言 ​ 随着虚拟货币的疯狂炒作&#xff0c;挖矿病毒已经成为不法分子利用最为频繁的攻击方式之一。病毒传播者可以利用个人电脑或服务器进行挖矿&#xff0c;具体现象为电脑CPU占用率高&#xff0c;C盘可使用空间…

【最大正方形】

题目描述 在一个 n m n\times m nm 的只包含 0 0 0 和 1 1 1 的矩阵里找出一个不包含 0 0 0 的最大正方形&#xff0c;输出边长。 输入格式 输入文件第一行为两个整数 n , m ( 1 ≤ n , m ≤ 100 ) n,m(1\leq n,m\leq 100) n,m(1≤n,m≤100)&#xff0c;接下来 n n n…

解锁行业潜力:国内十大低代码平台全面盘点

在数字化转型的浪潮中&#xff0c;低代码开发平台以其快速开发、简化流程和降低技术门槛的优势&#xff0c;成为企业信息化建设的重要推手。 本篇文章将为您盘点十个低代码平台有&#xff1a;Zoho Creator、明道云、腾讯云低代码平台、华为云Astro、金蝶云苍穹、用友YonBuilder…

【ARM 嵌入式 C 文件操作系列 20.1 -- 从 A文件的 n 行开始 拷贝 m行到 B文件中】

请阅读【嵌入式开发学习必备专栏 】 文章目录 文件行拷贝根据行数大小设定拷贝方法拷贝每行固定字符个数的方式 文件行拷贝 从文件 a 中从第 n 行开始拷贝 m 行到文件 b 的函数&#xff0c;将需要使用标准库函数来读取和写入文件。以下是一个 file_copy_lines 函数实现&#x…

DO、DTO、BO、VO、PO、DAO、POJO

目录 一、DO、DTO、BO、VO、PO、DAO、POJO的概念 二、DO、DTO、BO、VO具体如何使用&#xff1f;代码详细说明 三、有没有其他类似的概念&#xff0c;比如POJO&#xff08;Plain Old Java Object&#xff09;&#xff1f;它们有什么区别&#xff1f; 四、在实际项目中&#…

[lesson05]引用的本质分析

引用的本质分析 引用的意义 引用作为变量别名而存在&#xff0c;因此在一些场合可以代替指针 引用相对于指针来说具有更好的可读性和实用性 注意&#xff1a; 函数中的引用形参不需要进行初始化&#xff01;&#xff01; 特殊的引用 const引用 在C中可以声明const引用 cons…