HAL库开发--串口
目录
文章目录
前言
学习目标
学习内容
开发流程
串口功能配置
串口功能开启
串口中断配置
串口参数配置
查询配置结果
发送功能测试
中断接收功能测试
printf配置
DMA收发
配置
DMA发送
DMA接收(方式1)
DMA接收(方式2)
总结
前言
在嵌入式系统开发中,掌握串口通信是至关重要的一环。串口通信作为微控制器与外部设备或其他微控制器之间的主要通信方式,在各种嵌入式应用中起着重要作用。本文将介绍如何通过STM32CubeMX配置串口功能,并掌握串口发送、接收以及使用DMA进行数据传输的方法。同时,我们还将讨论如何配置printf函数,使其能够在串口上输出调试信息,以及如何处理串口接收中断。通过学习这些内容,读者将能够在嵌入式系统开发中更加灵活地应用串口通信功能。
学习目标
- 熟悉STM32CubeMX配置流程
- 掌握串口发送和接收
- 掌握串口DMA发送和DMA接收
- 掌握printf配置
学习内容
开发流程
- 配置芯片串口功能
- 编写串口代码
- 调试
串口功能配置
串口功能开启

- 在
Connectivity下选择合适的串口,这里选择USART1 - 配置模式为异步,
Asynchronous
串口中断配置

- 在
NVIC Settings下,打开串口中断。
串口参数配置

Parameter Settings中,根据情况配置串口的参数。
查询配置结果

在GPIO Setting中可以显示默认的IO引脚

右侧芯片引脚部分会显示配置的结果。
发送功能测试
/* USER CODE BEGIN WHILE */
uint8_t cnt = 0;
while (1)
{HAL_UART_Transmit(&huart1, &cnt, 1, HAL_MAX_DELAY);cnt++;HAL_Delay(1000);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */
}
通过HAL_UART_Transmit函数发送数据。
中断接收功能测试
/* USER CODE BEGIN WHILE */
HAL_UART_Receive_IT(&huart1, usart1_buffer, USART1_BUFFER_LEN);
while (1)
{/* USER CODE END WHILE *//* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
/* USER CODE BEGIN 0 */
#define USART1_BUFFER_LEN 1
uint8_t usart1_buffer[USART1_BUFFER_LEN];void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {HAL_UART_Transmit(&huart1, (const uint8_t *)usart1_buffer, USART1_BUFFER_LEN, HAL_MAX_DELAY);// 开启中断接收HAL_UART_Receive_IT(&huart1, usart1_buffer, USART1_BUFFER_LEN);
}
/* USER CODE END 0 */
接收任意个字节
触发空闲中断接收
HAL_UARTEx_ReceiveToIdle_IT(&huart1, usart_buffer, RX_BUF_LEN); // 常用
使用Idle空闲中断回调
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){usart_buffer[Size] = '\0';printf("callback2: %s\n", usart_buffer);HAL_UARTEx_ReceiveToIdle_IT(&huart1, usart_buffer, RX_BUF_LEN); // 常用
}
printf配置
#include <stdio.h>
int fputc(int ch, FILE* f) {HAL_UART_Transmit(&huart1, (uint8_t *)&ch,1, 0xFFFF);return ch;
}
注意:如果加了printf无法打印日志,记得在 options 里勾选 MicroLIB

DMA收发
配置


DMA发送
/* USER CODE BEGIN WHILE */
uint8_t cnt = 0;
while (1)
{HAL_UART_Transmit_DMA(&huart1, &cnt, 1);cnt++;HAL_Delay(1000);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */
}
DMA接收(方式1)
- 触发接收
HAL_UART_Receive_DMA(&huart1, usart_buffer, RX_BUF_LEN); // 常用!
- 接收回调函数
#define RX_BUF_LEN 12
uint8_t usart_buffer[RX_BUF_LEN + 1];void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){// 为了打印字符串usart_buffer[RX_BUF_LEN] = '\0';printf("callback1: %s\n", usart_buffer);// 再次启用中断接收(收到指定个字节才执行)HAL_UART_Receive_DMA(&huart1, usart_buffer, RX_BUF_LEN); // 常用!}
DMA接收(方式2)
通过空闲中断事件接收,即发生空闲了才进行数据处理
- 触发接收
HAL_UARTEx_ReceiveToIdle_DMA(&huart1, usart_buffer, RX_BUF_LEN); // 常用!!!
- 接收回调函数
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){// 为了打印字符串usart_buffer[Size] = '\0';printf("callback2[%d]: %s\n", Size, usart_buffer);// 再次启用接收(RX_BUF_LEN为最大接收数量)HAL_UARTEx_ReceiveToIdle_DMA(&huart1, usart_buffer, RX_BUF_LEN); // 常用!}
总结
通过本文的学习内容,读者可以熟悉STM32CubeMX的串口配置流程,掌握串口发送和接收的基本方法,并了解如何使用DMA进行串口数据传输。在串口发送功能测试中,通过HAL_UART_Transmit函数实现了简单的数据发送;在中断接收功能测试中,通过HAL_UART_Receive_IT函数实现了中断接收,并介绍了触发空闲中断接收的方法。此外,还讨论了如何配置printf函数,使其能够在串口上输出调试信息。最后,通过DMA收发部分的介绍,读者可以了解如何配置DMA进行高效的串口数据传输,包括DMA发送和DMA接收的两种方式。通过这些学习内容,读者将能够在嵌入式系统开发中灵活运用串口通信功能,为实际应用开发提供技术支持。
相关文章:
HAL库开发--串口
知不足而奋进 望远山而前行 目录 文章目录 前言 学习目标 学习内容 开发流程 串口功能配置 串口功能开启 串口中断配置 串口参数配置 查询配置结果 发送功能测试 中断接收功能测试 printf配置 DMA收发 配置 DMA发送 DMA接收(方式1) DMA接收(方式2) 总结 前言…...
Web前端设计毕业论文:深度探索与未来展望
Web前端设计毕业论文:深度探索与未来展望 在数字化时代,Web前端设计作为互联网应用的重要组成部分,其重要性和复杂性日益凸显。本论文旨在深度探索Web前端设计的关键要素、发展趋势以及面临的挑战,为未来的研究和实践提供有价值的…...
JAVA 字节运算 取低5位 获取低位第一位
1、JAVA 取低5位 什么是取低5位 在计算机中,每个数字都是以二进制形式存储的。一个二进制数字可以由多个位组成,每一位都可以是 0 或者 1。取低5位即表示只取二进制数字的最后5位(从右向左数)。 取低5位的方法 在 JAVA 中&#…...
全网首发:教你如何直接用4090玩转最新开源的stablediffusion3.0
1.stablediffusion的概述: Stable Diffusion(简称SD)近期的动态确实不多,但最新的发展无疑令人瞩目。StableCascade、Playground V2.5和Stableforge虽然带来了一些更新,但它们在SD3面前似乎略显黯然。就在昨晚&#x…...
智慧监狱技术解决方案
1. **建设背景**:介绍了智慧监狱建设的战略部署,包括司法部提出的“数字法治、智慧司法”信息化体系建设,以及智慧监狱建设的总体目标、重点任务和实施步骤。 2. **建设需求**:分析了当前监狱系统存在的问题,如子系统…...
QT——事件
一、什么是事件 在QT中,事件(Event)是指由特定对象发生的动作或状态变化,通常用于响应用户的操作。事件可以是鼠标点击、键盘输入、窗口移动等用户操作,也可以是系统发出的信号,比如定时器超时、网络数据到达等。在QT中,可以通过连接信号与槽(Signals and Slots)的方…...
【SpringBoot】Spring Boot 中高级特性详解
文章目录 1. 异步处理1.1 什么是异步处理?1.2 实现异步处理1.2.1 启用异步支持1.2.2 使用 Async 注解1.2.3 调用异步方法 2. 安全管理2.1 Spring Security 集成2.2 基础安全配置2.2.1 添加依赖2.2.2 默认配置2.2.3 自定义用户认证 3. 监控和调试3.1 Spring Boot Act…...
MQTT TCP HTTP 协议对比
目录 1. 类型与用途 2. 通信模式与特性 3. 优缺点 4. 使用场景 MQTT、TCP和HTTP在类型、用途、通信模式、特性以及使用场景等方面存在显著的区别,以下是详细的阐述: 1. 类型与用途 MQTT:MQTT是一种消息传输协议,主要适用于物…...
C++面向对象程序设计 - 函数库
C语言程序中各种功能基本上都是由函数来实现的,在C语言的发展过程中建立了功能丰富的函数库,C从C语言继承了些函数功能。如果要用函数库中的函数,就必须在程序文件中包含文件中有关的头文件,在不同的头文件中,包含了不…...
computeIfAbsent是Java 8引入的Map接口中的一个方法
computeIfAbsent是Java 8引入的Map接口中的一个方法,它提供了一种更高效且线程安全的方式来 conditionally compute or retrieve a value for a given key in a map. 当你想要为一个键计算一个值(如果该键尚不存在对应的映射关系),…...
HTML实现进度条/加载框模版
HTML加载 一、环形加载 1二、环形加载 2三、波形加载四、百分比环形五、进度条 一、环形加载 1 <div class"loader"></div>.loader {border: 16px solid #f3f3f3;border-radius: 50%;border-top: 16px solid #3498db;width: 120px;height: 120px;-webki…...
Python 3 列表
Python 3 列表 Python 3 中的列表是一种基本的数据结构,用于存储一系列有序的元素。列表是可变的,这意味着可以修改其内容。在 Python 中,列表是非常灵活和强大的,广泛用于各种编程任务。 创建列表 创建列表非常简单,只需将元素用逗号分隔,并包围在方括号 [] 内。例如…...
Type-C接口显示器:C口高效连接与无限可能 LDR
Type-C显示器C接口的未来:高效连接与无限可能 随着科技的飞速发展,我们的日常生活和工作中对于高效、便捷的连接方式的需求日益增加。在这样的背景下,Type-C接口显示器凭借其卓越的性能和广泛的兼容性,正逐渐崭露头角,…...
微服务SpringCloud ES分布式全文搜索引擎简介 下载安装及简单操作入门
Elasticsearch ES简介 分布式全文搜索引擎 我们天天在用ES 搜索的时候 要与多个信息进行匹配查找 然后返回给用户 首先 ES会将数据库中的信息 先进行一个拆分 这个叫做分词 是按照词语关键词拆的 然后就能进行搜索的时候匹配对应的id 每一个关键字对应若干id 每一个…...
护眼灯落地的好还是桌面的好?落地护眼灯性价比高的品牌推荐
护眼灯落地的好还是桌面的好?当我们为了更好地保护眼睛而选择护眼灯时,常常会面临一个纠结的问题:到底是护眼灯落地的好还是桌面的好呢?这看似是一个简单的二选一,实则背后蕴含着诸多需要深入探讨的因素。 护眼灯的选择…...
计算机网络-子网掩码的计算
计算机网络中的子网掩码计算及相关知识 在计算机网络中,子网掩码是一个非常重要的概念。它不仅帮助我们区分网络地址和主机地址,还在网络划分、管理和安全中发挥着重要作用。本文将介绍子网掩码的基本概念、计算方法及其在网络中的应用。 子网掩码的基…...
Java:111-SpringMVC的底层原理(中篇)
这里续写上一章博客(110章博客): 现在我们来学习一下高级的技术,前面的mvc知识,我们基本可以在67章博客及其后面相关的博客可以学习到,现在开始学习精髓: Spring MVC 高级技术: …...
Vue3新特性指南:探索新增指令、内置组件和改进
Vue.js是一款流行的JavaScript框架,用于构建现代Web应用。Vue3是Vue.js的最新版本,引入了许多新特性和改进。本文将介绍Vue3新增的指令、内置组件以及其他值得关注的改进,并提供使用组合式API的用法示例。 一、新增指令 v-is指令: v-is指令用于动态组件,可以根据表达式的值来…...
Qt项目天气预报(2) - 重写事件函数
鼠标右键实现退出界面 知识点QMenu: QMenu 弹出对话框 --> 相对QMessageBox 更加轻量点 QMenu是Qt库中用于创建弹出式菜单的类,它通常出现在应用程序的顶部菜单栏、按钮的右键菜单或自定义上下文菜单中。以下是关于QMenu的详细介绍: 1. 类的基本特…...
uni-app前端,社区团购系统搭建部署
目录 前言: 一、社区团购模式: 二、社区团购系统功能: 三、总结: 前言: 区团购系统是一种利用互联网技术和组织力量,通过线上线下结合的方式,为社区居民提供方便快捷的商品和服务采购平台。…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...
Mysql故障排插与环境优化
前置知识点 最上层是一些客户端和连接服务,包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念,为通过安全认证接入的客户端提供线程。同样在该层上可…...

