遇到一个问题好多天了,我用STM32开发了一块电路板,其中USART3的通讯采用DMA发送和接收(接收字节已知),工作流程:在DMA1_CH2发送完成后进入中断,中断中将RS485芯片设置为接收状态并开启定时器3(定时时间500ms),如果在500ms内接受到数据,则在DMA1_CH3中断中关闭定时器3,如果没接收到数据则进入定时器3中断报警。 问题:不管定时器3的时间设置为多少(甚至1s),在连续运行时都会进入定时器3中断报警,而事实上数据发送完后很快就有数据返回(小于200ms)!而且如果同时在DMA1_CH3中断(接收中断)和定时器3的中断内设置断点,则一切正常(不会进入定时器3报警)!如果只在定时器3内设置断点,则仍会进入定时器3中断,最大的疑问是设置断点后正常,请高手指点! 下面是一些程序代码: void TIM3_IRQHandler(void) //定时器3中断 { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM3, TIM_IT_Update); TIM_DeInit(TIM3); // TIM_Cmd(TIM3, DISABLE); //超时后停止定时 if(g_uchLED3_State) { LED3_ON; g_uchLED3_State =! g_uchLED3_State; } else { LED3_OFF; g_uchLED3_State =! g_uchLED3_State; } } } void DMA1_Channel2_IRQHandler(void) //DMA1_CH2中断,USART3数据发送完成 { if(DMA_GetITStatus(DMA1_IT_TC2) == SET) { DMA_ClearITPendingBit(DMA1_IT_TC2); Delay_Ms(10); UART3_RECEIVE; TIM_DeInit(TIM3); TIM_Config(TIM3,500); //发送完成后使能接收,并定时500ms,超出500mS未接收到数表示接受超时 } } void DMA1_Channel3_IRQHandler(void) //DMA1_CH3中断,USART3数据接收完成 { if(DMA_GetITStatus(DMA1_IT_TC3) == SET) { TIM_DeInit(TIM3); DMA_ClearITPendingBit(DMA1_IT_TC3); //接收完成后将接收标志置为OK,然后调用接收数据处理函数 // TIM_Cmd(TIM3, DISABLE); //接收完成后停止定时 } } |
RE:求助:STM32 DMA与定时器中断问题
1、中断向量的配置,NVIC_InitStructure.NVIC_IRQChannel这个需要进行配置,要对改中断进行配置,配置中断向量很重要;
2、清除中断标志,如果不清除中断标志,那么肯定会进来的。
RE:求助:STM32 DMA与定时器中断问题
还是老样子,呵呵
RE:求助:STM32 DMA与定时器中断问题
请试试把断点放在DMA1_CH3中断中关闭TIM3的语句之后,如果还会有问题,说明没有正确地关闭TIM3;到底为什么有正确地关闭TIM3,目前还不清楚。
RE:求助:STM32 DMA与定时器中断问题