0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Stm32 HAL库开发-UART串口通信轮询方式

冬至子 来源:Vulcan Matrix 作者:Vulcan 2023-10-26 16:22 次阅读

1

HAL库中UART相关结构体的内容

本小节参考《description-of-stm32f0-hal-and-lowlayer-drivers-stmicroelectronics》、《STM32F051x 参考手册中文》。

图片

UART的结构体有两个,如图,UART_InitTypeDef是初始化结构体,包含UART开始运行时的配置;UART_HandleTypeDef是句柄结构体,包含UART所有运行时的信息

图片

UART_InitTypeDef初始化结构体中包含,波特率、帧的字长、停止位长度、奇偶校验方式、工作模式、硬件流模式和过(超)采样率设置。

图片

其中过采样的目的类似于一种低通滤波,Stm32通过对一帧进行16次或者8次采样,并对采样结果进行“多数票决”来判断该帧为起始位或是数据位的0或1。详见《STM32F051x 参考手册中文》573页。

图片

硬件流控制是通过硬件对UART传输进行更精细的控制的手段。UART传输中,Stm32通过nCTS端口读取对方的nRTS端口电平,获知对方是否准备好接受新的数据,这种操作可以避免数据寄存器中未被读出的旧数据被新数据刷新掉的情况发生。详见《STM32F051x 参考手册中文》604页。

图片

UART_HandleTypeDef是UART句柄结构体,包含了UART运行过程中HAL层的所有信息。

2

UART初始化三步

在介绍Stm32的HAL初始化UART之前,我们先看一下Arduino怎么初始化UART的。

图片

Arduino使用非常简便的一句话,*Serial.begin(波特率); *来初始化UART,这一句话包含了三个内容:

  • UART对象——其代表我们要使用的UART外设;
  • UART启动——其代表根据UART参数启动串口;
  • UART参数——其代表UART以何种配置运行;

图片

Stm32的HAL初始化过程也可以进行类比:

图片

我们还可以用填表格来理解这三步操作:

图片

2.1

Step1-申明结构体变量-生成表格

图片

申明一个UART_HandleTypeDef的结构体变量,图中的结构体是在main函数中声明,推荐在main.c的头部申明结构体,使其成为全局变量。

图片

2.2

Step2-配置UART参数-填写表格

配置UART参数参数包括两步:

图片

第一步是要给UART_HandleTypeDef结构体变量赋值

  • 将我们要使用的外设赋值给其instance字段。
  • 将波特率、帧长度等配合赋值给其UART_InitTypeDef初始化结构体变量的相应字段。

图片

第二步是要配置与所使用的UART连接的GPIO口,因为任何外设想与外界交换数据都需要正确的和使用的GPIO进行绑定。

在还未介绍的Step3中,我们需要调用HAL_UART_Init()初始化UART,HAL_UART_Init()又会调用HAL_UART_MspInit()对于单片机的Msp( MCU Specific Package 单片机的具体方案 )进行配置,这里Msp就指具体配置哪个IO与UART进行连接。

在HAL_UART_MspInit()中配置GPIO又需要进行如下两步操作:

1. 定义GPIO_InitTypeDef初始化结构体变量作为所要初始化GPIO的配置的“暂存”。

图片

2. 然后判断此次调用HAL_UART_MspInit()函数的UART外设,根据不同的UART外设对于相应的GPIO和时钟进行如下操作:

  • 启动所用UART外设的时钟。
  • 启用所用GPIO的时钟。
  • 配置GPIO_InitTypeDef初始化结构体变量(变量值如上图)。
  • 使用初始化函数初始化GPIO。
    图片

2.3

Step3-使用函数初始化UART-提交表格

图片

完成了UART的参数配置和IO配置之后,我们需要使用HAL_UART_Init()函数提交之前配置好的UART_HandleTypeDef结构体变量这个“表格”,使得Stm32按照我们的参数配置、IO配置启动。

3

使用轮询模式

图片

3.1

UART通信的三种模式

UART通信有三种模式,分别为轮询模式、中断模式、DMA模式,本小节介绍轮询模式通信。

如果读者学过8位单片机的底层开发,应该能理解轮询模式和中断模式的区别以及中断模式比轮询模式在单片机任务较多时更为高效的原因。

《Mastering Stm32》一书的248页也对两者的区别进行了阐述:

图片

简单来说,轮询模式是内核在规定的阻塞时间内使用while循环读取传输的标志位,直到标志位被置位才将数据写入或读出DR寄存器。

而中断模式是传输完成的相关中断发生时,内核才放下手中的工作,将数据写入或读出DR寄存器。少了阻塞时间内的循环读取因此更高效。

而DMA模式则更为高效,DMA作为内核的二弟,当传输完成中断发生时,帮助大哥将数据写入或读出DR寄存器,不需要打断大哥-内核的工作。

3.2

轮询模式

图片

在轮询模式发送数据调用函数HAL_UART_Transmit() ,接收数据调用函数HAL_UART_Receive(),两者的传入参数列表,以及返回值意义相同,如下图,摘自《description-of-stm32f0-hal-and-lowlayer-drivers-stmicroelectronics》P572页。

图片

下面演示两个函数的几种调用案例:

/* 发送字符数组 */
  char buff[2] = {'a','b'};
  HAL_UART_Transmit(&huart3,(uint8_t *)buff,
                      sizeof(buff),HAL_MAX_DELAY);
/* 发送字符串 */
  HAL_UART_Transmit(&huart3, (uint8_t*)"Hello", 
                      strlen("Hello"),HAL_MAX_DELAY);
/* 接受字符数组 */
  char readBuf[1];
  HAL_UART_Receive(&huart2, (uint8_t*)readBuf, 1, HAL_MAX_DELAY);

至此本文已经完成了对于Stm32使用HAL初始化UART,以及在轮询模式通信方法的阐述。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2257

    文章

    10828

    浏览量

    352454
  • 串口通信
    +关注

    关注

    34

    文章

    1601

    浏览量

    55234
  • 低通滤波
    +关注

    关注

    0

    文章

    17

    浏览量

    16011
  • 奇偶校验
    +关注

    关注

    0

    文章

    15

    浏览量

    8183
  • HAL库
    +关注

    关注

    1

    文章

    114

    浏览量

    6030
收藏 人收藏

    评论

    相关推荐

    stm32F411和hal串口轮询方式接收丢失字节

    各位好,我串口推信三种方式轮询,接收中断,DMA)都使用过了,我的前两种当发的长度超过一定数值后就发生丢字节,DMA没有问题,我用的STM32F411,结合cube生成的工程,哪位帮
    发表于 11-06 08:52

    基于STM32F4的HAL串口UART程序的详细资料免费下载

    本文档的主要内容详细介绍的是基于STM32F4的HAL串口UART程序的详细资料免费下载,中断接收固定开头不固定长度数据
    发表于 08-20 08:00 67次下载
    基于<b class='flag-5'>STM32</b>F4的<b class='flag-5'>HAL</b><b class='flag-5'>库</b><b class='flag-5'>串口</b><b class='flag-5'>UART</b>程序的详细资料免费下载

    HAL STM32CubeMX--USART串口通信(一)

    简介STM32CubeMX串口的操作,以及HAL串口的配置,基于HAL
    发表于 12-06 17:51 3次下载
    <b class='flag-5'>HAL</b><b class='flag-5'>库</b> <b class='flag-5'>STM32</b>CubeMX--USART<b class='flag-5'>串口</b><b class='flag-5'>通信</b>(一)

    基于stm32CubeMX(Hal)的stm32串口通信

    1.2 RS-232标准1.3TTL标准二. 安装 stm32CubeMX,配合Keil,使用寄存器方式(汇编或C,不限) 或HAL这两种方式
    发表于 12-07 09:21 11次下载
    基于<b class='flag-5'>stm32</b>CubeMX(<b class='flag-5'>Hal</b><b class='flag-5'>库</b>)的<b class='flag-5'>stm32</b><b class='flag-5'>串口</b><b class='flag-5'>通信</b>

    串口通信小试牛刀~使用STM32CubeMX+ HAL点亮流水灯

    STM32CubeMX与Keil MDK配合HAL完成流水灯的点亮。目录一、STM32串口通信
    发表于 12-07 10:06 14次下载
    <b class='flag-5'>串口</b><b class='flag-5'>通信</b>小试牛刀~使用<b class='flag-5'>STM32</b>CubeMX+ <b class='flag-5'>HAL</b><b class='flag-5'>库</b>点亮流水灯

    STM32CubeMX基于HAL实现简单串口通信

    STM32CubeMX基于HAL实现简单串口通信板子:STM32F103C8编译工具:Keil
    发表于 12-08 12:36 20次下载
    <b class='flag-5'>STM32</b>CubeMX基于<b class='flag-5'>HAL</b><b class='flag-5'>库</b>实现简单<b class='flag-5'>串口</b><b class='flag-5'>通信</b>

    STM32_HALUART通信

    0x00.章索引STM32_HAL:点亮第一个LEDSTM32_HAL:按键输入检测STM32_HAL:简单定时器的使用STM32_HAL:PWM输出
    发表于 12-08 12:51 6次下载
    <b class='flag-5'>STM32_HAL</b>:<b class='flag-5'>UART</b><b class='flag-5'>通信</b>

    使用LL开发STM32UART基础使用

    485通讯从写程序的角度来说就是使用UART进行通讯。(这个地方有些人会混淆,串口更多是一种通讯方式、机制,而TTL、232、485更多的是电气相关特性)HAL
    发表于 12-08 18:21 14次下载
    使用LL<b class='flag-5'>库</b><b class='flag-5'>开发</b><b class='flag-5'>STM32</b>:<b class='flag-5'>UART</b>基础使用

    HAL串口通信

    HAL入门之串口通信学习经验分享
    发表于 12-16 16:58 5次下载
    【<b class='flag-5'>HAL</b><b class='flag-5'>库</b>】<b class='flag-5'>串口</b><b class='flag-5'>通信</b>

    STM32 HAL CubeMX教程(五)串口通信基础

    STM32 HAL CubeMX教程(五)串口通信基础串口
    发表于 12-24 18:49 12次下载
    <b class='flag-5'>STM32</b> <b class='flag-5'>HAL</b><b class='flag-5'>库</b> CubeMX教程(五)<b class='flag-5'>串口</b><b class='flag-5'>通信</b>基础

    STM32 HAL UART 串口读写功能笔记

    STM32L0 HAL UART 串口读写功能串口发送功能:uint8_t TxData[10
    发表于 12-27 19:11 13次下载
    <b class='flag-5'>STM32</b> <b class='flag-5'>HAL</b><b class='flag-5'>库</b> <b class='flag-5'>UART</b> <b class='flag-5'>串口</b>读写功能笔记

    STM32串口通信HAL配置中 UART_IT_xx与UART_FLAG_xx 的区别

    STM32串口通信HAL配置中 UART_IT_xx与UA
    发表于 12-28 19:05 2次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>串口</b><b class='flag-5'>通信</b><b class='flag-5'>HAL</b><b class='flag-5'>库</b>配置中 <b class='flag-5'>UART</b>_IT_xx与<b class='flag-5'>UART</b>_FLAG_xx 的区别

    STM32 HAL串口收发如何使用

    前言 一、 HAL 串口收发 1.1 串口发送 1.2 串口接收 二、 收发同时串口卡死? 2
    的头像 发表于 06-22 10:38 5583次阅读
    <b class='flag-5'>STM32</b> <b class='flag-5'>HAL</b><b class='flag-5'>库</b><b class='flag-5'>串口</b>收发如何使用

    STM32 HAL串口收发是如何使用的?

    STM32 HAL串口收发是如何使用的? STM32是一款高性能的微控制器,它拥有广泛的应用领域,其中包括了各种通讯应用,如
    的头像 发表于 10-26 17:42 1079次阅读

    STM32 HAL串口同时收发,接收卡死?

    HAL是针对STM32系列单片机的一套常用的高级抽象层。在HAL中,
    的头像 发表于 10-26 17:42 3106次阅读