串口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);//只要发送寄存器为空,就会一直有中断,因此,要是不发送数据时,把发送中断关闭,只在开始发送时,才打开。
}





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
yhnu1214
1楼-- · 2019-07-21 09:32
 精彩回答 2  元偷偷看……
xuande
2楼-- · 2019-07-21 15:28
说明接收功能就没有正常工作,所以没有进中断。
yhnu1214
3楼-- · 2019-07-21 20:18
回复【2楼】xuande:
---------------------------------
不开USART_IT_TXE时,接收功能是可以正常运行的。说明硬件是没有问题的。
为什么加了USART_IT_TXE以后,接收功能就不正常了呢?
xuande
4楼-- · 2019-07-22 00:02
中断函数是收、发共用的。

看你的处理方法,用了 if。。。。else。。。。结构,非此即彼,两者不共存!
yhnu1214
5楼-- · 2019-07-22 04:19
回复【4楼】xuande:
---------------------------------
恩,这里也被我改了。
学习stm32加油
6楼-- · 2019-07-22 09:56
 精彩回答 2  元偷偷看……

一周热门 更多>