|
求助硬汉哥及各位大侠,我昨天做了一个在stm32f407上的串口空闲中断加DMA接收方式来实现串口接收不定长数据的程序,最后测试都正常,数据收的也对的。很高兴,但是晚上不经意间在DMA的中断服务函数中打了个断点,结果吓我一跳,这个断点一直会被触发,看状态寄存器,却都是0,是谁把中断搞出的呢?
DMA配置:外设到缓存,循环模式,不用FIFO,buffer:1024B,开启了传输完成中断,DMA1_Stream0,CH4
串口配置:UART5,开始了空闲中断
OS:使用了uC/OS-II
下面是相关程序:
DMA接收完成中断处理函数:- void DMA1_Stream0_IRQHandler(void)//UART5,RX,DMA1_Stream0,CH4
- {
- OS_ENTER_CRITICAL();
- OSIntEnter();
- OS_EXIT_CRITICAL();
- if(DMA_GetFlagStatus(Streamx, FLAG_TCIFx))
- {
- OSQPost(MsgQ_Disp, (void *)temp); //2016-03-15
- }
- DMA_ClearFlag(Streamx, FLAG_TCIFx);
- OSIntExit();
- }
复制代码 串口5空闲中断处理函数:- void UART5_IRQHandler(void)
- {
- OS_ENTER_CRITICAL();
- OSIntEnter();
- OS_EXIT_CRITICAL();
- if(UART5->SR & (BIT4))
- {
- res=UART5->DR;//清USART_IT_IDLE标志序列
- DMA_Cmd(Streamx, DISABLE);
- index=Data_Buffer-DMA_GetCurrDataCounter(Streamx);
- if((Data[index-2]==0xAA)&&(Data[index-1]==0x55))
- {
- OSQPost(MsgQ_Disp, (void *)temp); //2016-03-15
- }
- DMA_SetCurrDataCounter(Streamx,Data_Buffer);
- DMA_ClearFlag(Streamx, FLAG_TCIFx);
- DMA_Cmd(Streamx, ENABLE);
- }
- OSIntExit();
- }
复制代码 |
|