在中断服务函数里面,千万不能用打印函数,因为打印函数的时间太长,会使中断服务函数长时间没有退出去,将会造成一些想不到的结果。
例如在串口中断中:
void USART2_IRQHandler(void)
{
unsigned char res;
uint16_t uhdata;
uint16_t uhMask = (&huart2)->Mask;
//if(USART2->ISR&(1<<5))//?????
if(((READ_REG((&huart2)->Instance->ISR) & USART_ISR_RXNE) != RESET) && ((READ_REG((&huart2)->Instance->CR1) & USART_CR1_RXNEIE) != RESET))
{
res = 0;
res = USART2->RDR;
printf("\r\n USART2 IRQ....%x %d \r\n",res,cnt2++);
if('$' == res)
{cnt =0;memset(USART2_RMCtmp_BUF,0,256);}
USART2_RMCtmp_BUF[cnt] = res;
if((cnt>=3) && (USART2_RMCtmp_BUF[3] == 'R'))
{
USART2_RMC_BUF[cnt] = res;
}
cnt++;
}
}
结果:
可以看到接收的结果就是0d 0a,然后什么都没有了,因为打印函数的时间过长,RDR寄存器里面的值没有立即读出,会造成溢出错误,从而造成不能一直进入接收中断处理数据。当把打印函数去掉之后一切就正常了。
所以,在中断服务函数里面不要做一些太耗时的操作,特别是在接收中断服务函数里面。