USART中断函数

1、中断函数中可以不调用USART_GetITStatus

  USART_GetITStatus函数是用来获取中断状态,即判断中断来源。

  在STM32的中断服务函数中,‌是否需要调用USART_GetITStatus函数取决于具体的应用场景和需求。‌如果中断服务函数只处理特定的中断事件,‌并且确定不会有其他中断同时发生,‌那么可能不需要显式地检查中断来源。‌然而,‌在更复杂的应用中,‌特别是在多个中断源共享同一个中断处理函数的情况下,‌检查中断来源是非常重要的,‌以确保正确地处理每个中断事件。‌

  例如,‌在处理USART接收中断时,‌如果确定只有接收中断可能发生,‌那么可以省略USART_GetITStatus的调用。‌但如果发送中断和接收中断共享同一个中断处理函数,‌就需要通过USART_GetITStatus来判断是接收中断还是发送中断,‌以便执行相应的处理逻辑。‌

  综上所述,‌虽然在某些情况下可以省略中断来源的检查,‌但在多中断源共享同一中断处理函数的情况下,‌显式检查中断来源是必要的,‌以确保正确的中断处理逻辑和系统的稳定性。

2、清除中断标志

  对于USART的中断处理,‌除了检查中断状态外,‌还需要清除中断标志位,‌以避免中断状态的持续触发。‌例如,‌在接收数据后,‌应使用USART_ClearFlagUSART_ClearITPendingBit函数清除接收数据就绪标志位,‌以确保下一次接收操作能够正确触发中断。‌

  清除USART_IT_IDLE的方法是通过读取USART的SR和DR寄存器来实现的。‌ 在STM32中,‌USART的IDLE中断标志位需要通过特定的步骤来清除,‌以确保下一次IDLE中断能够正常触发。‌这个过程涉及到读取USART的状态寄存器(SR)和数据寄存器(DR)。‌具体步骤如下:‌ 读取状态寄存器(SR):‌首先,‌需要读取USART的状态寄存器SR,‌这个操作本身就会清除某些标志位,‌包括IDLE标志位。‌ 读取数据寄存器(DR):‌紧接着,‌读取数据寄存器DR。‌这个操作同样会清除IDLE标志位,‌确保IDLE中断被正确处理。‌

void USART_1_IRQHandler(void)
{                
    uint8_t Temp_Clear_IDLE = Temp_Clear_IDLE;                    //清除USART_IT_IDLE位
    if (USART_GetITStatus(USART_1, USART_IT_RXNE) != RESET)        //判断接收中断是否发生
    {        
        if (usart_1_recv_count < USART_1_BUF_SIZE-1)
        {                    
            usart_1_recv_buf[usart_1_recv_count] = USART_ReceiveData(USART_1);    //返回由USARTx外围设备接收的最新数据 
            usart_1_recv_count++;
        }
        while (USART_GetFlagStatus(USART_1, USART_FLAG_TXE) == RESET);            //阻塞等待直到将数据传输缓冲区完成,判断发送数据寄存器是否为空                

        USART_ClearITPendingBit(USART_1, USART_IT_RXNE);                        //清除中断标志位                    
    }


    if(USART_GetITStatus(USART_1, USART_IT_IDLE) != RESET)                        //判断一帧数据是否接收完毕
    {
        usart_1_recv_count = 0;
        memset((void *)usart_1_recv_buf, 0, sizeof(usart_1_recv_buf));    //数据处理完后清除    

Temp_Clear_IDLE = USART_1->SR; Temp_Clear_IDLE = USART_1->DR; //清除USART_IT_IDLE位 //USART_ClearITPendingBit(USART_1,USART_IT_IDLE); //USART_IT_IDLE标志位不能用USART_ClearITPendingBit函数清除,只能手动清除 } }

 3、USART_GetITStatus和USART_GetFlagStatus的区别

‌  USART_GetITStatus和USART_GetFlagStatus的主要区别在于它们的功能和用途。‌

  ‌USART_GetFlagStatus‌函数主要用于判断串口的状态标志位是否被设置它只访问串口的状态寄存器(SR),用于在没有使能相应的中断函数时,判断标志位是否置1这意味着,当需要检查某个特定的标志位是否被设置,而不关心是否已经使能了对应的中断时,使用USART_GetFlagStatus是合适的。

  ‌USART_GetITStatus‌函数则不仅会检查标志位是否被设置,还会判断是否已经使能了相应的中断。它同时访问状态寄存器(SR)和控制寄存器1(CR1),用于在串口中断函数中获取中断标志位。这个函数在需要确认某个事件已经发生并且已经使能了对应的中断时特别有用,比如在数据发送完成或接收到的场景中,通过这个函数可以确保中断被正确触发。

  简而言之,‌USART_GetFlagStatus‌关注的是标志位的设置状态,而‌USART_GetITStatus‌则同时考虑了标志位的设置状态和中断的使能状态,使得它在处理中断相关的操作时更为适用‌。

posted @ 2024-08-14 11:19  孤情剑客  阅读(613)  评论(0)    收藏  举报