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