STM32F103通过HAL库实现串口中断收发数据
STM32F103通过HAL库实现串口中断收发数据
本文将详细介绍如何使用STM32F103C8T6微控制器和HAL库实现串口中断收发数据。文章从串口通信的基础知识入手,逐步讲解了如何使用Cubemx配置串口,并通过具体代码示例展示了串口数据的发送与接收过程。
一、通讯基础知识
1.全双工、半双工与单工
在串口通信中,通信方式可以分为单工、半双工和全双工。
- 单工:通信双方中,一方只能发送数据,另一方只能接收数据,不能同时进行数据交换。
- 半双工:通信双方可以互相通信,但不能同时进行,必须等待一方完成发送后,另一方才能开始发送。
- 全双工:通信双方可以同时进行数据发送和接收,互不干扰。
2.同步与异步
串口通信可以分为同步和异步两种方式。同步通信需要时钟信号来同步数据传输,而异步通信则不需要时钟信号,通过起始位和停止位来标识数据包的开始和结束。
3.波特率
波特率是串口通信的重要参数,表示每秒钟可以传输的二进制位数。例如,9600波特率表示每秒钟可以传输9600个二进制位。
二、串口通讯
1.串口通讯简介
串口通信是一种常见的数据传输方式,其主要特点包括:
- 串行传输:数据以位为单位,按顺序一位接一位地通过单一通道进行传输。
- 点对点通信:串口通信通常是两个设备之间的直接连接。
- 全双工或半双工:串口通信可以是全双工(同时进行数据发送和接收)或半双工(交替进行数据发送和接收)。
- 异步或同步:串口通信可以是异步的(不需要时钟信号同步)或同步的(需要额外的时钟信号来同步数据传输)。
2.物理层
串口通信中,数据的传输需要遵循一定的电平标准。常见的标准包括TTL和RS232。
- TTL标准使用5V表示逻辑1,0V表示逻辑0。
- RS232标准使用-15V表示逻辑1,+15V表示逻辑0。
由于RS232电平标准的信号不能直接被控制器识别,因此需要通过电平转换芯片将RS232信号转换为控制器能识别的TTL信号。
3.通讯协议
串口通信的数据包通常由起始位、主体数据、校验位和停止位组成。通信双方需要约定一致的数据包格式才能正常收发数据。
三、使用Cubemx配置串口
1.硬件准备
使用STM32F103C8T6微控制器,通过Cubemx进行串口配置。
2.配置步骤
- 打开Cubemx,选择STM32F103C8T6芯片型号。
- 配置外部晶振和时钟树。
- 选择异步串口模式,并勾选串口中断。
- 设置波特率为115200。
3.生成代码
生成代码时,选择MDK-ARM开发环境,并设置保存路径。
四、串口的发送与接收
1.常用函数
HAL库提供了多种串口操作函数:
HAL_UART_Transmit()
:阻塞模式下发送大量数据。HAL_UART_Receive()
:阻塞模式下接收数据。HAL_UART_Transmit_IT()
:中断模式发送数据。HAL_UART_Receive_IT()
:中断模式接收数据。HAL_UART_Transmit_DMA()
:DMA模式发送数据。HAL_UART_Receive_DMA()
:DMA模式接收数据。HAL_UART_IRQHandler()
:串口中断处理函数。HAL_UART_TxCpltCallback()
:串口发送完成回调函数。HAL_UART_RxCpltCallback()
:串口接收完成回调函数。HAL_UART_ErrorCallback()
:串口错误处理函数。
2.数据发送
使用HAL_UART_Transmit()
函数发送数据:
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
参数说明:
huart
:指向UART_HandleTypeDef结构体的指针,包含UART模块的配置信息。pData
:指向数据缓冲区的指针,包含要发送的数据。Size
:要发送的数据元素数量。Timeout
:超时时间。
3.数据接收
使用HAL_UART_Receive()
函数接收数据:
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
参数说明与发送函数类似。
4.中断方式收发
使用中断方式接收数据时,需要在HAL_UART_RxCpltCallback()
函数中重新调用接收函数,以实现连续接收:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART1)
{
HAL_UART_IRQHandler(&huart1);
HAL_UART_Receive_IT(&huart1,test,1);
}
}
这样可以确保每次接收完成后,自动触发下一次接收操作。
总结
通过本文的介绍,读者可以掌握STM32F103C8T6微控制器的串口通信基础知识,并能够使用HAL库实现串口中断收发数据。这对于从事嵌入式系统开发的工程师来说,具有重要的参考价值。