使用最新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打印到终端:

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

66-ES6:var,let,const,函数的声明方式,函数参数,剩余函数,延展操作符,严格模式

1.JavaScript语言的执行流程 编译阶段&#xff1a;构建执行函数&#xff1b;执行阶段&#xff1a;代码依次执行 2.代码块&#xff1a;{ } 3.变量声明方式var 有声明提升&#xff0c;允许重复声明&#xff0c;声明函数级作用域 访问&#xff1a;声明后访问都是正常的&…

殿堂级Flink源码极精课程预售

一、为什么我们要读源码? 1、让个人技术快速成长: 优秀的开源框架,底层的源码设计思想也非常优秀,同时还有含有大量的设计模式和并发编程技术&#xff0c;优秀的解决方案,熟读源码对猿们技术提升有很大帮助 2、新技术学习能力: Java开源码框架的源码熟读后&#xff0c;若出现…

挑战杯 基于机器视觉的车道线检测

文章目录 1 前言2 先上成果3 车道线4 问题抽象(建立模型)5 帧掩码(Frame Mask)6 车道检测的图像预处理7 图像阈值化8 霍夫线变换9 实现车道检测9.1 帧掩码创建9.2 图像预处理9.2.1 图像阈值化9.2.2 霍夫线变换 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分…

Doris实战——银联商务实时数仓构建

目录 前言 一、应用场景 二、OLAP选型 三、实时数仓构建 四、实时数仓体系的建设与实践 4.1 数仓分层的合理规划 4.2 分桶分区策略的合理设置 4.3 多源数据迁移方案 4.4 全量与增量数据的同步 4.5 离线数据加工任务迁移 五、金融级数仓稳定性最佳实践 5.1 多租户资…

返回数据(返回视图所需要的数据)

在上篇文章中&#xff0c;小编带领大家了解到&#xff1a;返回静态数据-CSDN博客&#xff0c;但是&#xff0c;仅仅返回一个静态页面&#xff0c;对于静态页面的数据没正常返回&#xff01; 所以&#xff0c;本篇文章便讲述如何返回数据&#xff1f;&#xff1f; 还是先不管前…

AI大语言模型【成像光谱遥感技术】ChatGPT应用指南

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境&#xff0c;是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型&#xff0c;在理解和生成人类语言方面表现出了非凡的能力。本文重点介绍ChatGPT在遥感中的应用&#xff0c;人工智能…

Revit-二开之创建墙-(6)

Revit API窗间墙 protected override Result OnExecute(ExternalCommandData commandData, ref string message, ElementSet elements) {try{// 获取当前活动的文档

html基础标签+Http请求

文章目录 目录 文章目录 前言 一.网址组成 二.HTTP协议解析 Http 请求报文 报文请求方法 报文头 Cache-Control 常见缓存控制行为 cookie 解析 Http 响应报文 常见状态码 三.域名解析(DNS) DNS域名服务器分类 递归查询 迭代查询 四.端口号 五.路径信息 六.Https协议 ​对称…

毫末智行开年融资,揭幕了自动驾驶最后的赛点

毫末智行日前官宣拿到的超亿元B1轮融资&#xff0c;在行业引起了不小的关注。 一方面是信心问题&#xff0c;自动驾驶从早期拼技术到去年拼量产落地&#xff0c;创业公司们的声量此消彼长&#xff0c;有人领先也有人掉队&#xff0c;但市场的态度都以谨慎为主&#xff0c;甚至…

Vue组件置底方法,ElementPlus布局

问题描述 在开发网页时使用了elementplus的el-container组件 组件里分成了main和footer两块&#xff0c;但是想要将两个按钮置底在容器底部遇到了困难 如下图所示&#xff0c;在网页开发者工具可见两个按钮与左侧的图片没有底部对齐 此时我的代码是这样 <el-footer>&…

存储型xss案例

一、环境 DWVA网上自己找 二、开始闯关 先随便写看看 看看源码&#xff0c;数据是被插入到数据库里面了&#xff0c;魔术开关关闭了 数据最后插入显示到index.php 看一下我们目前的cookie值是 看了源码之后也没进行过滤那么我们试着直接插&#xff0c;看是否过滤 之后用户每…

监控与日志

一、监控 1、监控类型 从监控类型上划分&#xff0c;在 K8s 中可以分成四个不同的类型&#xff1a; ① 资源监控&#xff1a;这种监控主要关注于基础资源的使用情况&#xff0c;例如 CPU、内存、网络等。通常使用数值或百分比等单位来统计&#xff0c;可以通过 Zabbix、Tele…

Android 显示系统框架

一.FrameBuffer FrameBuffer 介绍&#xff1a; FrameBuffer中文译名为帧缓冲驱动&#xff0c;它是出现在2.2.xx内核中的一种驱动程序接口。主设备号为29&#xff0c;次设备号递增。 Linux抽象出FrameBuffer这个设备来供用户态进程实现直接写屏。FrameBuffer机制模仿显卡的功能…

github用法详解

本文是一篇面向全体小白的文章,图文兼备。为了让小白们知道如何使用GitHub,我努力将本文写得通俗易懂,尽量让刚刚上网的小白也能明白。所以各位程序员们都可以滑走了~ 啥是GitHub? 百度百科会告诉你, GitHub是一个面向开源及私有软件项目的托管平台,因为只支持Git作为…

可以用来测试的接口

实际开发过程中&#xff0c;我们可以通过postman工具来测试接口 get请求 https://api.github.com/events?id1&nameuser post请求 http://httpbin.org/post 参数1&#xff1a;key1value1 参数2&#xff1a;key2value2

2023年NOC大赛软件创意编程(学而思)赛道图形化小高组复赛试题

目录 第一题 闪烁的星星 第二题 聚沙成塔 第三题 画十字

力扣刷题:100.相同的树

题目&#xff1a; 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q [1,2,3] 输出&#xff…

【JavaScript 漫游】【027】表单事件简记

文章简介 本篇文章为【JavaScript 漫游】专栏的第 026 篇文章&#xff0c;对 JavaScript 中的表单事件进行了简单记录。 input 事件 input 事件当 <input>、<select>、<textarea> 的值发生变化时触发。对于复选框&#xff08;<input typecheckbox>&…

百度搜索引擎SEO优化方法

随着互联网的不断发展&#xff0c;搜索引擎已经成为人们获取信息、产品和服务的主要途径之一。而在中国&#xff0c;百度作为最大的搜索引擎&#xff0c;其影响力不可忽视。了解并掌握百度SEO关键词优化方法&#xff0c;对于提升网站在搜索引擎中的排名至关重要。 关键词选择&a…

【硬件工程师面经整理12_逆变器篇】

文章目录 逆变器1.1 半桥逆变&#xff08;half-bridge inverter&#xff09;电路1.2 全桥逆变&#xff08;H-bridge inverter&#xff09;1.3 H桥电路结构&#xff0c;用的是什么管子&#xff0c;有没有出现问题&#xff0c;怎么解决的 逆变器 逆变电路的基本工作原理 单相桥…