stm32 hal 库函数 空闲中断接受不定长数据 注意事项

初始化阶段: 

 __HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);                               //使能IDLE中断

  __HAL_UART_CLEAR_IDLEFLAG(&huart3);                          // 必须要用不然会没有发任何数据会进入一次空闲中断

  HAL_UART_Receive_DMA(&huart3, (u8 *)&rx_buffer[0].rx_buffer, 255); //重新启动接收

主循环

    if (recv_end_flag == 1)

      {

      HAL_UART_Receive_DMA(&huart3,  (u8 *)&rx_buffer[rx_buffer_writer].rx_buffer, 255); //重启DMA传输 每次255字节数据

      recv_end_flag = 0;    

      }

中断处理函数:

void USART3_IRQHandler(void)

{

    /* USER CODE BEGIN USART3_IRQn 0 */

    uint32_t tmp_flag = 0;

    /* USER CODE END USART3_IRQn 0 */

    HAL_UART_IRQHandler(&huart3);

    /* USER CODE BEGIN USART3_IRQn 1 */

    tmp_flag = __HAL_UART_GET_FLAG(&huart3, UART_FLAG_IDLE); //获取IDLE标志

    if ((tmp_flag != RESET))                                 //idle标志被置

    {

        HAL_UART_DMAStop(&huart3);                                                         // 必须停止不然 没法设置 重启 接受

        __HAL_UART_CLEAR_IDLEFLAG(&huart3);                                                //清除标志

        rx_buffer[rx_buffer_writer].rx_len = 255 - __HAL_DMA_GET_COUNTER(&hdma_usart3_rx); //计算接收到的数据长

        rx_buffer_writer++;

        recv_end_flag = 1; // 接受完成标志位置1

    }

 

    /* USER CODE END USART3_IRQn 1 */

}

STM32中,空闲中断使用了HAL库函数HAL_UART_IDLECallback()。该函数在UART空闲中断发生时被调用,以处理接收到的数据。 举个例子,假设我们要在STM32上实现串口接收数据,并在空闲中断时处理数据。首先,我们需要初始化串口功能,使用HAL_UART_Init()函数初始化UART外设。接着,我们需要启用空闲中断,使用HAL_UART_Receive_IT()函数启用空闲中断,并指定接收缓冲区和缓冲区大小。 一旦启用空闲中断,当串口接收到数据并进入空闲状态时,HAL_UART_IDLECallback()函数就会被调用。在该函数中,我们可以读取接收缓冲区中的数据,并进行相应的处理,如打印、存储等等。 下面是一个简单的示例代码: ``` UART_HandleTypeDef huart1; uint8_t rx_buffer[10]; void HAL_UART_IDLECallback(UART_HandleTypeDef *huart) { if (huart == &huart1) { uint16_t rx_len = sizeof(rx_buffer) - huart1.RxXferCount; // 处理接收到的数据 printf("Received %d bytes: %s\n", rx_len, rx_buffer); // 重新启用接收中断 HAL_UART_Receive_IT(&huart1, rx_buffer, sizeof(rx_buffer)); } } int main(void) { HAL_UART_Init(&huart1); HAL_UART_Receive_IT(&huart1, rx_buffer, sizeof(rx_buffer)); while (1) { // 等待空闲中断发生 } } ``` 在上面的示例代码中,我们在空闲中断回调函数中处理接收到的数据,并重新启用接收中断,以便下一次接收。这样,我们就能够实现在STM32中使用空闲中断处理串口数据的功能了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值