STM32F407 串列埠程式設計USART1,USART2,USART3,UART4
阿新 • • 發佈:2019-01-22
串列埠設定的一般步驟可以總結為如下幾個步驟:
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);
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與GPIOB11GPIO_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) ;
當發生中斷的時候,程式就會執行中斷服務函式。然後我們在中斷服務函式中編寫我們相應的邏輯程式碼即可