使用最新Hal库实现USART中断收发功能(STM32F4xx)

目录

概述

1 认识STM32F4XX的USART

1.1 USART 功能说明

1.2 USART的中断

1.3 USART 模式配置

1.4 USART的寄存器

2 使用STM32CubeMX 生成工程

2.1 配置参数

2.2 生成工程代码

3 实现软件功能

3.1 软件功能介绍

3.2 认识USART Hal库

3.2.1 初始化函数组

3.2.2 发送/接收函数组

3.2.3 中断和callback函数组

4 实现串口发送和接收功能接口

4.1 发送函数

4.2 接收函数

4.3 实现printf打印功能

4.4 完整程序

5 测试

5.1 测试代码功能介绍

5.2 测试代码实现

5.3 测试发送和接收功能

5.3.1 测试发送功能

5.3.2 测试接收数据功能


源代码下载地址:stm32f4xxx-USART串口中断收发例程资源-CSDN文库

HAL 库版本:  STM32Cube_FW_F4_V1.27.1 

概述

本文主要介绍STM32F4XX 通用同步异步收发器 (USART) 的相关知识,详细介绍了USART的特征,寄存器组。还介绍如何使用STM32CubeMX配置USART的相关的参数,并生成项目文件。还使用Hal库函数实现USART1的发送和接收功能,其中接收功能使用中断来实现的。

1 认识STM32F4XX的USART

通用同步异步收发器 (USART) 能够灵活地与外部设备进行全双工数据交换,满足外部设备对工业标准 NRZ 异步串行数据格式的要求。 USART 通过小数波特率发生器提供了多种波特率。它支持同步单向通信和半双工单线通信;还支持 LIN( 局域互连网络)、智能卡协议与 IrDA(红外线数据协会) SIR ENDEC 规范,以及调制解调器操作 (CTS/RTS)。而且,它还支持多处理器通信。通过配置多个缓冲区使用 DMA 可实现高速数据通信。

1.1 USART 功能说明

接口通过三个引脚从外部连接到其它设备。任何 USART 双向通信均需要至少两个引脚:接收数据输入引脚 (RX) 和发送数据引脚输出 (TX):

RX:接收数据输入引脚就是串行数据输入引脚。过采样技术可区分有效输入数据和噪声,从而用于恢复数据。

TX: 发送数据输出引脚。如果关闭发送器,该输出引脚模式由其 I/O 端口配置决定。如果使能了发送器但没有待发送的数据,则 TX 引脚处于高电平。在单线和智能卡模式下,该 I/O用于发送和接收数据( USART 电平下,随后在 SW_RX 上接收数据)。

正常 USART 模式下,通过这些引脚以帧的形式发送和接收串行数据:

● 发送或接收前保持空闲线路

● 起始位

● 数据(字长 8 位或 9 位),最低有效位在前

● 用于指示帧传输已完成的 0.5 个、 1 个、 1.5 个、 2 个停止位

● 该接口使用小数波特率发生器 - 带 12 位尾数和 4 位小数

● 状态寄存器 (USART_SR)

● 数据寄存器 (USART_DR)

● 波特率寄存器 (USART_BRR) - 12 位尾数和 4 位小数。

● 智能卡模式下的保护时间寄存器 (USART_GTPR)

1.2 USART的中断

发送期间:发送完成、清除以发送或发送数据寄存器为空中断。 接收期间:空闲线路检测、上溢错误、接收数据寄存器不为空、奇偶校验错误、 LIN 断路检测、噪声标志(仅限多缓冲区通信)和帧错误(仅限多缓冲区通信)。

1.3 USART 模式配置

1.4 USART的寄存器

这是一张非常完美的图,介绍整个USART的工作原理,以及各个寄存器的功能。了解这张图,就会对STM32的USART模块有一个很深刻的认识。

和USART相关的寄存器的列表,具体每个寄存器表示什么意思,参考文档: STM32F40xxx、STM32F41xxx、STM32F42xxx、STM32F43xxx参考手册(中文).pdf

2 使用STM32CubeMX 生成工程

2.1 配置参数

1)选择串口工作模式

2)Parameter Settings

3)NVIC Settings

2.2 生成工程代码

选择合适的IDE和Hal库,然后点击GENERATE CODE,生成项目文件。打开工程可以看见,和硬件相关的代码STM32CubeMX 已经生成,且这些函数已经在main()函数中初始化,所以user只需编写和应用相关的代码。

3 实现软件功能

3.1 软件功能介绍

1)实现串口发送字符串功能

2)实现中断接收字符串功能

3.2 认识USART Hal库

3.2.1 初始化函数组

这部分函数会在STM32CubeMX自动生成代码时,自动调用。

3.2.2 发送/接收函数组

3.2.3 中断和callback函数组

4 实现串口发送和接收功能接口

本程序使用UART0来实现串口的发送和接收功能。

4.1 发送函数

参数介绍:

1)huart: 串口配置参数指针

2)databuff: 发送数据的存储buff

3) datalen : 发送数据的字节长度

串口配置参数指针位置:

4.2 接收函数

这部分函数在stm32f4_drv_uart.c文件中实现

接收参数采用中断方式实现,Hal库的中断程序实现和很早以前ST提供的drviver的实现方式有很大的不同,先看代码:

使用Hal库实现接收数据功能,有如下3个步骤:

step-1: 代码18~19行, 定义接收数据buff,具体数据长度,可根据实现项目特性确定

step-2: 代码21~24行,调用HAL_UART_Receive_IT,实现数据接收,这个函数必须被连续执行,才能使中断程序不间断接收数据。

step-3: 代码26~32行,重新HAL_UART_RxCpltCallback函数,该函数在收到step-1传入的接收数据长度个数据之后,会进入该函数。其作用是,实现数据处理逻辑。

4.3 实现printf打印功能

在函数中添加如下代码:

代码介绍

222-行: 使用USART1接口,传递一个数据,超时时间为1000ms

注意:

使用printf功能时,必须在头文件中包含:stdio.h

#include <stdio.h>

4.4 完整程序

/* USER CODE BEGIN Header */
/********************************************************************************* File Name          : stm32f4_drv_uart.c* Description        : Code for board uart driver******************************************************************************* @attention** Copyright (c) mingfei.tang* All rights reserved.********************************************************************************/
/* USER CODE END Header */
#include "can.h"
#include "stm32f4_drv_uart.h"
​
static uint8 recevBuff[10];
static const  uint8 RECEV_LEN = sizeof(recevBuff);
​
void UART_Drv_Receive( UART_HandleTypeDef *huart)
{HAL_UART_Receive_IT( huart,  recevBuff, RECEV_LEN);
}
​
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if( huart->Instance == USART1){printf(" %s ", recevBuff);}
}
​
void UART_Drv_SendString(UART_HandleTypeDef *huart, uint8 *databuff, uint8 datalen)
{HAL_UART_Transmit( huart, databuff , datalen, 1000 );
}

5 测试

5.1 测试代码功能介绍

1)使用UART_Drv_SendString发送字符串

2)使用printf发送字符串

3)使用中断函数接收程序

5.2 测试代码实现

源代码

int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */// UART RECEIVE UART_Drv_SendString(&huart1, "this is a test!\r\n", sizeof("this is a test!\r\n"));printf("CAN bus test example: \r\n " );   //使用printf打印log /* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){UART_Drv_Receive( &huart1 );    //触发接收中断函数/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

5.3 测试发送和接收功能

5.3.1 测试发送功能

下载程序到板卡,将USART1对应的串口端和PC之间,使用串口线连接起来,打开串口工具,重新上电或者复位板卡可以看见:

5.3.2 测试接收数据功能

在接收函数中,定义的接收数据缓冲buff的长度为10,所以,当中断程序接收到10个数据之后,就会调用HAL_UART_RxCpltCallback函数.

在HAL_UART_RxCpltCallback函数中,会将接收到的数据通过printf打印到终端:

运行程序后,使用串口调试助手发送数据:

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

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

相关文章

一周学会Django5 Python Web开发-Django5详细视图DetailView

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计28条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

vue+element模仿实现云码自动验证码识别平台官网

一、项目介绍 项目使用传统vue项目结构实现&#xff0c;前端采用element实现。 element官网&#xff1a;Element - The worlds most popular Vue UI framework 云码官网地址&#xff1a;云码-自动验证码识别平台_验证码识别API接口_免费验证码软件 项目截图&#xff0c;支持…

ios csr 证书创建

苹果Certificate证书创建 1.开始创建。 登录苹果开发者网站 选择Certificates旁边的 ✙按钮 选择你想要的证书类型&#xff0c;手机开发的话一般是iOS APP Development 跟 iOS Distribution&#xff08;App Store and Ad Hoc&#xff09;&#xff0c;如果要Mac和iOS都可以发…

NCT 全国青少年编程图形化编程(Scratch)等级考试(一级)模拟测试H

202312 青少年软件编程等级考试Scratch一级真题 第 1 题 【 单选题 】 以下说法合理的是( ) A :随意点开不明来源的邮件 B :把密码设置成 abc123 C :在虚拟社区上可以辱骂他人 D :在改编他人的作品前&#xff0c; 先征得他人同意 正确答案&#xff1a; D 试题解析&…

C# aes加密解密byte数组

using System.Security.Cryptography; using System.Text;namespace AESStu01;public class AesHelper {// AES加密密钥和向量&#xff08;需要保密&#xff09; private static readonly string Key "";//16长度字符串数字混合private static readonly string IV …

LeetCode--42

42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,…

PackagingTool_x64_v2.0.1.0图片转档打包二进制文件合并字库生成图片软件介绍

继去年12月份发布的打包软件PackagingTool v1.4.0.2之后&#xff0c;今年再度投入精力&#xff0c;完善了软件功能&#xff0c;同时开发了几个更加实用的工具&#xff0c;可助力UI界面的设计开发。当前最新版本为PackagingTool_x64_v2.0.1.0&#xff0c;该版本主界面如下&#…

Windows操作系统中各种功能、快捷键

目录 引言一、系统1.任务管理器&#xff08;当前进程属性&#xff09;2.画图板3.计算器4.CMD命令行窗口5.控制面板6.记事本7.写字板 二、浏览器1.打开开发者工具2.页面搜索 三、AcWing1.替换2.对多处进行相同操作3.光标变为下划线 引言 由于本专业是计算机专业&#xff0c;所以…

SpringBoot:Invalid bound statement (not found)的原因和解决方案

&#x1f413; 报错信息&#xff1a; &#xff08;无效绑定声明&#xff09;找不到 解析&#xff1a; 你的mapper实例对象和对应的mapper.xml对象未找到 &#x1f413; 排查&#xff1a; 情况一&#xff1a; 1.排除相对应的mapper实例对象路径是否正确 查看相对应的mapper中…

寒假作业Day 03

寒假作业Day 03 一、选择题 在C语言中&#xff0c;字符型指针char *p;通常用于指向字符数组&#xff08;即字符串&#xff09;的首字符。对于给定的选项&#xff0c;我们来分析每一个选项是否可以将字符串正确地赋值给p&#xff1a; A: pgetchar(); getchar()函数从标准输入读…

图的简单介绍

定义及术语 G(V,E)&#xff1a;图G的顶点集为V&#xff0c;边集为E。分为有向图和无向图两类。 顶点的度&#xff1a;与该结点相连的边的条数。 出度&#xff1a;顶点的出边条数 入度&#xff1a;顶点的入边条数 顶点的权值称为点权&#xff0c;边的权值称为边权。 存储 1.邻…

SpringCache【缓存接口返回值信息】【前端访问后端,后端访问数据库(可以缓存这个过程,前端访问后端,保存记录,下次访问直接返回之前的数据)】

SpringCache 针对不同的缓存技术需要实现不同的CacheManager&#xff1a;注解入门程序CachePut注解CacheEvict注解Cacheable注解 Spring Cache是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;只需要简单地加一个注解&#xff0c;就能实现缓存功能&#xff0c;大大…

Mongodb基础(node.js版)

一、Mongodb 介绍 Mongodb 是一个文档数据库&#xff0c;以文档形式存储数据&#xff0c;格式类似于 JSON 与 Mysql 的特点及选型对照 MongodbMysql关系类型非关系型关系型存储类型文档存储&#xff08;类似于写 Word &#xff09;表格存储 &#xff08;类似于写 Excle&…

Java玩转《啊哈算法》之模拟链表

人应该支配习惯&#xff0c;而绝不是让习惯支配人。一个人要是不能改掉坏习惯&#xff0c;那么他就一文不值。 目录 缘代码地址模拟链表创建遍历打印插入插入优化 完整代码 缘 各位小伙伴们好呀&#xff01;本人最近看了下《啊哈算法》&#xff0c;写的确实不错。 但稍显遗憾…

【C++】string 类 ( 上)

标准库中的string类 注意&#xff1a; 1. string是表示字符串的字符串类 2. 该类的接口与常规容器的接口基本相同&#xff0c;再添加了一些专门用来操作string的常规操作。 比特就业课 3. string在底层实际是&#xff1a;basic_string模板类的别名&#xff0c;typedef basi…

python爬虫之selenium知识点记录

selenium 一、前期准备 1、概述 selenium本身是一个自动化测试工具。它可以让python代码调用浏览器。并获取到浏览器中加载的各种资源。 我们可以利用selenium提供的各项功能。 帮助我们完成数据的抓取。 2、学习目标 掌握 selenium发送请求&#xff0c;加载网页的方法 掌…

Stable-Diffusion ubuntu服务器部署,报错解决方法(小白教程)

Stable Diffusion是一个深度学习模型&#xff0c;专注于生成高质量的图像。它由CompVis团队与Stability AI合作开发&#xff0c;并在2022年公开发布。这个模型使用文本提示&#xff08;text prompts&#xff09;生成详细、逼真的图像&#xff0c;是目前人工智能图像生成领域的一…

逆向案例四:360k静态和精灵数据动态AES解密,用js的方法

一、360K 网页链接:https://www.36kr.com/p/2672600261670407 页面中有静态的需要解密的内容&#xff0c;确定html包&#xff0c;确定方法 1.1方法步骤 在下方的搜索中输入decrypt(或者关键字window.initialState &#xff0c;进入js文件 在AES.decrypt处打上断点&#xff0…

机器学习-03-机器学习算法流程

总结 本系列是机器学习课程的第02篇&#xff0c;主要介绍机器学习中专家系统的应用介绍 本门课程的目标 完成一个特定行业的算法应用全过程&#xff1a; 定义问题&#xff08;Problem Definition&#xff09; -> 数据收集(Data Collection) -> 数据分割(Dataset Spit…

守护无价数据:文件备份的重要性与实用策略

一、数据安全&#xff1a;为何文件备份至关重要 在数字化时代&#xff0c;我们的生活和工作越来越离不开电子设备与其中的文件数据。这些文件可能包含重要的工作文档、珍贵的家庭照片、个人的创意作品等&#xff0c;它们是我们回忆的载体&#xff0c;也是我们工作和创新的基石…