关于STM32串口中断方式接收数据
网上有如下中断方式接收数据的程序:
void USART1_IRQHandler(void) //串口1中断
{
char RX_dat; //定义字符变量
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //判断发生接收中断
{
USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清除中断标志
GPIO_WriteBit(GPIOB, GPIO_Pin_10, (BitAction)0x01); //开始传输
RX_dat=USART_ReceiveData(USART1) & 0x7F; //接收数据,整理除去前两位
//**************使用RX_dat进行一些处理操作,这里省略了较复杂的处理过程....********
USART_SendData(USART1, RX_dat); //发送数据
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}
//等待发送结束
}
}
问题一:上面的注释部分,“接收数据,整理除去前两位”应该是“接收数据,整理除去前一位”吧?
问题二:当执行“RX_dat=USART_ReceiveData(USART1) & 0x7F;"后,RXNE标志应该成为了RESET”状态,即接 收数据寄存器变为“空”状态,那么这时后续数据就会由移位寄存器转到接收数据寄存器,转换完成后RXNE被SET,这时候又会进入中断处理函数。如果在中断处理函数中读取数据后要对数据进行处理的时间较长,那么后续数据的进入会打断前一数据的处理过程,所以达不到接收一个字节数据,然后处理完,再接收一个字节数据,然后再处理完的这样的整个的过程。也就是说上面程序中的将接收到的数据输出的过程可能会被由于后续数据的进入而引发的中断而中断。不知道我说的这个对不对?
问题三:如果问题二中我说的过程不正确,即后续数据的接收不会打断前面数据的中断处理过程,那么是因为调用了“USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清除中断标志”?难道清除中断标志位可以让RXNE只有在退出中断处理函数的时候才可以被SET?
问题四:用中断方式接收数据,中断处理函数的编写是否是如下规律?1、禁能中断。2、清除中断标志位,使得中断标志位可以准确的反映后续的中断状态。3、接收数据,并进行数据处理。4、使能中断。