STM32學(xué)習(xí)筆記之USART
接口通過三個引腳與其他設(shè)備連接在一起(見圖248)。任何USART雙向通信至少需要兩個腳:接收數(shù)據(jù)輸入(RX)和發(fā)送數(shù)據(jù)輸出(TX)。
RX:接收數(shù)據(jù)串行輸。通過過采樣技術(shù)來區(qū)別數(shù)據(jù)和噪音,從而恢復(fù)數(shù)據(jù)。
TX:發(fā)送數(shù)據(jù)輸出。當(dāng)發(fā)送器被禁止時,輸出引腳恢復(fù)到它的I/O端口配置。當(dāng)發(fā)送器被激活,并且不發(fā)送數(shù)據(jù)時,TX引腳處于高電平。在單線和智能卡模式里,此I/O口被同時用于數(shù)據(jù)的發(fā)送和接收。
● 總線在發(fā)送或接收前應(yīng)處于空閑狀態(tài)
● 一個起始位
● 一個數(shù)據(jù)字(8或9位),最低有效位在前
● 0.5,1.5,2個的停止位,由此表明數(shù)據(jù)幀的結(jié)束
● 使用分數(shù)波特率發(fā)生器 —— 12位整數(shù)和4位小數(shù)的表示方法。
● 一個狀態(tài)寄存器(USART_SR)
● 數(shù)據(jù)寄存器(USART_DR)
● 一個波特率寄存器(USART_BRR),12位的整數(shù)和4位小數(shù)
● 一個智能卡模式下的保護時間寄存器(USART_GTPR)
關(guān)于以上寄存器中每個位的具體定義,請參考寄存器描述第節(jié):USART寄存器描述。
在同步模式中需要下列引腳:
● CK:發(fā)送器時鐘輸出。此引腳輸出用于同步傳輸?shù)?時鐘, (在Start位和Stop位上沒有時鐘脈沖,軟件可選地,可以在最后一個數(shù)據(jù)位送出一個時鐘脈沖)。數(shù)據(jù)可以在RX上同步被接收。這可以用來控制帶有移位寄存器的外部設(shè)備(例如LCD驅(qū)動器)。時鐘相位和極性都是軟件可編程的。在智能卡模式里,CK可以為智能卡提供時鐘。
在IrDA模式里需要下列引腳:
● IrDA_RDI: IrDA模式下的數(shù)據(jù)輸入。
● IrDA_TDO: IrDA模式下的數(shù)據(jù)輸出。
下列引腳在硬件流控模式中需要:
● nCTS: 清除發(fā)送,若是高電平,在當(dāng)前數(shù)據(jù)傳輸結(jié)束時阻斷下一次的數(shù)據(jù)發(fā)送。
void USART_SendChar(USART_TypeDef* USARTx, uint16_t Data)
{
//檢測參數(shù)
assert_param(IS_USART_ALL_PERIPH(USARTx));
assert_param(IS_USART_DATA(Data));
USARTx->DR = (Data & (uint16_t)0x01FF);
while(!(USARTx->SR & USART_SR_TC));
}
void USART_SendString(USART_TypeDef* USARTx, uint8_t *pString)
{
while(*pString)
{
USART_SendChar(USARTx, *pString++);
}
PS: 在非中斷情況下,要通過檢測SR位來判斷是否發(fā)送完成:while(!(USARTx->SR & USART_SR_TC));
中斷情況下: if(USART_GetITStatus(USARTy, USART_IT_TXE) != RESET)
評論