【STM32 + HAL + Cubemx】【TTL USART 串口三种模式控制LED亮灭】
一、串口概述串口是STM常见的通信方式之一其是是用于异步串行通信的外设可实现设备间的数据传输如与传感器、上位机通信。在STM32中串口有很多种包括USB串口RJ-45串口TTL串口等我们今天学习的是比较常用的TTL串口而TTL串口有两种USART和UARTUSART 支持同步和异步模式UART 仅支持异步。他们均通过 TX发送和 RX接收引脚传输数据。串口通信需约定波特率、数据位、停止位和校验位等参数。关于串口的通信原理本文不作详细解释大家如有兴趣可以看这个视频【keysking的STM32教程】 第8集 STM32的串口通信_哔哩哔哩_bilibili。串口的常见用法有普通轮询模式、中断模式、DMA模式等能高效处理数据接下来将分别介绍这三种串口的用法。二、串口的普通轮询模式用法轮询按照字面意思就是“轮番询问”的意思即STM32不断“询问”串口是否空闲一旦空闲就执行发送或接收数据。我们就用串口的轮询模式实现向STM32发送数据来控制LED灯的亮灭。1.建立工程配置好STM32Cubemx标准工程的基本步骤见前面的文章然后在Connectivity一栏中找到USART1选其他串口也是可以的但是一定要注意要找STM32单片机和电脑连接的串口模式选择Asynchronous异步。在下面的设置栏中Baud Rate波特率保持默认115200 Bit/s即可。Word Length字长保持默认8Bits即可。Parity校验位保持默认“无”即可。Stop Bits停止位保持默认1位即可。综上所有设置保持默认以后遇到特殊需求再修改即可。为了点亮LED我们还需要按照之前文章提到的方法配置好对应的GPIO。给工程命名配置好项目地址后生成工程即可。2.代码编写实现发送打开生成的Keil工程在main.c中编写代码。发送串口数据的函数为HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);其中huart是UART句柄指向一个有效的UART_HandleTypeDef结构体实例pData指向要发送的数据的指针。Size表示要发送的数据长度。Timeout表示超时时间单位为毫秒。如果在该时间内未发送完所有数据函数就会返回错误。我们首先定义一个发送数据的数组类型为uint8_t。uint8_t datas[10] Hello!;然后调用串口发送函数huart1就是我们选用的串口句柄datas对应我们自定义的数据数组数据长度用sizeof函数即可等待时长可填HAL库的最大等待时间HAL_MAX_DELAY也可填100等具体的数值。HAL_UART_Transmit(huart1,datas,sizeof(datas),HAL_MAX_DELAY);运行代码连接好电脑和STM32的串口接口打开串口调试助手我这里用的是正点原子的串口调试助手大家也可以到网上搜索其他串口调试助手软件。需要将波特率数据长度停止位校验位调整为我们之前在Cubemx中的配置一样此时按下单片机的RESET键可以看到STM32不断向电脑发送我们设定的“hello!”字样。3.代码编写接收并控制LED接下来编写STM32接收电脑发送的数据并根据数据开关LED的代码。接收串口数据的函数为HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);其中的参数与之前发送函数类似。我们就用之前定义的datas数组作为接收数据的容器。HAL_UART_Receive(huart1,datas,sizeof(datas),HAL_MAX_DELAY);现在就可以实现向STM32发送数据控制LED亮灭了。我们可以规定当给STM32发送K时需要让其执行开灯这一指令当给STM32发送G时需要让其执行关灯这一指令。我们已经规定了接收数组为datas那么我们只需判断datas[0]是“K”还是“G”然后就可以按照不同情况来控制小灯的亮灭了。我们可以在while循环中写下以下功能代码HAL_UART_Receive(huart1,datas,sizeof(datas),HAL_MAX_DELAY); if(datas[0] K){ HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET); } if(datas[0] G){ HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET); } memset(datas,sizeof(datas),0); //清空避免干扰编译无问题后下载到单片机打开串口工具输入‘K’或‘G’就可以控制LED亮灭了。注由于这是轮询模式有时候会不灵可以多按几次发送就可以了三、串口的中断模式用法经过实践可以发现轮询模式总会有时候不那么“灵”,这时候就可以用中断模式让单片机从主程序中跳出到串口中断处理函数。1.建立工程中断模式和普通模式的区别是用到了专门的中断函数在配置Cubemx时打开相关功能即可。按照上图配置好后重新生成工程。2.代码编写中断收发中断发送函数为HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)。可以看到与普通模式相比中断接收函数少了等待时长这个参数这是因为中断模式下一旦接收完成就会触发接收完成回调函数不需要等待就少这个参数。中断接收函数为HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)。与发送函数类似少了等待时长这个参数。3.代码编写中断接收并控制LED类比上一章节用到的GPIO外部中断串口的中断模式也有相应的中断处理函数/** * brief Rx Transfer completed callbacks. * param huart Pointer to a UART_HandleTypeDef structure that contains * the configuration information for the specified UART module. * retval None */ __weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { /* Prevent unused argument(s) compilation warning */ UNUSED(huart); /* NOTE: This function should not be modified, when the callback is needed, the HAL_UART_RxCpltCallback could be implemented in the user file */ }同样与GPIO的中断函数类似将此函数复制到main.c某处begin-end注释对中然后编写自己需要的函数。uint8_t datas[10] ; void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(datas[0] K){ HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET); } if(datas[0] G){ HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET); } memset(datas,sizeof(datas),0); //清空避免干扰 HAL_UART_Receive_IT(huart1,datas,1); }可以看到整体代码与之前普通模式的代码类似最后一行之所以要再加一个接收函数是因为每次处理完当前串口数据后还要接收下次的数据所以还得再加一个。在主函数while循环前某处加上HAL_UART_Receive_IT(huart1,datas,1);开启串口接收中断就完整实现功能了。编译、下载验证功能可以发现与普通模式相比中断模式可以很快响应并处理我们发送的串口数据。但是有一个问题当串口数据发送过于频繁时主函数频频被中断函数打断一方面浪费CPU资源另一方面这种模式接收数据速度不够快这就可以用到DMA模式了。四、串口的DMA模式用法1.DMA配置在配置Cubemx时先取消掉之前的中断配置然后按照以下配置添加DMA按照上图分别添加USART_RX和USART_TX可以看到下方对DMA的配置界面功能已标在途中在当前应用场景保持默认即可。2.DMA模式收发函数DMA接收函数HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)DMA发送函数HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)比较方便的是DMA模式处理数据的回调函数与中断模式使用的是一样的因此只需要在Cubemx更改完配置后将原来的HAL_UART_Receive_IT(huart1,datas,1);改为HAL_UART_Receive_DMA(huart1,datas,1);即可。编译下载验证代码发现功能与中断模式实现的功能一样当然DMA的妙处在需要高速传数据时才能体现本例程这两种模式的区别并不明显。【拓展】如果想要实现接收不定长的数据可以用HAL_UARTEx_ReceiveToIdle_DMA(huart1,re,sizeof(re));这个函数要注意的是为了保证不会触发接收过半中断可以用HAL_DMA_DISABLE_IT(hdma_usart1_rx,DMA_IT_HT);把这个中断关掉。另外还要加一个extern DMA_HandleTypeDef hdma_usart1_rx;

相关新闻

Docker镜像定制实战:配置Yum源与Nginx服务部署

Docker镜像定制实战:配置Yum源与Nginx服务部署

这次我们来看一个 Docker 基础实战主题:如何定制一个简单的 Docker 镜像,并在容器内部配置 Yum 仓库,最终完成一个服务的安装与部署。这听起来像是基础操作,但很多人在实际构建时,往往会卡在“镜像构建慢”、“容器内网…

2026/7/28 10:17:00阅读更多 →
TC33x/TC32x 【QSPI 配置】

TC33x/TC32x 【QSPI 配置】

英飞凌 TC33x/TC32x 芯片 QSPI 配置详解与寄存器解析一、QSPI 模块架构与核心特性QSPI(Queued Serial Peripheral Interface)是英飞凌 AURIX™ TC333 芯片的高速同步串行通信接口,支持多设备并行通信和灵活的帧格式定义。集成 4 个独立的 QS…

2026/7/28 10:15:00阅读更多 →
s_y2printer 开源项目分析

s_y2printer 开源项目分析

s_y2printer 开源项目分析 仓库地址: https://gitee.com/smallerxuan/s_y2printer 项目定位: 面向 嵌入式热敏打印机项目的半色调(Dithering)算法库 核心功能: 将 8bit 灰度图像高效转换为 1bit 打印数据 License: MIT 目录 项目概述与核心价值系统架构…

2026/7/28 10:15:00阅读更多 →
Havenlon|AI 时代的执行安全语言体系(六十):边界独立性与边界坍塌

Havenlon|AI 时代的执行安全语言体系(六十):边界独立性与边界坍塌

Working Draft AI Era Execution Security Language This article is part of the Havenlon Execution Security Language project. The terminology and definitions presented here describe the current working draft and may evolve as the discipline matures. AI 时代执…

2026/7/28 13:00:34阅读更多 →
NAT64技术实战:IPv6与IPv4互通的关键桥梁

NAT64技术实战:IPv6与IPv4互通的关键桥梁

1. NAT64技术背景与核心价值 IPv4地址枯竭早已不是新闻,全球互联网正在向IPv6不可逆地迁移。但现实情况是,仍有大量老旧设备和服务仅支持IPv4协议栈。NAT64作为过渡期的关键桥梁技术,允许纯IPv6终端通过协议转换访问IPv4资源,这种…

2026/7/28 13:00:34阅读更多 →
API接口安全:三要素与四要素身份验证详解

API接口安全:三要素与四要素身份验证详解

前言:金融科技中的身份验证基石在金融科技领域,身份验证是保障交易安全、防范欺诈的第一道防线。随着数字化金融服务的普及,如何准确、高效地确认用户身份的真实性,成为平衡用户体验与安全风险的核心挑战。传统的静态密码验证已难…

2026/7/28 13:00:34阅读更多 →
Java炫彩界面开发:JSCM-Core双引擎实战

Java炫彩界面开发:JSCM-Core双引擎实战

1. JSCM-Core项目概述 JSCM-Core是一个基于Java平台的炫彩界面开发库,它整合了Skija和Direct2D(D2D)两种高性能图形绘制引擎。这个库的诞生源于Java原生GUI组件在视觉效果和渲染性能上的局限性。传统Swing和JavaFX虽然成熟稳定,但…

2026/7/28 13:00:34阅读更多 →
API渗透测试:五大高危接口深度解析与防御指南

API渗透测试:五大高危接口深度解析与防御指南

摘要:本文聚焦API渗透测试中的五类高风险接口——登录、数据查询、URL重定向、短信发送和注册API,系统分析其核心风险、典型攻击手法及关键防御策略。通过具体案例与防护建议,为安全测试人员和企业开发者提供实用的API安全防护框架&#xff0…

2026/7/28 13:00:34阅读更多 →
揭秘AI编程智能体架构:从代码生成到80%自主提交的工程实践

揭秘AI编程智能体架构:从代码生成到80%自主提交的工程实践

在实际软件开发项目中,代码提交与评审是决定交付质量和团队协作效率的核心环节。传统模式下,开发者需要手动编写代码、运行测试、提交变更、撰写提交信息,并等待同行评审,整个过程耗时且容易因人为疏忽引入错误。随着AI编程助手能力的演进,一种新的可能性正在浮现:让AI智…

2026/7/28 12:58:33阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/28 4:06:39阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/28 2:08:06阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/28 1:38:28阅读更多 →
告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:29阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:29阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:29阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/27 16:57:54阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/28 3:17:03阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/28 2:35:58阅读更多 →