使用HAL库开发STM32:UART基础使用

2023-11-12

目的

UART(异步串口)是单片机非常常用的一个功能,一般用作设备或模块间通讯的一种方式。通常所说的232或是485通讯从写程序的角度来说就是使用UART进行通讯。(这个地方有些人会混淆,串口更多是一种通讯方式、机制,而TTL、232、485更多的是电气相关特性)

基础说明与初始化

基础说明

STM32系列MCU大多都有多个UART可以使用,每个UART可以设置独立的参数,和其它设备通讯时通讯的双方必须有相同的参数。一般会涉及的参数如下:

  • BaudRate 波特率,通讯速率,当其他参数默认时,每秒可传输字节数约为 BaudRate/10;
  • WordLength 数据位,数据位表示每一个数据包含bit数,一般用8bit,即一个数据为一个字节;
  • StopBits 停止位,停止位用来表示一个数据传输结束;
  • Parity 校验位,校验位用来校验传输的数据是否正确,一般也比较少用,通讯用的协议一般带自己的校验方式;
  • HwFlowCtl 流控制,现在比较少用到;
  • OverSampling 过采样,一般默认就行;

初始化

如果使用STM32CubeMX来初始化UART的话我们一般只要根据需求设置基本参数、中断、DMA即可,如下图所示:
在这里插入图片描述
默认情况下STM32CubeMX生成的初始化代码分别位于main和stm32fxxx_hal_msp文件中,其中UART基本参数相关设置代码如下:

static void MX_USART1_UART_Init(void)
{
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }
}

如果想要在使用过程中更改串口参数可以用上面代码更改,如果想要关闭串口可以使用 HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart) 函数。

数据接收和发送

UART的数据接收和发送可以分别为轮询、中断、DMA三种方式,同一个串口三种方式不可混用。

轮询方式

在这里插入图片描述
轮询方式使用UART只需要设置基本参数就行,不需要开启中断和DMA。轮询模式下收发数据使用下面函数:

  • HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
  • HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

上面函数使用时分别传入UART对象、数据指针、数据长度、超时时间(默认情况下单位ms)。这两个函数在调用时均会阻塞程序,直至数据传输完成或者超时。所以轮询方式一般不怎么推荐。

中断方式

在这里插入图片描述
中断方式使用UART需要设置基本参数和开启中断,不需要启用DMA。中断模式下收发数据需要用到下面函数:

  • HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
  • HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

上面两个函数分别是接收和发送的操作。

  • void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  • void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)

上面两个函数分别是接收和发送完成时的回调函数,用户需要自行编写回调函数具体的内容。

中断方式收发数据其实是每收发一个字节均会触发一次中断的,只不过HAL库将它处理了,用户一般只在全部完成时进行操作。这种方式会频繁进出中断,在使用时需要注意。

DMA方式

在这里插入图片描述
DMA模式下收发数据需要用到下面函数:

  • HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
  • HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

上面两个函数分别是接收和发送的操作。

  • void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  • void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)

上面两个函数分别是接收和发送完成时的回调函数,用户需要自行编写回调函数具体的内容。

其它说明

UART除了设置、收发数据外还有一些功能,如下图:
在这里插入图片描述

  • 带有 HAL_UART_Abort 字符的函数是用来取消当前正在进行的传输的相关操作;
  • 带有 HAL_UART_DMA 字符的函数是用来控制DMA方式收发数据过程的相关操作;
  • HAL_UART_GetErrorHAL_UART_GetState 函数分别用来获取UART的错误和状态信息,具体信息参见其宏定义;
  • 带有 HalfCpltCallback 字符的函数是传输过半回调函数,用户可以根据需求自行重写函数具体功能;

总结

UART基本使用还是比较简单的。一般实际使用中除了基本的功能使用外还需要编写一些额外的收发逻辑,这块内容会在之后的文章中讲解。
更多内容可以参考官方库文档,比如上面演示中用的F4系列文档《UM1725 User Manual - Description of STM32F4 HAL and LL drivers》。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用HAL库开发STM32:UART基础使用 的相关文章

随机推荐

  • VB 正则表达式(RegExp)对象

    VB 正则表达式 RegExp 对象 正则表达式 RegExp 对象提供简单的正则表达式支持功能 说明下面的代码说明了RegExp对象的用法 Function RegExpTest patrn strng Dim regEx Match M
  • Docker swarm 搭建docker高可用集群

    目录 项目名称 基于docker swarm 搭建docker高可用集群 1 网络拓扑图 网络数据流图 2 项目环境 3 项目描述 4 项目步骤 1 规划设计整个集群的架构 网络拓扑 安装7台CentOS 7 6的系统 按照规划配置好每台l
  • rs232转usb驱动_世界上最小的伺服驱动器。

    PEAR 世界上最小的伺服驱动器 用于有刷和无刷电机的微型嵌入式控制器 8 40 Vdc单电源 3 A连续 6 A峰值 CANOpen DS402 DS301 RS232和USB配置 数字霍尔 单端编码器 2x通用输入 1x数字输出尺寸 2
  • dw1000 配置无法通过

    最近在使用DW1000 做UWB项目时 出现过一个问题 配置DW1000一直无法成功 奇怪 之前还好好的 一点点排查确认了SPI配置没有问题 速度也不会太高 最后发现是重新配置工程时错将DW1000的RESET引脚配成输出引脚 把它改回输入
  • TCP的三次握手,四次挥手,面试必会

    目录 一 TCP三次握手 建立连接 二 TCP三次握手细节 三 TCP 四次挥手 断开连接 四 TCP非常重要的协议 一 TCP三次握手 建立连接 握手 单纯就是发一个打招呼的数据 不携带业务信息 那么为什么叫三次握手呢 因为B的中间两次可
  • C++ map的基本操作和使用

    C map的基本操作和使用 1 map简介 map是一类关联式容器 它的特点是增加和删除节点对迭代器的影响很小 除了那个操作节点 对其他的节点都没有什么影响 对于迭代器来说 可以修改实值 而不能修改key 2 map的功能 自动建立Key
  • 【TypeScript】TypeScript中的泛型

    泛型的意义及语法 定义一个函数或类时 有些情况下无法确定其中要使用的具体类型 返回值 参数 属性的类型不能确定 此时泛型便能够发挥作用 举个例子 function test arg any any return arg 上例中 test函数
  • 红队内网渗透神器--CobaltStrike安装教程

    CobaltStrike介绍 CobaltStrike是一款渗透测试神器 被业界人称为CS神器 CobaltStrike分为客户端与服务端 服务端是一个 客户端可以有多个 可被团队进行分布式协团操作 CobaltStrike集成了端口转发
  • 【VS问题已解决】警告被视为错误 - 没有生成“object”文件

    VS问题已解决 警告被视为错误 没有生成 object 文件 目前遇到这个问题主要是因为代码存在不明显的语法错误 在VS生成解决方案的编译阶段之前会检查有没有明显的语法问题 首先是 例如缺少结尾分号 误用中文字符这种最明显问题 在运行之前就
  • 网络协议笔记-网络层-划分子网、IP数据报的分组转发

    1 子网及子网掩码 1 1 为什么划分子网 简单点说 就是IP地址不够用了 互联网的发展太快 IP地址不够分了 两级IP地址的设计不太合理 因为随着网络的增多路由表会变得巨大 书上的总结是这样的 IP地址空间的利用率有时很低 例如A类地址网
  • 使用Python将图片转pdf

    使用Python将图片转pdf 1 效果图 2 源码 参考 今天需要把图片转pdf 发现迅捷pdf转换开始默认带水印了 收费版那算了 那就用Python吧 可单转 可批量转 参考 https blog csdn net qq 5370609
  • AI笔记: 数学基础之正交矩阵与矩阵的QR分解

    正交矩阵 若n阶方阵A满足 A T A E A TA E ATA E 则称A为正交矩阵 简称正交阵 复数域上称为酉矩
  • Vue 框架

    Vue 简介 Vue 是一套用于构建用户界面的渐进式框架 Vue 的核心库只关注视图层 不仅易于上手 还便于与第三方库或既有项目整合 另一方面 当与现代化的工具链以及各种支持类库结合使用时 Vue 也完全能够为复杂的单页应用提供驱动 官方文
  • 家用NAS——6大神奇体验供你享

    NAS这个 网络存储器 它能一站式为你解决有关存储的问题 家用NAS的这6大神奇的体验 不用不知道 用了才知道它的妙 一 强大的手机相册管理软件 市面上很多NAS都配备了相册APP管理软件 通过手机APP 可以将手机内的照片直接备份到NAS
  • Docker介绍

    Docker介绍 Docker 扩展了Linux 容器 Linux Containers 或着说 LXC 通过一个高层次的 API为进程单独提供了一个轻量级的虚拟环境 Docker利用了 LXC cgroups 和Linux 自己的内核 和
  • 通过JS监听input输入框的值来判断手机号

  • 多项式分布的理解概率公式的理解

    多项式分布是二项分布的推广 二项分布 也叫伯努利分布 的典型例子是扔硬币 硬币正面朝上概率为p 重复扔n次硬币 k次为正面的概率即为一个二项分布概率 而多项分布就像扔骰子 有6个面对应6个不同的点数 二项分布时事件X只有2种取值 而多项分布
  • stable diffusion实践操作-安装

    本文专门开一节写安装相关的内容 在看之前 可以同步关注 stable diffusion实践操作 正文 1 秋葉一键安装包 github安装 https github com AUTOMATIC1111 stable diffusion w
  • MyBatis在字段返回为null不返回字段

    原文地址 http blog csdn net zkd12344 article details 53261253 参考地址 http www 360doc com content 15 0608 08 281812 476469535 s
  • 使用HAL库开发STM32:UART基础使用

    文章目录 目的 基础说明与初始化 基础说明 初始化 数据接收和发送 轮询方式 中断方式 DMA方式 其它说明 总结 目的 UART 异步串口 是单片机非常常用的一个功能 一般用作设备或模块间通讯的一种方式 通常所说的232或是485通讯从写