STM32 HAL库之串口接收不定长字符

news/2024/12/23 21:36:06/

背景

        在项目开发过程中,经常会使用MCU的串口与外界进行通信,例如两个单片机之间TTL电平型串口通信,单片机与成熟电路模块之间的串口通信等等.... 如何高效的使用串口是开发人员必须关注的问题。

        STM32的HAL库为我们提供了三种串口通信机制:

(1)查询方式。

        查询方式主要采用查询串口状态寄存器接收和发送相关标志,知道数据发送或接收成功。发送一般可采用这种方式,接收采用这种方式效率比较低。

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

(2)中断方式

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

(3)DMA方式

        DMA的方式主要采用以下两个函数。但该函数内部机制都是打开DMA通道中断,采用的是DMA中断的方式。但在使用的过程中,可关闭DMA中断,直接采用DMA接收和放送,降低了CPU负载。

HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

应用

        串口发送数据可直接采用查询和DMA的方式发送,尽量不采用中断方式(包括DMA中断方式)。串口接收数据具有随机性,一般采用中断方式和DMA中断接收,前者一般单字节触发接收,后者一般定长字符触发DMA中断接收。但对于接收字符长度和时间不确定问题,一般可采用串口空闲中断+DMA接收机制。

      空闲中断的概念

        接收数据后RXNE置位,且之后间隔一个字节的时钟未收到数据则触发IDLE中断。

        (1)按照配置工具正常配置,打开串口中断和DMA接收

        (2)关闭DMA中断

static void MX_DMA_Init(void)
{/* DMA controller clock enable */__HAL_RCC_DMA1_CLK_ENABLE();/* DMA interrupt init *//* DMA1_Channel5_IRQn interrupt configuration */
//  HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 0, 0);
//  HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn);}

        (3)串口配置空闲中断,使能DMA接收。

#define  UART_REV_SIZE   50
uint8_t  gRevBuff[UART_REV_SIZE] = {0};
static void MX_USART1_UART_Init(void)
{/* USER CODE BEGIN USART1_Init 0 *//* USER CODE END USART1_Init 0 *//* USER CODE BEGIN USART1_Init 1 *//* USER CODE END USART1_Init 1 */huart1.Instance = USART1;huart1.Init.BaudRate = 115200;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;if (HAL_UART_Init(&huart1) != HAL_OK){Error_Handler();}/* USER CODE BEGIN USART1_Init 2 */__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);HAL_UART_Receive_DMA(&huart1, gRevBuff, UART_REV_SIZE);/* USER CODE END USART1_Init 2 */
}

        (4)串口中断处理

        在串口中断添加如下处理。

void USART1_IRQHandler(void)
{/* USER CODE BEGIN USART1_IRQn 0 */uint16_t  revLen = 0;/* USER CODE END USART1_IRQn 0 */HAL_UART_IRQHandler(&huart1);/* USER CODE BEGIN USART1_IRQn 1 */if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE)==1){HAL_UART_DMAStop(&huart1);__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_IDLE);revLen = UART_REV_SIZE - __HAL_DMA_GET_COUNTER(huart1.hdmarx);HAL_UART_Receive_DMA(&huart1, gRevBuff, UART_REV_SIZE);}/* USER CODE END USART1_IRQn 1 */
}

   结论

               在线断点调试,串口中断不会频繁进入,有效降低了CPU负载。


http://www.ppmy.cn/news/1557563.html

相关文章

大数据新视界 -- Hive 数据仓库:架构深度剖析与核心组件详解(上)(1 / 30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

Mono里运行C#脚本1

前面已经知道怎么样把C#的源码通过MCS编译器生成exe的文件,然后我们还把 exe的文件进行反汇编查看,知道我们需要处理的目标,就是这些汇编的代码。接着下来,我们就将要来探究mono是怎么样去运行这些代码的。 一般来说,要运行这些代码,要经历几个阶段:建立垃圾回收内存…

linux上vlc安装

方式一:linux可以连外网的 直接使用命令 sudo snap install vlc方式二:linux连不上外网的 我是在虚拟机中下载的,不太好连接外网,可以直接在Ubuntu Software 中进行搜索下载

深度学习:数据集:训练集、验证集和测试集

深度学习:数据集:训练集、验证集和测试集 在深度学习领域中,合理地划分数据集是确保模型有效学习并能够泛化到新数据上的关键环节。通常,一个完整的数据集会被分为三个部分:训练集(Training Set&#xff0…

[机器学习]XGBoost(2)——目标函数(公式详解)

前置知识详见[机器学习]XGBoost(1)——前置知识 知识回顾 在学习目标函数之前,先来回顾一下加法模型和前向分步算法的知识 注意: 在前向分步算法中,通常使用 t 来表示当前的步骤或迭代次数。用 M 表示回归树的总数…

方正畅享全媒体采编系统reportCenter.do接口SQL注入漏洞复现 [附POC]

文章目录 方正畅享全媒体采编系统reportCenter.do接口SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现方正畅享全媒体采编系统reportCenter.do接口SQL注入漏洞复现 [附POC] 0x01 前言 免责声明:请勿利…

Ubuntu Netlink 套接字使用介绍

Netlink 套接字 是 Linux 特有的一种 IPC(进程间通信)机制,用于用户态进程和内核模块之间的通信。它可以用来完成路由管理、设备通知、网络状态更新等任务。 1. Netlink 的基本工作原理 Netlink 是一种双向通信机制。Netlink 消息分为请求和…

一款轻量级的开源笔记服务软件

大家好,我是兔兔,一位写作爱好者,今天分享的内容是,如何搭建一个开源的、隐私优先的轻量级笔记服务应用。 不知道大家是否有这样的需求: 1、自己想搭建一个个人的学习笔记文档,既要自己看也可以单独分享给…