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

news2024/9/30 7:26:39

目录

概述

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.coloradmin.cn/o/1485299.html

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

相关文章

Linux下进程相关概念详解

目录 一、操作系统 概念 设计操作系统的目的 定位 如何理解“管理” 系统调用和库函数概念 二、进程 概念 描述进程—PCB&#xff08;process control block&#xff09; 查看进程 进程状态 进程优先级 三、其它的进程概念 一、操作系统 概念 任何计算机系统都包…

产品营销展示型wordpress外贸网站模板

工艺品wordpress外贸主题 简约大气的wordpress外贸主题&#xff0c;适合做工艺品进出品外贸的公司官网使用。 https://www.jianzhanpress.com/?p5377 餐饮设备wordpress外贸主题 简洁的wordpress外贸主题&#xff0c;适合食品机械、餐饮设备公司使用。 https://www.jianzh…

如何使用Docker搭建StackEdit编辑器并结合内网穿透实现远程办公

文章目录 前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安装VNC viewer连接工具4. 内网穿透4.1 安装cpolar【支持使用一键脚本命令安装】4.2 创建隧道映射4.3 测试公网远程访问 5. 配置固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址5.3 测试…

oms-Diffusion:用户可上传服装图片与参考姿势图进行试穿,解决服装行业高昂成本问题

之前已经向大家介绍了很多关于虚拟试穿的项目&#xff0c;如谷歌的Tryon Diffusion, 阿里的Outfit Anyone, 亚马的Diffuse to Choose。东京大学的OOTDiffusion虚拟服装试穿工具。基于扩散模型的技术基本已经成为现在主流应用的基石。感兴趣的小伙伴可以点点击下面链接阅读~ 电商…

GEE入门篇|图像处理(一):理论介绍

光谱指数是基于地球表面不同的物体和土地覆盖反射不同波长的不同数量的太阳光的事实。例如&#xff0c;在光谱的可见部分&#xff0c;健康的绿色植物反射大量的绿光&#xff0c;同时吸收蓝光和红光——这就是为什么它在我们的眼中是绿色的。来自太阳的光的波长也超出了人眼所能…

前端面试练习24.3.2-3.3

HTMLCSS部分 一.说一说HTML的语义化 在我看来&#xff0c;它的语义化其实是为了便于机器来看的&#xff0c;当然&#xff0c;程序员在使用语义化标签时也可以使得代码更加易读&#xff0c;对于用户来说&#xff0c;这样有利于构建良好的网页结构&#xff0c;可以在优化用户体…

Vue开发实例(四)Element-UI部分组件使用方法

Element-UI的使用 一、Icon图标的使用1、用 i 标签使用图标 二、用 el-button 使用图标1、使用type定义样式2、使用plain定义样式3、使用round定义样式4、使用circle定义样式5、带图标和文字的按钮6、按钮禁用7、文字按钮8、按钮组9、加载中 三、Link 文字链接1、基础用法2、禁…

LaTeX-设置表格大小

文章目录 LaTeX-设置表格大小1.创建表格2.设置表格的宽度2.1控制表格每一列的宽度2.2控制整个表格的宽度 3.设置表格的外观4.LaTeX绘制三线表 LaTeX-设置表格大小 本文介绍了LaTeX如何设置表格的大小、改变表格的外观以及如何绘制三线表。 1.创建表格 在LaTeX中创建表很耗时…

Springboot+vue的高校教师教研信息填报系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的高校教师教研信息填报系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&am…

Hololens 2应用开发系列(1)——使用MRTK在Unity中设置混合现实场景并进行程序模拟

Hololens 2应用开发系列&#xff08;1&#xff09;——使用MRTK在Unity中进行程序模拟 一、前言二、创建和设置MR场景三、MRTK输入模拟的开启 一、前言 在前面的文章中&#xff0c;我介绍了Hololens 2开发环境搭建和项目生成部署等相关内容&#xff0c;使我们能生成一个简单Ho…

100个百万阅读公众号爆文案例

100个100万公众号爆文案例 自从公众号流量推送修改之后&#xff0c;原来的私域玩法一去不复返&#xff0c;公域公众号正在崛起 现在公众号的玩法就是找爆款&#xff0c;去对标&#xff0c;去学习&#xff0c;努力使自己的公众号进入流量池&#xff0c;然后吃流量主的收益 这里…

【数据结构和算法】根据前序、中序、后序来确定一颗二叉树

目录 0 引言1 确定二叉树结构的方式1.1 前序和中序1.2 后序和中序1.3 前序和后序&#xff1a;无法确定结构 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;计算机四大基础专栏&#x1f4dc; 其他章节&#xff1a;网络快速入门系列、计网概述、计网…

Redis-基础篇

Redis是一个开源、高性能、内存键值存储数据库&#xff0c;由 Salvatore Sanfilippo&#xff08;网名antirez&#xff09;创建&#xff0c;并在BSD许可下发布。它不仅可以用作缓存系统来加速数据访问&#xff0c;还可以作为持久化的主数据存储系统或消息中间件使用。Redis因其数…

从下一代车规MCU厘清存储器的发展(2)

目录 1.概述 2.MCU大厂的选择 2.1 瑞萨自研STT-MRAM 2.2 ST专注PCM 2.3 英飞凌和台积电联手RRAM 2.4 NXP如何计划eNVM 3.小结 1.概述 上篇文章&#xff0c;我们简述了当前主流的存储器技术&#xff0c;现在我们来讲讲各大MCU大厂的技术选择 2.MCU大厂的选择 瑞萨日…

vue2结合electron开发桌面端应用

一、Electron是什么&#xff1f; Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 。允许您保持一个 JavaScript 代码代码库并创建可在Windows、macOS和Linux上运行的跨平台应用 。 Electron 经常与 Ch…

文献阅读笔记《Spatial-temporal Forecasting for Regions without Observations》13页

目录 目录 目录 发行刊物 ABSTRACT 1 INTRODUCTION 2 RELATED WORK&#xff08;相关工作 2.1 Spatial-temporal Forecasting&#xff08;时空预测 2.2 Spatial-temporal Forecasting withIncomplete Data&#xff08;不完全数据的时空预测 2.3 Graph Contrastive Lear…

什么是Vue指令?请列举一些常见的Vue指令以及它们的用法

Vue.js 是一款流行的前端框架&#xff0c;它的指令&#xff08;Directives&#xff09;是 Vue.js 提供的一种特殊属性&#xff0c;用于在模板中对 DOM 元素进行直接操作。指令通常是以 v- 开头的特殊属性&#xff0c;用于响应式地将数据绑定到 DOM 元素上。 在 Vue 中&#xf…

VS Code(Visual Studio Code)本地(local)和远程(ssh)Docker Container 下的 Python 开发和调试

VS Code&#xff08;Visual Studio Code&#xff09;本地&#xff08;local&#xff09;和远程&#xff08;ssh&#xff09;Docker Container 下的 Python 开发和调试 1. 目的需求2. VS Code 简介3. 使用实践&#xff1a;一个简单的实例3.1 准备工作3.1.1 远程服务器3.1.2 本地…

测试面试精选题:可用性测试主要测试哪些方面,举例说明

1.界面设计&#xff1a; 评估软件的用户界面设计是否直观、美观、易于理解和操作。 测试用例&#xff1a;打开软件&#xff0c;查看界面布局是否合理&#xff0c;各个功能是否容易找到&#xff0c;是否符合用户习惯。 2.导航和布局&#xff1a; 评估用户在软件中导航和查找…

点云数据结构化与体素化理论学习

一、PCD点云数据存储格式的进一步认识 &#xff08;一&#xff09;PCD点云存储格式相较于其它存储格式&#xff08;如PLY、STL、OBJ、X3D等&#xff09;的优势[1] &#xff08;1&#xff09;具有存储和处理有组织的点云数据集的能力&#xff0c;这对于实时应用和增强现实及机器…