在STM32的HAL库中,HAL_UART_Receive_IT()
函数是一个非常重要的函数,它用于在中断模式下接收UART数据。这个函数可以让开发者在接收到一定数量的数据后,通过回调函数HAL_UART_RxCpltCallback()
来处理这些数据,而不需要在主循环中不断检查数据是否已经接收完毕。
函数原型
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
huart
:UART句柄,指向一个有效的UART_HandleTypeDef结构体实例,该结构体包含了UART的配置信息。pData
:指向数据缓冲区的指针,用于存储接收到的数据。Size
:要接收的数据元素(u8或u16)的数量。
函数功能
HAL_UART_Receive_IT()
函数的主要功能是在中断模式下启动UART接收操作。当UART接收到数据后,会自动填充到指定的缓冲区pData
中,直到接收到Size
指定的数据量。接收完成后,会自动触发回调函数HAL_UART_RxCpltCallback()
。
使用步骤
-
初始化UART:首先,需要使用
HAL_UART_Init()
函数初始化UART,配置波特率、字长、停止位、奇偶校验等参数。 -
调用
HAL_UART_Receive_IT()
:在主函数或任何需要接收数据的地方调用此函数,传入UART句柄、数据缓冲区指针和接收数据的大小。 -
实现回调函数:实现
HAL_UART_RxCpltCallback()
回调函数,在此函数中处理接收到的数据。
代码示例
以下是一个使用HAL_UART_Receive_IT()
函数接收数据的示例代码:
#include "stm32f1xx_hal.h"
UART_HandleTypeDef huart1;
uint8_t Rx_Data[10]; // 接收数据缓冲区
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
// 启动UART接收,接收10个字节的数据
HAL_UART_Receive_IT(&huart1, Rx_Data, sizeof(Rx_Data));
while (1) {
// 主循环中的其他任务
}
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if (huart->Instance == USART1) {
// 处理接收到的数据
for (int i = 0; i < sizeof(Rx_Data); i++) {
// 将接收到的数据发送回去,实现回显功能
HAL_UART_Transmit(&huart1, &Rx_Data[i], 1, 10);
}
// 再次启动接收,准备接收下一批数据
HAL_UART_Receive_IT(&huart1, Rx_Data, sizeof(Rx_Data));
}
}
/**
* @brief 系统时钟配置
* @param 无
* @retval 无
*/
void SystemClock_Config(void) {
// 系统时钟配置代码
}
/**
* @brief GPIO初始化
* @param 无
* @retval 无
*/
static void MX_GPIO_Init(void) {
// GPIO初始化代码
}
/**
* @brief USART1初始化
* @param 无
* @retval 无
*/
static void MX_USART1_UART_Init(void) {
huart1.Instance = USART1;
huart1.Init.BaudRate = 9600;
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();
}
}
/**
* @brief 错误处理函数
* @param 无
* @retval 无
*/
void Error_Handler(void) {
// 用户可以添加错误处理代码
while (1) {
}
}
在这个示例中,我们首先初始化了UART1,并设置了波特率为9600。然后,我们调用HAL_UART_Receive_IT()
函数启动UART接收,接收10个字节的数据。当接收完成后,会自动调用HAL_UART_RxCpltCallback()
回调函数,我们在该函数中处理接收到的数据,并再次启动接收,准备接收下一批数据。
注意事项
-
中断使能:在使用
HAL_UART_Receive_IT()
函数之前,需要确保UART的接收中断已经使能。 -
缓冲区大小:确保提供的缓冲区大小足够大,能够存储预期接收的数据量。
-
回调函数:在回调函数中,除了处理接收到的数据外,还需要重新启动接收操作,以便持续接收数据。
通过使用HAL_UART_Receive_IT()
函数,可以方便地在中断模式下接收UART数据,提高程序的效率和响应速度。这种机制特别适合于需要实时处理数据的应用场景,如串口通信、数据采集等。
✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进
❤欢迎关注我的知乎:对error视而不见
代码获取、问题探讨及文章转载可私信。
☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。
🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇