STM32F4的HAL库开启串口空闲中断

本文详细介绍了如何在STM32上使用HAL库实现串口空闲中断的功能,包括使能中断、判断中断状态及清除中断标志位的方法,并提供了具体的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

串口接收数据时,开启空闲中断后可在接收完成触发中断,再去做进一步处理,但找了半天没找掉HAL库的使能某中断的函数,以及判断是哪个中断触发的函数,原来在stm32f4xx_hal_uart.h中有相关宏定义。


  • 使能中断的宏定义
__HAL_UART_ENABLE_IT(__HANDLE__, __INTERRUPT__)
  • 判断是触发哪个中断的宏定义
__HAL_UART_GET_FLAG(__HANDLE__, __IT__)
  • 清除IDLE的中断标志位的宏定义
__HAL_UART_CLEAR_IDLEFLAG(__HANDLE__)

我是要开启所有串口的空闲中断,所以在stm32f4xx_hal_uart.c中的HAL_UART_Init()函数中添加了使能串口空闲中断的宏定义

    /*Enable the IDLE Interrupt*/
    __HAL_UART_ENABLE_IT(huart,UART_IT_IDLE);

然后在stm32f4xxit.c中向对应的串口中断服务函数中添加判断是否为空闲中断,若是空闲中断则进入空闲中断处理函数,空闲中断处理函数是自己写的。

if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE) != RESET)
{
    UART_IDLECallBack(&huart1);
}

进入串口的空闲中断服务函数后,清除空闲中断标志位,然后在做自己想对数据做的处理。

void UART_IDLECallBack(UART_HandleTypeDef *huart)
{
    /*uart1 idle processing function*/
    if(huart == &huart1)
    {
        __HAL_UART_CLEAR_IDLEFLAG(&huart1);
        /*your own code*/
    }
    /*uart2 idle processing function*/
    if(huart == &huart2)
    {
        __HAL_UART_CLEAR_IDLEFLAG(&huart2);
        /*your own code*/
    }
    /*uart3 4 5 6... idle processing function*/
    ...     ...

}
### STM32F4 HAL实现串口中断接收不定长数据 为了在STM32F4上使用HAL通过串口接收不定长的数据,可以采用空闲中断方法。这种方法利用了USART的IDLE线状态检测功能来判断一帧数据是否结束。 #### 初始化配置 首先,在`usart.h`文件中定义必要的头文件和全局变量: ```c #include "stdio.h" #include "string.h" #define BUFFER_SIZE 100 extern volatile uint8_t rx1_len; // 接收一帧数据的长度[^1] extern volatile uint8_t rec1_end_flag; // 一帧数据接收完成标志 extern uint8_t rx1_buffer[BUFFER_SIZE]; // 接收数据缓存数组 void Usart1_Handle(void); void DMA_Usart1_Send(uint8_t *buf, uint8_t len); // 串口发送封装 void Usart1_IDLE(void); ``` 接着,在主程序或其他适当位置初始化这些外部变量并设置UART参数: ```c volatile uint8_t rx1_len = 0; volatile uint8_t rec1_end_flag = 0; uint8_t rx1_buffer[BUFFER_SIZE]; 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(); } } ``` #### 中断处理函数 编写用于响应USART IDLE事件的回调函数,当接收到完整的消息时触发此函数: ```c void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) { if(huart->Instance==USART1){ /* 如果是来自USART1的调用 */ if(Size>0){ rx1_len=Size; rec1_end_flag=1; } } } void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) { if(huart->Instance==USART1){ // 错误处理逻辑... } } ``` 最后,启动异步读取操作以监听传入的消息流: ```c if(HAL_UARTEx_ReceiveToIdle_IT(&huart1,rx1_buffer,BUFFER_SIZE)!=HAL_OK){ Error_Handler(); } ``` 以上代码片段展示了如何基于STM32 HAL构建一个简单的框架来捕获未知大小的信息包。每当硬件检测到线路处于闲置状态(即没有活动信号),就会自动停止当前传输并将已收集的内容传递给应用程序层进行进一步分析或存储。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

izar

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

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

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

打赏作者

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

抵扣说明:

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

余额充值