问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STM32F103通过HAL库实现串口中断收发数据

创作时间:
作者:
@小白创作中心

STM32F103通过HAL库实现串口中断收发数据

引用
CSDN
1.
https://blog.csdn.net/Jin_Apple/article/details/142100390

本文将详细介绍如何使用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库实现串口中断收发数据。这对于从事嵌入式系统开发的工程师来说,具有重要的参考价值。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号