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

发布者:温暖拥抱最新更新时间:2024-07-22 来源: elecfans关键字: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库提供了简单易用的函数和方法,使得开发者可以轻松地实现串口通信功能,提高了程序的可读性和可维护性。

关键字:STM32  HAL库  串口收发 引用地址:STM32 HAL库串口收发是如何使用的?

上一篇:STM32电源框架图解析
下一篇:STM32CUBEIDE(1)----安装

推荐阅读最新更新时间:2026-03-23 12:12

STM32Cumebx HAL库实现STM32 USB虚拟串口收发
  这里记录一下用STM32Cumebx实现USB虚拟串口的过程,以F072为例大家可以一起学习讨论一下。 1.新建工程      这里选择SW烧录调试,看个人习惯,如果不习惯用SW的你们可以换其他的也行。   我这里因为直接使用MCU的内部时钟就没有勾选RCC了,然后直接配置时钟树,具体如下:   最后一点比较重要点的就是要配置USB堆的大小,把它改大一点,不然容易出现电脑实现出现黄色感叹号情况,这里选的编译软件是MDK-ARM。   最后编译生成代码 2.用keil打开工程编辑   找到usb_cdc_if.c文件,在文件开始处添加接收USB转串口数
[单片机]
STM32Cumebx <font color='red'>HAL库</font>实现<font color='red'>STM32</font> USB虚拟<font color='red'>串口</font>的<font color='red'>收发</font>
STM32HAL库普通模式串口收发
一.简单了解 串口模式实现有三种 1.普通模式:在主函数中接收函数 2.中断模式:产生的不影响主程序运行 3. DMA模式:与主函数互不影响,独立运行 本文记录第一种普通模式。 学习目标是:实现普通串口的数据收发,发送数据时LED灯电平翻转。 二.步骤 步骤1:在STM32CUBEMX中创建好工程,我这里用的是小熊派的STM32L431RCT6开发板,需要配置的有LED灯,PC13为output。uart1为异步收发全双工,时钟为80Mhz。 步骤2:打开工程文件,在uart.c中,包含标准头文件以及实现串口的重定向 #include stdio.h int fputc(int ch,FILE* f) { uint
[单片机]
STM32<font color='red'>HAL库</font>普通模式<font color='red'>串口</font><font color='red'>收发</font>
STM32HAL库DMA模式串口收发
一.简单了解 串口模式实现有三种 1.普通模式:在主函数中接收函数 2.中断模式:产生的不影响主程序运行 3. DMA模式:与主函数互不影响,独立运行 本文记录第一种普通模式。 学习目标是:实现DMA串口的数据收发,发送数据时LED灯电平翻转。 二.步骤 1-在原来工程基础上,在stm32cubemx中增加dma,usart1中的DMA Settings,ADD USART1_RX循环接收和USART1_TX单次发送 2-添加MDA宏定义代码 #define UART1_DMA uint8_t TdataDMA ={ welcome to uart DMA!rn }; uint8_t Rdata; 3-在主函数添加
[单片机]
stm32收发串口通信程序解读
今天学习了串口通信,在正点原子库函数模板中写了自收发的程序, void my_usart1_init(void) { GPIO_InitTypeDef gpio; //创建GPIO的初始化结构体 USART_InitTypeDef usart;//创建USART的初始化结构体 NVIC_InitTypeDef nvic;//创建NVIC的初始化结构体 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1的时钟 gpio
[单片机]
STM32入门——第二天学习串口收发
第二步 学习串口, 实现串口收发 学习之前先了解几个重要的寄存器: 串口时钟使能,GPIO相应时钟使能:APB2ENR、APB1ENR GPIOx模式设置:GPIOX_CRL/ODR ,如图: 输出位应设置为推挽复用输出 接收位设为浮空输入或带上拉输入,设置方法参看前一篇讲解。 串口复位: APB2RSTR 、 APB1RSTR 串口波特率设置: USART_BRR 串口控制:USART_CR1~3 初步只用到USART_CR1,UE 为串口使能位,使串口开始工作;M 为字长选择位,8或9位数据;PCE 为校验使能位,0禁止校验;PS 为校验位选择,设置为 0 则为偶校验,否则为奇校验;TCIE 为发
[单片机]
<font color='red'>STM32</font>入门——第二天学习<font color='red'>串口</font><font color='red'>收发</font>
STM32中485采用串口DMA发送,切换收发状态问题
RS485使用DMA发送,切换收发状态,有以下几种实现方式: 开启DMA的“发送完成中断”,在DMA的发送完成中断中,切换收发的状态。但是,这会导致最后的2个字节发送不出去,这是因为:DMA的“发送完成中断”出现在刚发送倒数第二个字节的起始位置,这个时候切换485的收发,若接收端不是奇校验的话 将会误收到0xFF 最后第一肯定也出不去。 网上提供的解决办法是:①在DMA的TC中断里面 加大于两个字节的延时 这是OK的。 ②在DMA的TC中断里面 开启USART的“发送完成中断” 去USART的中断里面去处理 这是OK的。 看数据手册,可以利用串口的“发送完成中断TC”实现。开启USART的DMA,开启DMA传输通道,开启USA
[单片机]
<font color='red'>STM32</font>中485采用<font color='red'>串口</font>DMA发送,切换<font color='red'>收发</font>状态问题
STM32串口的485收发控制角的电平控制
关于485电平控制,如果在发送中断处理后边直接电平转换,会导致发送数据不全,如果加入一定延时,然后在进行电平转换,可以解决这个问题,但略显笨重。解决方法是开启发送完成中断:USART_IT_TC(Transmission complete interrupt)可以完成精准控制,需要注意的是,这个中断没发送完一个字节都会产生,因此建议在最后一个字节装入发送缓存器后再开启。 void USART1_IRQHandler(void) { CPU_INT08U rx_data; CPU_INT08U tx_data; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
[单片机]
stm32串口中断接收发送实验
int main() { u32 i = 0; /*芯片配置初始化----------------------------------------------------------*/ RCC_Configuration(); //复位和时钟控制配置 NVIC_Configuration(); //嵌套中断向量控制器配置 GPIO_Configuration(); //I/O配置 USART_Configuration(); //串口配置 /*指示灯初始化------------
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved