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

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

3天内不再提示

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

工程师邓生 来源:未知 作者:刘芹 2023-10-26 17:42 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

STM32是一款高性能的微控制器,它拥有广泛的应用领域,其中包括了各种通讯应用,如UART串口通讯。HAL库是ST公司为了方便开发者使用STM32而开发的一种库,它提供了一种简单易用的方法来使用STM32的各种外设。

本文将详细介绍如何使用STM32 HAL库来进行串口通信,包括初始化、发送数据和接收数据等方面。

1. 初始化串口
首先需要初始化串口外设,按照HAL库的方法,我们需要定义一个串口句柄,然后对句柄中的各项参数进行赋值,包括波特率、数据位、停止位、奇偶校验位等等。根据不同的外设,具体的初始化内容可能会稍有不同。

示例代码如下:
```c
UART_HandleTypeDef huart;

void UART_Init(void)
{
huart.Instance = USART1;
huart.Init.BaudRate = 115200;
huart.Init.WordLength = UART_WORDLENGTH_8B;
huart.Init.StopBits = UART_STOPBITS_1;
huart.Init.Parity = UART_PARITY_NONE;
huart.Init.Mode = UART_MODE_TX_RX;
huart.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart.Init.OverSampling = UART_OVERSAMPLING_16;
HAL_UART_Init(&huart);
}
```

2. 发送数据
在初始化完成之后,就可以通过UART外设发送数据了。HAL库提供了两个基本函数:`HAL_UART_Transmit`和`HAL_UART_Transmit_IT`。前者使用了阻塞方式发送数据,即在数据未全部发送完成之前,函数会一直等待。后者则使用了中断方式,可以在数据正在发送的同时进行其他操作,不会阻塞程序的运行。

示例代码如下:
```c
void SendData(char* data, uint16_t len)
{
HAL_UART_Transmit(&huart, (uint8_t*)data, len, 0xFFFF);
}
```

其中`data`为待发送的数据缓存区,`len`为发送数据长度。

如果需要使用中断方式发送数据,则需要先确保串口中断开启,可以在初始化中调用`HAL_UART_MspInit`函数进行设置。然后调用`HAL_UART_Transmit_IT`函数,并在中断处理函数中完成剩余操作。

示例代码如下:
```c
void SendData_IT(char* data, uint16_t len)
{
HAL_UART_Transmit_IT(&huart, (uint8_t*)data, len);
}

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
// 发送完成后的操作
}
```

在中断处理函数中,可以使用`HAL_UART_GetState`函数来获取当前发送状态,从而进行相关处理。

3. 接收数据
串口接收数据也需要进行初始化,并设置相关参数。HAL库提供了两个基本函数:`HAL_UART_Receive`和`HAL_UART_Receive_IT`,同样分别对应阻塞方式和中断方式。在进行串口接收时,同样需要定义一个接收缓存区,用于存储接收到的数据。

示例代码如下:
```c
void ReceiveData(char* data, uint16_t len)
{
HAL_UART_Receive(&huart, (uint8_t*)data, len, 0xFFFF);
}
```

如果需要使用中断方式接收数据,则同样需要确保串口中断开启,并调用`HAL_UART_Receive_IT`函数。在中断处理函数中,可以使用`HAL_UART_IRQHandler`函数来进行中断服务函数的调用,并在其中对接收数据进行处理。

示例代码如下:
```c
void ReceiveData_IT(char* data, uint16_t len)
{
HAL_UART_Receive_IT(&huart, (uint8_t*)data, len);
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
// 接收完成后的操作
HAL_UART_Receive_IT(&huart, (uint8_t*)buffer, BufferSize);
}

void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
{
HAL_UART_IRQHandler(&huart);
}
```

在中断服务函数中,可以使用`HAL_UART_IRQHandler`函数来完成中断的清理工作。

总结
本文介绍了如何使用STM32 HAL库来进行串口通信,包括初始化、发送数据和接收数据等方面。HAL库提供了简单易用的函数和方法,使得开发者可以轻松地实现串口通信功能,提高了程序的可读性和可维护性。

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

    关注

    49

    文章

    8863

    浏览量

    165668
  • STM32
    +关注

    关注

    2313

    文章

    11195

    浏览量

    374616
  • HAL库
    +关注

    关注

    1

    文章

    121

    浏览量

    7738
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口

    仅是一部分常用的基础指令,更多更仔细的指令或者函数可以访问陶晶驰资料官网。 硬件和接线 硬件需要一块STM32F103C8T6的开发板,杜邦线诺干,2.4寸串口屏一块 接线 串口STM32
    的头像 发表于 02-10 17:07 552次阅读
    <b class='flag-5'>STM32</b>驱动<b class='flag-5'>串口</b>屏,<b class='flag-5'>STM32</b>F103C8T6<b class='flag-5'>串口</b>发送指令控制HMI<b class='flag-5'>串口</b>屏

    【求助】Proteus 8.17SP5中STM32 HAL HAL_GPIO_ReadPin读不出低电平!

    开发环境STM32 CubeIDE v1.12.1,仿真环境Proteus 8.17SP5。使用STM32F103R6Tx。 配置PB7为Inputmode,内部Pull-up。PC5为
    发表于 01-30 16:45

    《机智云Gokit3开发篇》4 RGB灯的介绍与驱动移植(HAL

    的色彩控制能力。本文聚焦Gokit3开发板(MCU模式,主控STM32F103C8T6),以HAL为开发基础,从P9813驱动芯片的工作原理入手,系统讲解RGB灯的
    的头像 发表于 01-28 19:11 5316次阅读
    《机智云Gokit3开发篇》4 RGB灯的介绍与驱动移植(<b class='flag-5'>HAL</b><b class='flag-5'>库</b>)

    机智云Gokit3开发篇 — 搭建Gokit3工程(HAL版)

    F103C8T6微控制器,支持多种开发环境,使学习与开发变得更加便捷。本文将带您从零基础开始,逐步搭建Gokit3的HAL工程,并通过简单的点灯实验,让您感受开发的乐趣。在这个过
    的头像 发表于 01-08 19:14 651次阅读
    机智云Gokit3开发篇 — 搭建Gokit3工程(<b class='flag-5'>HAL</b><b class='flag-5'>库</b>版)

    立即在GitHub上抢先体验面向STM32U5的最新STM32Cube HAL更新

    其满足您的需求。 如何获取预览版本 面向STM32U5系列的STM32Cube HAL2预览版已在GitHub代码STM32CubeU5-
    的头像 发表于 10-20 17:12 1240次阅读

    在标准下配置的stm32f103x的spi在引入rtthread后收发的消息就错了,为什么?

    我在标准下配置的stm32f103x的spi在引入rtthread后收发的消息就错了,引入之前没问题,请问这是啥情况
    发表于 10-13 08:07

    GD32的串口DMA收发数据失败怎么解决?

    gd32_hw_usart_init()函数中并未注册DMA收发的方式, GD32该函数如下: 而STM32的该函数如下: 查找GD32的串口操作中相关的一些DMA操作也缺失,不
    发表于 09-17 06:04

    rt-thread stm32 BSP编译不通过,缺乏HAL怎么处理?

    拉取gitee上关于rt-thread master分支的代码进行BSP/stm32f407部分编译时,使用env编译不通过,提示缺乏Libraries下的HAL,这部分我看是缺乏的,然后分支v5.1.0是有的,
    发表于 09-15 07:35

    关于stm32f4zgt6和mspm0g3507串口通信问题

    中段进行数据接收,使用Hal的transmit函数进行数据发送。 当使用m0与电脑(ch340)进行通信时,两者可以正常通信,stm32也是如此。 但是,当m0与stm32进行
    发表于 09-01 11:11

    STM32H7使用HAL如何控制外置USB HS PHY进入低功耗?

    项目使用STM32H7的HAL控制外置USB HS PHY(如USB3300或CH132)的。不知如何让MCU通过ULPI接口写寄存器让USB HS PHY进入低功耗,且USB保持链接状态让PC可以重新唤醒。
    发表于 08-14 07:21

    请问hal的硬件spi,怎么修改spi时钟的占空比?

    请问hal的硬件spi,该怎么修改spi时钟的占空比呀?
    发表于 07-28 07:50

    SPI+DMA一直发会进入HAL_BUSY无法跳出是怎么回事?

    HAL_SPI_STATE_BUSY_TX_RX状态。 通过查看HAL,可以找到State在HAL_SPI_IRQHandler中可被设置为READY状态。但实际使用时,会有中断函
    发表于 07-18 06:38

    STM32F4标准外设资料

    stm32f4xx.h,标准外设
    发表于 06-08 09:49 5次下载

    基于STM32 HAL与标准的esp8266接入机智云方案(二)

    在《基于STM32HAL与标准的esp8266接入机智云方案(一)》中,我们详细介绍了硬件连接和机智云客户端的创建。本篇将重点讲解如何下载代码、分析下载的代码,并直接使用这些代码连接机智云。同时
    的头像 发表于 05-28 18:02 1635次阅读
    基于<b class='flag-5'>STM32</b> <b class='flag-5'>HAL</b><b class='flag-5'>库</b>与标准<b class='flag-5'>库</b>的esp8266接入机智云方案(二)

    HAL15xy_SOT23

    HAL1501SU-A,HAL1502SU-A,HAL1503SU-A,HAL1504SU-A,HAL1505SU-A,
    发表于 05-14 15:03 0次下载