0%

STM32-HAL折腾杂记(二)

基于HAL实现STM32串口中断接收。

MCU:STM32F103C8T6

HAL:STM32Cube_FW_F1_V1.8.4

用到的串口相关函数

串口发送数据

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

串口发送指定长度的数据,若超时没完成发送,则停止发送并返回超时标志(HAL_TIMEOUT)。

  • UART_HandleTypeDef *huart:使用的串口的别名
  • uint8_t *pData:待发送的数据
  • uint16_t Size:待发送数据的长度(单位:字节)
  • uint32_t Timeout:最大发送时间

串口中断接收数据

HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

串口中断接收指定长度的数据;串口接收到数据时,触发串口中断,直至接收完指定长度的数据,关闭中断,进入接收中断回调函数,只触发一次中断

  • UART_HandleTypeDef *huart:使用的串口的别名
  • uint8_t *pData:存储接收到的数据
  • uint16_t Size:接收到的数据的长度

接收中断回调函数

__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

弱函数,我在main.c文件中重新定义。

串口状态查询函数

HAL_UART_StateTypeDef HAL_UART_GetState(UART_HandleTypeDef *huart)

判断数据接收或发送是否完成。

STM32CubeMX配置

选择USART1,工作模式选择为异步通信(Asynchronous),波特率设置为115200,每帧数据字长8比特,无奇偶校验,停止位为1比特,数据传输方向为接收和发送,还需要允许USART1触发中断;其它设置照旧不变。

程序源码

main.c文件中引用头文件string.h,因为需要清空数组(数组保存了接收到的数据);

#include "string.h"

main.c文件中定义变量;

char RX_Buffer[64];		//接收到的数据,最大接收64字节
uint8_t RX_Buffer_Interrupt; //接收中断缓冲
uint8_t RX_Count=0; //接收中断计数

还是main.c文件,在主函数下调用一次接收中断函数;

HAL_UART_Receive_IT(&huart1,(uint8_t *)&RX_Buffer_Interrupt,1);

main.c文件末尾处自定义接收中断回调函数;

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)		//接收中断回调函数
{
UNUSED(huart);

if(RX_Count>=64) //溢出判断
{
RX_Count=0;
memset(RX_Buffer,0x00,sizeof(RX_Buffer)); //将数组清空
HAL_UART_Transmit(&huart1,(uint8_t *)"数据溢出",10,0xFFFF);
}
else
{
RX_Buffer[RX_Count++]=RX_Buffer_Interrupt; //将接收到的数据转存

if((RX_Buffer[RX_Count-1]==0x0A)&&(RX_Buffer[RX_Count-2]==0x0D)) //结束位判断
{
HAL_UART_Transmit(&huart1,(uint8_t *)&RX_Buffer,RX_Count,0xFFFF); //将接收到的数据再发送
while(HAL_UART_GetState(&huart1)==HAL_UART_STATE_BUSY_TX); //发送结束判断
RX_Count=0;
memset(RX_Buffer,0x00,sizeof(RX_Buffer));
}
}

HAL_UART_Receive_IT(&huart1,(uint8_t *)&RX_Buffer_Interrupt,1); //再次调用接收中断函数,使得程序能重新触发中断
}

运行结果

单次发送数据不超过64字节;

单次发送数据超过64字节。

避坑:MCU核心板需要由USB转TTL模块供电(5V),否则,数据无法正常收发。


参考资料

【STM32】HAL库 STM32CubeMX教程四—UART串口通信详解