串口1配合DMA接收不定長數據(空閑中斷+DMA接收)


1、空閑中斷和別的接收完成(一個字節)中斷,發送完成(發送寄存器控)中斷的一樣是串口中斷

2、空閑中斷是接收到一個數據以后,接收停頓超過一字節時間  認為楨收完,總線空閑中斷是在檢測到在接收數據后,數據總線上一個字節的時間內,沒有再接到數據后發生。也就是RXNE位被置位之后,才開始檢測,只被置位一次,除非再次檢測到RXNE位被置位,然后才開始檢測下一次的總線空閑。一次RXNE位被置位只進行一次。

實現思路:

    采用串口1,並配置成空閑中斷模式且使能DMA接收,並同時設置接收緩沖區和初始化DMA。那么初始化完成之后,當外部給單片機發送數據的時候,假設這幀數據長度是100個字節,那么在單片機接收到一個字節的時候(RXNE位被置位)並不會產生串口中斷,而是DMA在后台把數據默默地搬運到你指定的緩沖區里面。當整幀數據發送完畢之后(接收停頓超過一字節時間)串口才會產生一次中斷,此時可以利用DMA_GetCurrDataCounter();函數計算出本次的數據接受長度,從而進行數據處理。

    就是在串口空閑中斷中使用 Usart1RecLen = DMARecLen-DMA_GetCurrDataCounter(DMA1_Channel5); //算出接本幀數據長度 = DMA緩存的大小 - 剩余 DMA緩存大小

    配置時候注意:

    USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//開啟空閑中斷

    DMA_InitStructure.DMA_BufferSize = DMA_Rec_Len;  //DMA通道的DMA緩存的大小

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM