如题,要求串口发送数据以后,不能使用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);//只要发送寄存器为空,就会一直有中断,因此,要是不发送数据时,把发送中断关闭,只在开始发送时,才打开。
}
---------------------------------
恩,这里也被我改了。
一周热门 更多>