stm32 uart dma方式接收不定长度字符

一般处理:

stm32 uart使用dma接收时,会有自己的数据流中断,数据流中断会调用HAL_UART_RxCpltCallback。但是数据流中断只会在HAL_UART_Receive_DMA函数指定的buffer满时才会触发。

接收不定长度字符,需要和uart的UART_IT_IDLE结合。

两种结合方式

第一种:(习惯标准库的程序员)

步骤

step1 初始化

1.__HAL_UART_ENABLE_IT(&huart,UART_IT_IDLE);

2.HAL_UART_Receive_DMA(&huart,uartRxBuf,size);

step2 中断 UART_IRQHandler中: 

if((__HAL_UART_GET_FLAG(&huart,UART_FLAG_IDLE)!=RESET))

{

      任务处理;

       __HAL_UART_ENABLE_IT(&huart,UART_IT_IDLE);

}   

第二种:(重新实现hal库中的回调)

step1 初始化

HAL_UARTx_ReceiveToIdle_DMA();

step2 中断UART_IRQHandler

不需要做任何事情

step3

实现回调

void HAL_UARTEx_RxEventCallback(huart,size)

{

    //任务处理

    //重新调用 HAL_UARTx_ReceiveToIdle_DMA,重置DMA处理接收字符的位置

   

}

size是当前串口空闲时已经接收字符的个数

你可能感兴趣的:(stm32,单片机,嵌入式硬件)