在线时间0 小时
UID173316
ST金币0
蝴蝶豆0
注册时间2010-3-3
新手上路
- 最后登录
- 1970-1-1
|
a0a.1 0b0c
遇到一个问题好多天了,我用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); //接收完成后停止定时
}
}
|
|