STM32 HAL库函数——HAL_UART_Receive_IT()详解

在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()

使用步骤

  1. 初始化UART:首先,需要使用HAL_UART_Init()函数初始化UART,配置波特率、字长、停止位、奇偶校验等参数。

  2. 调用HAL_UART_Receive_IT():在主函数或任何需要接收数据的地方调用此函数,传入UART句柄、数据缓冲区指针和接收数据的大小。

  3. 实现回调函数:实现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()回调函数,我们在该函数中处理接收到的数据,并再次启动接收,准备接收下一批数据。

注意事项

  1. 中断使能:在使用HAL_UART_Receive_IT()函数之前,需要确保UART的接收中断已经使能。

  2. 缓冲区大小:确保提供的缓冲区大小足够大,能够存储预期接收的数据量。

  3. 回调函数:在回调函数中,除了处理接收到的数据外,还需要重新启动接收操作,以便持续接收数据。

通过使用HAL_UART_Receive_IT()函数,可以方便地在中断模式下接收UART数据,提高程序的效率和响应速度。这种机制特别适合于需要实时处理数据的应用场景,如串口通信、数据采集等。

✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进

❤欢迎关注我的知乎:对error视而不见

代码获取、问题探讨及文章转载可私信。

☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇

点击领取更多详细资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI_Guru人工智能

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值