??在對串口進行配置時首先需要對對應的引腳進行端口復用映射怔毛,因為STM32一個端口有多個用處,另外即使對于同一個功能,也可以用不同的引腳進行實現(xiàn),所以在使用串口前需要先對引腳進行端口復用映射链烈,對應API接口為
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9復用USART1
注意,第二個參數(shù)GPIO_PinSource9區(qū)別去端口I/O配置時的GPIO_Pin9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //選擇GPIOA9和GPIOA10
??以下為串口中斷服務程序
//串口中斷服務程序
void USART1_IRQHandler(void)
{
u8 rec_data;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {//接收中斷
rec_data =(u8)USART_ReceiveData(USART1); //讀取接收到的數(shù)據(jù)
if(rec_data=='S'){ //接收到S
uart_byte_count=0x01;
}else if(rec_data=='E'){ //接收到E
if(strcmp("Light_led1",(char *)receive_str)==0)
LED1=0;
else if(strcmp("Close_led1",(char *)receive_str)==0)
LED1=1;
else if(strcmp("Open_beep",(char *)receive_str)==0)
BEEP=1;
else if(strcmp("Close_beep",(char *)receive_str)==0)
BEEP=0;
for(uart_byte_count=0;uart_byte_count<32;uart_byte_count++)
receive_str[uart_byte_count]=0x00;
uart_byte_count=0;
}else if((uart_byte_count>0)&&(uart_byte_count<=USART1_REC_NUM)){ //接收到數(shù)據(jù)
receive_str[uart_byte_count-1]=rec_data;
uart_byte_count++;
}
}
}
??從以上程序可以看出更耻,串口在接收和發(fā)送數(shù)據(jù)的時候是按照位來發(fā)送的测垛,例如通過串口工具發(fā)送數(shù)據(jù)“SLight_LED1E”,則串口中斷服務程序首先受到字符S秧均,判斷是數(shù)據(jù)起始位置食侮,然后開始接收指令數(shù)據(jù),最后接收到字符E代表接收數(shù)據(jù)終止目胡,進而處理數(shù)據(jù)锯七。
??串口通信中的數(shù)據(jù)都是通過位來發(fā)送和接收的。