打印
[其他ST产品]

STM32 hal库串口空闲中断最新用法

[复制链接]
695|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
串口在单片机中是使用比较频繁的一部分,一般我们人机交互就会使用到串口。串口的输出比较简单直接调用发送函数即可,接收数据就要稍微麻烦一些,因为我们接收的一般是不定长的数据。但是最近使用到了stm32的串口接收的时候,发现hal库竟然有提供串口空闲中断接收函数,无需配置和自己写中断函数。

使用特权

评论回复
沙发
发送到工地施工|  楼主 | 2022-9-29 11:17 | 只看该作者
串口空闲中断是什么?
一般我们串口接收的时候都是使用的RXNE,接收到一个字节数据就进入一次中断,然后把它放入缓存,但是数据量很大的时候会频繁进入中断影响单片机的时效性。这时就可以使用到IDLE空闲中断,即在接收到一段数据后在一定的时间检测到没有数据到来,就认为此时串口总线空闲便产生一个空闲中断。

使用特权

评论回复
板凳
发送到工地施工|  楼主 | 2022-9-29 11:20 | 只看该作者
使用步骤

1.hal库空闲中断接收函数


在stm32f1xx_hal_uart.h中

//在阻塞模式下接收一定数量的数据,直到接收到预期数量的数据或发生空闲事件。
HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint16_t *RxLen, uint32_t Timeout);
//在中断模式下接收一定数量的数据,直到接收到预期数量的数据或发生空闲事件。
HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
//在DMA模式下接收一定数量的数据,直到接收到预期数量的数据或发生空闲事件。
HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
//使用空闲中断时的接收回调函数
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size);


使用特权

评论回复
地板
发送到工地施工|  楼主 | 2022-9-29 11:23 | 只看该作者
HAL_UARTEx_ReceiveToIdle_IT()
/**
  * [url=home.php?mod=space&uid=247401]@brief[/url] 在中断模式下接收一定数量的数据,直到接收到预期数量的数据或发生空闲事件。
  * [url=home.php?mod=space&uid=536309]@NOTE[/url]   接收由此功能调用启动。由于RXNE和空闲事件引发的UART中断,接收的进一步进展得以实现。在接收结束时调用Callback,指示接收到的数据元素的数量。
  * @param huart UART handle.
  * @param pData        指向数据缓冲区(uint8_t或uint16_t数据元素)的指针。
  * @param Size  要接收的数据元素的大小(uint8_t或uint16_t)。
  * @retval HAL status
  * */
HAL_StatusTypeDef        HAL_UARTEx_ReceiveToIdle_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

使用特权

评论回复
5
发送到工地施工|  楼主 | 2022-9-29 11:24 | 只看该作者
使用方法
1.在主函数中调用HAL_UARTEx_ReceiveToIdle_IT()

使用特权

评论回复
6
发送到工地施工|  楼主 | 2022-9-29 11:38 | 只看该作者
2.然后在回调函数 HAL_UARTEx_RxEventCallback()中做相应处理。

使用特权

评论回复
7
发送到工地施工|  楼主 | 2022-9-29 11:39 | 只看该作者
int main(void)
{
  /* USER CODE BEGIN 1 */
        //__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  //空闲中断接收
  HAL_UARTEx_ReceiveToIdle_IT(&huart1,Uart_ReadCache,410);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

使用特权

评论回复
8
发送到工地施工|  楼主 | 2022-9-29 11:39 | 只看该作者
//空闲中断回调函数,参数Size为串口实际接收到数据字节数
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
        if(huart->Instance==USART1)
        {
                //把收到的一包数据通过串口回传
                HAL_UART_Transmit(&huart1,Uart_ReadCache,Size,0xff);
                //再次开启空闲中断接收,不然只会接收一次数据
                HAL_UARTEx_ReceiveToIdle_IT(&huart1,Uart_ReadCache,410);
        }
}

使用特权

评论回复
9
发送到工地施工|  楼主 | 2022-9-29 11:40 | 只看该作者
最终效果

使用特权

评论回复
10
发送到工地施工|  楼主 | 2022-9-29 11:41 | 只看该作者
使用stm32 hal自带的空闲中断函数后我们通过串口接收不定长的数据变得十分的方便了,只需要调用两个函数即可。

使用特权

评论回复
11
发送到工地施工|  楼主 | 2022-9-29 11:41 | 只看该作者
不像刚开始的时候使用串口空闲中断还的自己开启中断和自己编写中断回调函数,大大地提高了我我们开发的效率。

使用特权

评论回复
12
sdlls| | 2022-10-1 15:29 | 只看该作者
中断时怎么配置NVIC               

使用特权

评论回复
13
pl202| | 2022-10-1 15:43 | 只看该作者
串口空闲中断 怎么总进发送中断

使用特权

评论回复
14
maudlu| | 2022-10-1 16:10 | 只看该作者
stm32中 串口idle中断怎么用

使用特权

评论回复
15
jkl21| | 2022-10-1 16:40 | 只看该作者
stm32串口如果没有接受结束判断会怎样,会有什么情况

使用特权

评论回复
16
juliestephen| | 2022-10-1 17:14 | 只看该作者
串口接收比较好的处理方式              

使用特权

评论回复
17
小分子| | 2022-10-26 11:45 | 只看该作者
F1的可以用吗?

使用特权

评论回复
18
小分子| | 2022-10-28 10:44 | 只看该作者
这也是一个一个收的。HAL_UARTEx_ReceiveToIdle_IT

使用特权

评论回复
19
Undshing| | 2022-11-2 19:55 | 只看该作者
F1系列可以用吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

86

帖子

0

粉丝