STM32F103的串口中断与空闲中断接收数据
1.引脚配置
void Uart_Init(u32 bound)
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_InitStructure.USART_BaudRate = bound;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);USART_Cmd(USART1, ENABLE);
}
2.中断处理
void USART1_IRQHandler(void)
{if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET) { USART_ClearITPendingBit(USART1, USART_IT_RXNE);uart1_rx_buf[uart1_rx_len]=USART_ReceiveData(USART1); uart1_rx_len++;} else if(USART_GetITStatus(USART1, USART_IT_IDLE) == SET){USART1->SR;USART1->DR;uart1_rx_done=1;}else{}
}
3.串口发送
u8 Usart1_Send(u8 * data,u16 len)
{u16 i=0;if(len<1)return 0;for(i=0;i<len;i++){USART_SendData(USART1,data[i]);while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);}return 1;
}
4.串口解析
void Usart1_Data_Analyse()
{if(uart1_rx_done==1){Usart1_Send(uart1_rx_buf,uart1_rx_len);uart1_rx_len=0;uart1_rx_done=0;}}