STM32CubeMX HAL库 串口的使用

1.配置

2.开启中断后,生成代码 

3.串口的接收

1).开启空闲中断接收

__HAL_UART_ENABLE_IT(huart, UART_IT_IDLE); // 关键步骤:启用空闲中断

2). 启动接收

调用 HAL_UARTEx_ReceiveToIdle_IT 启动异步接收,可以使用连个数组交替接收

#define RX_BUFFER_SIZE 256
uint8_t rx_buffer[RX_BUFFER_SIZE];// 在 main() 或某个初始化函数中启动接收
HAL_UARTEx_ReceiveToIdle_IT(&huart1, rx_buffer, RX_BUFFER_SIZE);

3).实现接收回调

当以下事件发生时,会触发 HAL_UARTEx_RxEventCallback 回调函数:

  • 接收到指定长度(RX_BUFFER_SIZE)的数据;
  • 检测到空闲(IDLE)状态。

在回调函数中处理接收到的数据

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) {if (huart == &huart1) {// Size 是实际接收到的数据长度(可能小于 RX_BUFFER_SIZE)if (Size > 0) {// 处理数据(例如解析、转发等)process_received_data(rx_buffer, Size);}// 重新启动接收,以持续监听数据HAL_UARTEx_ReceiveToIdle_IT(&huart1, rx_buffer, RX_BUFFER_SIZE);}
}

接收注意事项‌

  1. 缓冲区大小‌:设置的 RX_BUFFER_SIZE 应足够大以容纳最大预期数据包,否则可能溢出。
  2. 及时重启接收‌:在回调函数中务必重新调用 HAL_UARTEx_ReceiveToIdle_IT,否则后续数据无法接收。 ‌
  3. 数据竞争‌:避免在数据处理过程中修改 rx_buffer,可以使用双缓冲区(Ping-Pong Buffer)策略。 ‌
  4. 错误处理‌:检查 HAL_UARTEx_ReceiveToIdle_IT 的返回值,确保启动成功(返回 HAL_OK)。

4.串口的数据的发送 

以下是 STM32 HAL 库中 ‌UART 数据发送‌的常用方式及使用方法总结:

一、UART 数据发送的三种模式‌

根据 HAL 库设计,可通过以下三种方式实现 UART 数据发送:

轮询模式(阻塞式)‌

调用 HAL_UART_Transmit 函数,CPU 持续等待数据发送完成后再执行后续代码。
适用场景‌:简单调试、低频率小数据量传输。

// 示例代码:发送字符串 "Hello"
uint8_t data[] = "Hello";
HAL_UART_Transmit(&huart2, data, sizeof(data), 100);  // 超时时间 100ms

中断模式(非阻塞)‌

调用 HAL_UART_Transmit_IT 函数启动发送,数据通过中断异步传输,CPU 可并行处理其他任务。
适用场景‌:需提高 CPU 利用率的中等数据量传输。

// 步骤:
// 1. 启动发送
HAL_UART_Transmit_IT(&huart2, data, len);// 2. 实现发送完成回调函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {if (huart == &huart2) {// 发送完成后的处理(如启动下一次发送)}
}

DMA 模式(非阻塞)‌

调用 HAL_UART_Transmit_DMA 函数,DMA 控制器直接搬运数据至 UART 外设,完全释放 CPU。
适用场景‌:高速、大数据量传输(如音频流、图像数据)。

// CubeMX 配置:
// 1. 开启 UART DMA 发送通道
// 2. 启动发送
HAL_UART_Transmit_DMA(&huart2, data, len);

二、发送模式选择建议‌

模式    优点                            缺点                          典型应用场景


轮询    实现简单                     阻塞 CPU                 调试输出、简单指令
中断    非阻塞、                     中等效率                  频繁中断可能影响系统实时性    中速数据包传输
DMA    零 CPU 占用、高效    需配置 DMA 通道    高速大数据传输

三、关键配置步骤‌

1.CubeMX 基础配置‌

启用 UART 外设并配置波特率、数据位等参数。
中断模式‌:使能 UART 全局中断(NVIC 设置优先级)。
DMA 模式‌:添加 DMA 通道(方向为 Memory-to-Peripheral)。

2.代码实现要点‌

中断模式‌需实现 HAL_UART_TxCpltCallback 回调函数处理发送完成事件。
DMA 模式‌需确保发送缓冲区在 DMA 传输期间保持有效(避免使用栈内存)。

四、注意事项‌

  1. 错误处理‌:检查函数返回值(如 HAL_OK),并在 HAL_UART_ErrorCallback 中处理超时或硬件错误。
  2. 缓冲区管理‌:避免在发送过程中修改发送缓冲区数据(尤其在使用 DMA 时)。可使用双缓冲区交替发送以提高效率。
  3. 重新启动发送‌:在中断或 DMA 回调中需手动重启发送流程(如需连续传输)。

五、进阶优化‌

自定义协议‌:结合空闲中断(IDLE)实现不定长数据帧接收,与发送逻辑配合使用。
混合模式‌:对关键数据使用中断/DMA,非关键数据使用轮询,平衡系统负载。


通过合理选择发送模式并优化配置,可显著提升 STM32 UART 通信的效率和可靠性。

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

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

相关文章

IIS服务器URL重写配置完整教程

1.下载URL Rewrite Module 2.1 https://www.iis.net/downloads/microsoft/url-rewrite https://download.microsoft.com/download/1/2/8/128E2E22-C1B9-44A4-BE2A-5859ED1D4592/rewrite_amd64_zh-CN.msi 2.安装

vite+vue建立前端工程

​ 参考 开始 | Vite 官方中文文档 VUE教程地址 https://cn.vuejs.org/tutorial/#step-1 第一个工程 https://blog.csdn.net/qq_35221977/article/details/137171497 脚本 chcp 65001 echo 建立vite工程 set PRO_NAMEmy-vue-appif not exist %PRO_NAME% (call npm i…

负进制转换

当一个数的基数是负数时,将这个数转换为负进制数时,大体思路和正数的情况一样,但是因为基数是负数,所以计算出来的余数就有可能是负数所以,需要在余数是负数时:将余数 基数的绝对值,商 1。 代…

K8S已经成为了Ai应用运行的平台工具

AI应用与K8s的深度融合:加速云原生时代的智能运维与业务创新 摘要: 随着人工智能(AI)技术的飞速发展,Kubernetes(K8s)作为容器编排领域的领军者,正逐步成为承载AI应用的核心基础设施…

NVMe简介1

它分为两部分,这里是第一部分。 NVM Express(NVMe)是一种高性能、可扩展的接口协议,用于通过PCI express(PCIe)总线,实现主机软件与NVM设备之间的通信。目前,由于NVMe SSD相比于SATA…

微服务商城(1)开篇、服务划分

参考:https://mp.weixin.qq.com/s?__bizMzg2ODU1MTI0OA&mid2247485597&idx1&sn7e85894b7847cc50df51d66092792453&scene21#wechat_redirect 为什么选择go-zero go-zero 为我们提供了许多高并发场景下的实用工具,比如为了降低接口耗时…

《隐私计算:数据安全与隐私保护的新希望》

一、引言 在数字化时代,数据已成为企业和组织的核心资产。然而,数据的收集、存储和使用过程中面临着诸多隐私和安全挑战。隐私计算作为一种新兴技术,旨在解决数据隐私保护和数据共享之间的矛盾。本文将深入探讨隐私计算的基本概念、技术原理、…

MySQL 学习(九)bin log 与 redo log 的区别有哪些,为什么快速恢复使用 redo log 而不用 bin log?

目录 一、bin log 与 redo log 的区别1)实现方式不同:2)日志内容不同:3)记录方式不同:4)使用场合不同: 二、为什么快速恢复使用 redo log 而不用 bin log? 面试题&#x…

用Array.from实现创建一个1-100的数组

一、代码实现 let arr Array.from({length: 100}, (_, i) > i 1); 二、代码分析 1、Array.from(arrayLike, mapFn) (1)arrayLike 类数组对象(如 { length: 100 })本身没有索引属性(如 0: undefined, 1: undefi…

javaScript简单版

简介 JavaScript(简称:JS)是一门跨平台、面向对象的脚本语言,是用来控制网页行为,实现页面的交互效果。 JavaScript和Java是完全不同的语言,不论是概念还是设计。但是基础语法类似。 组成: ECMAScript:规定了JS基础语法核心知…

Python刷题练习

文章目录 1.寻找相同字串2.密钥格式化3.五键键盘的输出4.单词重量5.输出指定字母在字符串的中的索引6.污染水域7.九宫格按键输入8.任务最优调度9.高效的任务规划 1.寻找相同字串 题目描述: 给你两个字符串t和p,要求从t中找到一个和p相同的连续子串,并输…

MATLAB实现振幅调制(AM调制信号)

AM调制是通信专业非常重要的一个知识点。今天我们使用MATLAB编程实现AM调制。 我们实现输入一个载波信号的频率与调制信号的频率后,再输入调幅度,得到已调信号的波形与包络信号的波形,再使用FFT算法分析出已调信号的频谱图。 源代码&#x…

JJJ:linux ida

文章目录 1.总结2.各类函数2.1 分配一个仓库2.2 销毁仓库2.3 从仓库里面分配一个整数id2.4 将上面分配的整数id从仓库里面删除2.5 在指定范围内分配一个id 1.总结 ida使用起来很简单,就是先分配一个仓库一样的实例,再从这个仓库里面分配一个独一无二的整…

FastByteArrayOutputStream和ByteArrayInputStream有什么区别

FastByteArrayOutputStream 和 ByteArrayInputStream 是两种完全不同的 Java I/O 类,它们的主要区别体现在 设计目的 和 使用场景 上。以下是详细对比: 1. 核心区别总结 特性FastByteArrayOutputStream (Spring框架)ByteArrayInputStream (JDK原生)所属…

docker-compose——安装redis

文章目录 一、编写docker-compose.yaml文件二、编写redis.conf文件三、启动docker-compose 一、编写docker-compose.yaml文件 version: 3.3 services:redis:image: redis:latestcontainer_name: redisrestart: alwaysports:- 6379:6379volumes:- ./redis/data:/data- ./redis/…

东芝推出新的SCiB模块,散热性能加倍,适用于电动公交车、电动船舶和固定应用

东京—东芝公司推出了一种新的SCiB模块,这是一种专为电动汽车、电动船舶和固定应用而设计的锂离子电池。新产品采用铝制底板,散热量约为当前模块的两倍。它将于2025年4月中旬在日本和全球上市。 锂离子电池的使用越来越多,而且越来越多样化&a…

【进程控制二】进程替换和bash解释器

【进程控制二】进程替换 1.exec系列接口2.execl系列2.1execl接口2.2execlp接口2.3execle 3.execv系列3.1execv3.2总结 4.实现一个bash解释器4.1内建命令 通过fork创建的子进程,会继承父进程的代码和数据,因此本质上还是在执行父进程的代码 进程替换可以将…

Java基础语法之数组

数组 一、认识数组 1.什么是数组 数组就是一个容器,用来存一批同种类型的数据。 举例 20, 10, 80, 60, 90 int[] arr {20, 10, 80, 60, 90};张三, 李四, 王五 String[] names {"张三", "李四", "王五"};2.为什么要使用数组 假设…

Java死锁排查:线上救火实战指南

想象一下,你正在值班,突然监控告警红成一片,用户反馈雪花般飘来:“系统卡死了!用不了了!” —— 这很可能就是Java应用遭遇了“死锁”这个大魔王。这时候,你就是救火队长,首要任务不…

006-nlohmann/json 结构转换-C++开源库108杰

绝大多数情况下,程序和外部交换的数据,都是结构化的数据。 1. 手工实现——必须掌握的基本功 在的业务类型的同一名字空间下,实现 from_json 和 to_json 两个自由函数(必要时,也可定义为类型的友元函数)&a…