//接收完成中断
void DMA2_Stream5_IRQHandler(void)
//空闲中断
void USART1_IRQHandler(void)
接收完成DMA中断与串口空闲中断配置不同的中断优先级,会影响这两个中断函数进入。
空闲中断的优先级高于DMA中断,则DMA中断不会进入该中断函数,空闲中断中后读SR,然后读DR寄存器才能清除本次中断,之后则不能进入DMA中断。
如果DMA中断的优先级高于空闲中断,则先进入DMA中断函数,
DMA_Cmd(DMA2_Stream5, DISABLE); //关闭DMA,防止处理其间有数据
UART1_ReceiveSize =RECEIVE_BUF_SIZE - DMA_GetCurrDataCounter(DMA2_Stream5);
DMA_ClearFlag(DMA2_Stream5,DMA_FLAG_TCIF5 | DMA_FLAG_FEIF5 | DMA_FLAG_DMEIF5 | DMA_FLAG_TEIF5 | DMA_FLAG_HTIF5);//清除DMA2_Steam7传输完成标志
DMA_SetCurrDataCounter(DMA2_Stream5, RECEIVE_BUF_SIZE);
DMA_Cmd(DMA2_Stream5, ENABLE); //打开DMA,防止处理其间有数据
该语句为接收的字节数,DMA_GetCurrDataCounter(DMA2_Stream5)为缓存剩余字节数,RECEIVE_BUF_SIZE 为缓存总数。
清除传输完成标志后也会进入空闲中断函数,但是DMA_SetCurrDataCounter(DMA2_Stream5, RECEIVE_BUF_SIZE);重新设置了缓存大小,则下次进入空闲中断时DMA_SetCurrDataCounter(DMA2_Stream5的缓存大小为RECEIVE_BUF_SIZE大小。
DMA串口发送数据会被其它优先级高的程序打断,造成发送只能发送一半。
while(DMA1_Channel2->CNDTR!=0); 等待发送完成必须要加上