通用同步異步收發(fā)器(USART)提供了一種靈活的方法來與使用工業(yè)標準NR 異步串行數(shù)據(jù)格式的外部設(shè)備之間進行全雙工數(shù)據(jù)交換。 USART利用分數(shù)波特率發(fā)生器提供寬范圍的波特率選擇,支持同步單向通信和半雙工單線通信。
1、STM32固件庫使用外圍設(shè)備的主要思路
在STM32中,外圍設(shè)備的配置思路比較固定。首先是使能相關(guān)的時鐘,一方面是設(shè)備本身的時鐘,另一方面如果設(shè)備通過IO口輸出還需要使能IO口的時鐘;最后如果對應(yīng)的IO口是復(fù)用功能的IO口,則還必須使能AFIO的時鐘。
其次是配置GPIO,GPIO的各種屬性由硬件手冊的AFIO一章詳細規(guī)定,較為簡單。
接著相關(guān)設(shè)備需要如果需要使用中斷功能,必須先配置中斷優(yōu)先級,后文詳述。
然后是配置外圍設(shè)備的相關(guān)屬性,視具體設(shè)備而定,如果設(shè)備需要使用中斷方式,必須使能相應(yīng)設(shè)備的中斷,之后需要使能相關(guān)設(shè)備。
最后如果設(shè)備使用了中斷功能,則還需要填寫相應(yīng)的中斷服務(wù)程序,在服務(wù)程序中進行相應(yīng)操作。
2、UART的配置步驟(查詢方式)
2.1、打開時鐘
由于UART的TX和RX和AFIO都掛在APB2橋上,因此采用固件庫函數(shù)RCC_APB2PeriphClockCmd()進行初始化。UARTx需要分情況討論,如果是UART1,則掛在APB2橋上,因此采用RCC_APB2PeriphClockCmd()進行初始化,其余的UART2~5均掛在APB1上。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);
2.2、GPIO初始化
GPIO的屬性包含在結(jié)構(gòu)體GPIO_InitTypeDef,其中對于TX引腳,GPIO_Mode字段設(shè)置為GPIO_Mode_AF_PP(復(fù)用推挽輸出),GPIO_Speed切換速率設(shè)置為GPIO_Speed_50MHz;對于RX引腳,GPIO_Mode字段設(shè)置為GPIO_Mode_IN_FLOATING(浮空輸入),不需要設(shè)置切換速率。最后通過GPIO_Init()使能IO口。
以下是GPIO設(shè)置的實例代碼:
GPIO_InitTypeDef GPIO_InitStructure; //USART1 Tx(PA.09) 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); //USART1 Rx(PA.10) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure);
2.3、配置UART相關(guān)屬性
通過結(jié)構(gòu)體USART_InitTypeDef來確定。UART模式下的字段如下
USART_BaudRate:波特率,視具體設(shè)備而定
USART_WordLength:字長
USART_StopBits:停止位
USART_Parity:校驗方式
USART_HardwareFlowControl:硬件流控制
USART_Mode:單/雙工
最后設(shè)置。實例代碼為:
//USART1配置 USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 9600; 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_Tx | USART_Mode_Rx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE);
別忘了最后要使用USART_Cmd()來啟動設(shè)備UART1。
2.4、重定向print()函數(shù)。
int fputc(int ch,FILE *f) { USART1->SR; //USART_GetFlagStatus(USART1, USART_FLAG_TC) 解決第一個字符發(fā)送失敗的問題 //一個一個發(fā)送字符 USART_SendData(USART1, (unsigned char) ch); //等待發(fā)送完成 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET); return(ch); }
最后通過主函數(shù)直接輸出即可。