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緩存的大小
