串口4可以同时使用USART_IT_TXE中断和USART_IT_RXNE吗?

2019-07-21 08:10发布


如题,要求串口发送数据以后,不能使用while(USART_GetFlagStatus(UART4,USART_FLAG_TXE)!=SET);来判断数据是否发送完成,因为这样占死了CPU。
所以,要使用发送中断,这里因为数据是字节型数据,所以,使用中断是USART_IT_TXE。单独调试USART_IT_TXE的时候正常的。

又由于需用用接收中断,所以又开了USART_IT_RXNE的中断,但是接收中断一直没有反应,不能进入到UART4_IRQHandler。

现在是即使不使用USART_IT_RXNE,采用查询的方式:Rtemp = USART_GetFlagStatus(UART4,USART_FLAG_RXNE); 这个Rtemp也一直不能置为SET,不明白为什么,求助!

串口4的配置程序:
void USART4_Configuration(void)
{
   
    USART_InitTypeDef USART_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC ,ENABLE);  
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    IO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOC,&GPIO_InitStructure);


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOC,&GPIO_InitStructure);

    USART_InitStructure.USART_BaudRate = 9600;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_Init(UART4,&USART_InitStructure);
    USART_ITConfig(UART4,USART_IT_RXNE,ENABLE);//开中断
    USART_Cmd(UART4,ENABLE);/*使能USART4*/
}

串口4的中断函数:
void UART4_IRQHandler(void)

    u8 temp;
    if( USART_GetITStatus(UART4, USART_IT_TXE) == SET )
    {
        UART4_TXE_FLAG = TRUE;
        USART_ITConfig(UART4, USART_IT_TXE, DISABLE);//因为是 发送寄存器空 的中断,所以发完字符串后必须关掉,否则只要空了,就会进中断
    }
    else if( USART_GetITStatus(UART4, USART_IT_RXNE) == SET )
    {
        temp = USART_ReceiveData(UART4);           
        USART_ClearITPendingBit(UART4, USART_IT_RXNE); 
    }
}

串口4发送数据调用的函数:
void USART_SendByte(USART_TypeDef* USARTx,u8 data)
{
    USART_SendData(USARTx,data);
    USART_ITConfig(USARTx, USART_IT_TXE, ENABLE);//只要发送寄存器为空,就会一直有中断,因此,要是不发送数据时,把发送中断关闭,只在开始发送时,才打开。
}





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。