NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3 NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、 } void USART1_IRQHandler(void) //串口1中断服务程序 { u8 r; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断 { r =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据 if((USART1_RX_STA&0x8000)==0)//接收未完成 { if(USART1_RX_STA&0x4000)//接收到了0x0d { if(r!=0x0a)USART1_RX_STA=0;//接收错误,重新开始 else USART1_RX_STA|=0x8000; //接收完成了 } else //还没收到0X0D { if(r==0x0d)USART1_RX_STA|=0x4000; else { USART1_RX_BUF[USART1_RX_STA&0X3FFF]=r; USART1_RX_STA++; if(USART1_RX_STA>(USART1_REC_LEN-1))USART1_RX_STA=0;//接收数据错误,重新开始接收 } } } } }
时间: 2024-03-29 09:36:57 浏览: 65
USART1_STM32F030串口初始化_flatunl_
5星 · 资源好评率100%
这段代码是关于STM32的串口中断的实现。在初始化时,设置了串口1的中断通道、抢占优先级、子优先级,并使能了IRQ通道。当串口1接收到数据时,会触发USART1_IRQHandler()函数,判断接收中断标志是否被置位,如果是则读取接收到的数据。如果接收未完成,则判断是否已经接收到了0x0d,如果接收到了,则判断下一个字节是否为0x0a,如果不是则重新开始接收,如果是则表示接收完成了;如果还没有收到0x0d,则将接收到的数据存入接收缓存区,并将接收状态加1,如果接收状态超过了设定的最大长度,则重新开始接收。
阅读全文