1、概述:異步
USART即通用同步異步收發器,用於靈活的與外部設備全雙工數據交換,它支持多種通訊傳輸方式,能夠經過小數波特率發生器提供多種波特率。函數
2、串口IO:spa
對於STM32F407有6個串口,對於每一個串口對應的IO能夠從芯片原理圖中對應找到,對於其串口1,對應的IO爲PA9/PB6端口對應串口1的發送端,PA10/PB7端口對應串口1的接收端。設計
3、通訊參數:code
對於數據的傳輸須要設定好相關的數據傳輸協議,所以必要的參數設定是有必要的,其中包括:起始位、數據位(8位或9位)、奇偶校驗位(開啓與否)、中止位(一、1.五、2位)、波特率設定。blog
4、相關寄存器:ip
其中相關寄存器有:狀態寄存器、數據寄存器、波特率寄存器、控制寄存器一、控制寄存器二、控制寄存器三、保護時間和預分頻寄存器;下邊簡單分析一下前三個寄存器。同步
一、狀態寄存器:it
目前認識的位有:TXE:發送寄存器爲空;TC:發送完成;RXNE:讀取數據寄存器不爲空;ORE:上溢錯誤;FE:幀錯誤;PE:奇偶校驗錯誤。io
二、數據寄存器:該寄存器只有低8位有效,並且具備讀寫操做,有關該寄存器中的數據時要發送的數據仍是接受到的數據取決於執行的操做是「讀取」仍是「寫入」。
三、波特率寄存器:
波特率寄存器用來經過設定相關數值經過時鐘產生相應的波特率。對於串口1的數值設定和產生波特率的關係以下:
其中在寄存器中會設定相應的值,DIV_Mantissa[11,0]用來設定分頻係數的整數部分,DIV_Fraction[3,0]用來設定分頻係數的小數部分。
5、相關代碼分析:
下面依照串口的配置過程,來分析相關代碼:
一、相關時鐘使能:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA時鐘 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1時鐘
二、引腳複用映射:
//串口1對應引腳複用映射 GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9複用爲USART1 GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10複用爲USART1
三、GPIO端口模式設定:
//USART1端口配置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9與GPIOA10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//複用功能 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推輓複用輸出 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10
四、串口參數設定:
//USART1 初始化設置 USART_InitStructure.USART_BaudRate = bound;//波特率設置 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長爲8位數據格式 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); //初始化串口1
五、配置相關中斷:
#if EN_USART1_RX USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//開啓相關中斷 //Usart1 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中斷通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//搶佔優先級3 NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子優先級3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根據指定的參數初始化VIC寄存器、 #endif
六、使能串口(及注意相關標誌位):
USART_Cmd(USART1, ENABLE); //使能串口1 USART_ClearFlag(USART1, USART_FLAG_TC);
七、中斷服務函數(根據須要自行處理):
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中斷(接收到的數據必須是0x0d 0x0a結尾) { Res =USART_ReceiveData(USART1);//(USART1->DR); //讀取接收到的數據 if((USART_RX_STA&0x8000)==0)//接收未完成 { if(USART_RX_STA&0x4000)//接收到了0x0d { if(Res!=0x0a)USART_RX_STA=0;//接收錯誤,從新開始 else USART_RX_STA|=0x8000; //接收完成了 } else //還沒收到0X0D { if(Res==0x0d)USART_RX_STA|=0x4000; else { USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ; USART_RX_STA++; if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收數據錯誤,從新開始接收 } } } }八、剩下就是根據串口的相關傳輸狀態來進行數據的發送和接收,可依據本身的須要進行設計和分析。