1. 程式人生 > >STM32F407 串列埠程式設計USART1,USART2,USART3,UART4

STM32F407 串列埠程式設計USART1,USART2,USART3,UART4

串列埠設定的一般步驟可以總結為如下幾個步驟: 
1)  串列埠時鐘使能,GPIO時鐘使能。 
2)  設定引腳複用器對映:呼叫GPIO_PinAFConfig函式。 
3)  GPIO初始化設定:要設定模式為複用功能。 
4)  串列埠引數初始化:設定波特率,字長,奇偶校驗等引數。 
5)  開啟中斷並且初始化NVIC,使能中斷(如果需要開啟中斷才需要這個步驟)。 
6)  使能串列埠。 
7)  編寫中斷處理函式:函式名格式為USARTxIRQHandler(x對應串列埠號)。 

我們通過USART3簡單介紹下這幾個與串列埠基本配置直接相關的幾個韌體庫函式。這些函式和定義主要分佈在stm32f4xx_usart.h和stm32f4xx_usart.c檔案中。 


1)  串列埠時鐘和GPIO時鐘使能。 

串列埠是掛載在APB1下面的外設,所以使能函式為: 

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//使能USART3時鐘 

GPIO時鐘使能,就非常簡單,串列埠3對應著晶片引腳PB10,PB11。所以這裡我們只需要使能GPIOB時鐘即可: 

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); //使能GPIOB時鐘 

2)  設定引腳複用器對映 

引腳複用器對映配置,呼叫函式為: 
GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_USART3);
//PB10複用為USART3 
GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_USART3);//PA11複用為USART3 

因為串列埠使用到PB10,PB11,所以我們要把PB10和PB11都對映到串列埠3。所以這裡我們要呼叫兩次函式。

 
 對於GPIO_PinAFConfig函式的第一個和第二個引數很好理解,就是設定對應的IO口,如果是PB10那麼第一個引數是GPIOB,第二個引數就是GPIO_PinSource10。第二個引數,實際我們不需要去記憶,只需去相應的配置檔案找到外設對應的AF配置巨集定義識別符號即可,串列埠3為GPIO_AF_USART3。 

3)  GPIO埠模式設定:PA9和PA10要設定為複用功能。 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11; //GPIOB10與GPIOB11 
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 

4)  串列埠引數初始化:設定波特率,字長,奇偶校驗等引數 

串列埠初始化是呼叫函式USART_Init來實現的,具體設定方法如下: 
USART_InitStructure.USART_BaudRate = bound;//一般設定為9600; 
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(USART3, &USART_InitStructure); //初始化串列埠 

5)  使能串列埠 

使能串列埠呼叫函式USART_Cmd來實現,具體使能串列埠3方法如下: 
USART_Cmd(USART3, ENABLE);    //使能串列埠 

6)  串列埠資料傳送與接收。 

STM32F4的傳送與接收是通過資料暫存器USART_DR來實現的,這是一個雙暫存器,包
含了TDR和RDR。當向該暫存器寫資料的時候,串列埠就會自動傳送,當收到資料的時候,也是存在該暫存器內。   
STM32庫函式操作USART_DR暫存器傳送資料的函式是: 
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data); 
通過該函式向串列埠暫存器USART_DR寫入一個數據。 
STM32庫函式操作USART_DR暫存器讀取串列埠接收到的資料的函式是: 
uint16_t USART_ReceiveData(USART_TypeDef* USARTx); 
通過該函式可以讀取串列埠接受到的資料。

7)  開啟中斷並且初始化NVIC,使能相應中斷 

  這一步如果我們要開啟串列埠中斷才需要配置NVIC中斷優先順序分組。通過呼叫函式
NVIC_Init來設定。 
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; 
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//搶佔優先順序3 
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;    //響應優先順序3 
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;      //IRQ 通道使能 
NVIC_Init(&NVIC_InitStructure);  //根據指定的引數初始化VIC暫存器、 

同時,我們還需要使能相應中斷,使能串列埠中斷的函式是: 
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT,  
FunctionalState NewState) 

這個函式的第二個入口引數是標示使能串列埠的型別,也就是使能哪種中斷,因為串列埠的中斷型別有很多種。比如在接收到資料的時候(RXNE讀資料暫存器非空),我們要產生中斷,那麼我們開啟中斷的方法是: 
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//開啟中斷,接收到資料中斷 
我們在傳送資料結束的時候(TC,傳送完成)要產生中斷,那麼方法是: 
USART_ITConfig(USART3,USART_IT_TC,ENABLE); 
這裡還要特別提醒,因為我們實驗開啟了串列埠中斷,所以我們在系統初始化的時候需要先設定
系統的中斷優先順序分組,我們是在我們main函式開頭設定的,程式碼如下: 
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設定系統中斷優先順序分組2 
我們設定分組為2,也就是2位搶佔優先順序,2位響應優先順序。 

8)  獲取相應中斷狀態 

當我們使能了某個中斷的時候,當該中斷髮生了,就會設定狀態暫存器中的某個標誌位。經常我們在中斷處理函式中,要判斷該中斷是哪種中斷,使用的函式是:   
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT) 
比如我們使能了串列埠傳送完成中斷,那麼當中斷髮生了,  我們便可以在中斷處理函式中呼叫這
個函式來判斷到底是否是串列埠傳送完成中斷,方法是: 
USART_GetITStatus(USART3, USART_IT_TC) 
返回值是SET,說明是串列埠傳送完成中斷髮生。 

9)   中斷服務函式 

  串列埠1中斷服務函式為: 
void USART3_IRQHandler(void) ; 
當發生中斷的時候,程式就會執行中斷服務函式。然後我們在中斷服務函式中編寫我們相應的邏輯程式碼即可

10)  初始化程式碼