寫在前面 Ⅰ
做軟件開發(fā)的人都知道打印信息的重要,說到打印信息,我們就不得不說UART串口打印。做單片機開發(fā)的人,打印信息主要的來源就是UART串口打印。因此,關于UART相關的知識就比較重要。
printf、scanf這種標準的函數(shù)不只是可以在電腦上可以使用,在我們單片機上也同樣可以使用,本文只講述關于UART的基礎知識,關于printf、scanf這一塊后面將再次給大家整理一篇文章。
本文將結合“STM8S參考手冊”和軟件源代碼給大家講述關于UART的基礎知識和用法。
為方便大家閱讀,本文內容已經整理成PDF文件:
http://pan.baidu.com/s/1i5uWhJR
UART基礎知識 Ⅱ
通用異步收發(fā)傳輸器(Universal Asynchronous Receiver/Transmitter),通常稱作UART,是一種異步收發(fā)傳輸器。
STM8S微控制器家族的通用同步異步收發(fā)器(UART1、UART2或UART3)提供了一種靈活的方法和使用工業(yè)標準NZR異步串行數(shù)據(jù)格式的外部設備之間進行全雙工數(shù)據(jù)交換。STM8的UART提供寬范圍的波特率選擇,并且支持多處理器通訊。
主要特性:
?全雙工的,異步通信
?高精度波特率發(fā)生器系統(tǒng):發(fā)送和接收共用的可編程波特率,最高達 2.5Mbits/s
?可編程數(shù)據(jù)字長度(8位或9位)
?可配置的停止位-支持1或2個停止位
?單線半雙工通信(UART1)
?檢測標志:接收緩沖器滿、發(fā)送緩沖器空、傳輸結束標志
?6個帶標志的中斷源
?2個中斷向量
?低功耗模式
UART同步模式
UART_CK腳是UART發(fā)送器時鐘的輸出。在起始位和停止位期間,UART_CK腳上沒有時鐘脈沖。根據(jù)UART_CR3寄存器中LBCL位的狀態(tài),發(fā)送器決定在最后一個有效數(shù)據(jù)位期間產生或不產生時鐘脈沖。 UART_CR3寄存器的CPOL位允許用戶選擇時鐘極性, UART_CR3寄存器上的CPHA位允許用戶選擇外部時鐘的相位。
在總線空閑幀和斷開幀中,外部CK時鐘處于非激活狀態(tài)。
注意:
1.UART_CK腳同UART_TX腳一起聯(lián)合工作。當UART發(fā)送端被禁用時(TEN和REN=0),UART_CK和UART_TX管腳為高阻態(tài)。
2.在UART發(fā)送端和接收端都被禁用(TEN=REN=0)時, LBCL,CPOL和CPHA位必須被正確配置以保證時鐘脈沖正確工作;當發(fā)送器或接收器被激活時,這些位不能被改變。
3.建議在同一條指令中設置TE和RE,以減少接收器的建立時間和保持時間。
4. UART只支持主模式:它不能使用來自其他設備的輸入時鐘以接收或發(fā)送數(shù)據(jù)(SCLK只能配置為輸出狀態(tài))。
5. 本節(jié)給出的數(shù)據(jù)只有在寄存器UART_BRR2的UART_DIV[3:0]為0時才有效。否則建立時間和持續(xù)時間不再是1/16位時間,而是4/16位時間。
該功能選項可以串行地控制那些由移位寄存器組成的外設,而不會失去異步通訊的功能,即仍然可以與其他異步發(fā)送接收器通訊。
UART同步傳輸?shù)睦樱?/p>
軟件工程源代碼 Ⅲ
1、關于工程
本文提供的工程代碼是基于前面軟件工程“STM8S-A02_TIM精確延時(阻塞式)”增加UART串口修改而來。初學的朋友可以參看我前面對應的基礎文章,那些文章講的比較詳細。
工程源代碼主要實現(xiàn)功能:UART串口基本輸出+中斷接收數(shù)據(jù)。UART串口間隔1s打印字符串“Demo...”,串口通過中斷接收數(shù)據(jù),接收到一個字符就將其通過串口發(fā)送出去。
本文重點講述關于UART的內容:
UART_Initializes:UART串口初始化
UART1_SendByte:UART串口發(fā)送字節(jié)數(shù)據(jù)
2.代碼分析說明
A.UART_Initializes:初始化
void UART_Initializes(void)
{
UART1_Init((uint32_t)115200, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
UART1_Cmd(ENABLE);
UART1_ITConfig(UART1_IT_RXNE, ENABLE);
enableInterrupts();
}
UART1_Init:包含的參數(shù):
115200:波特率
UART1_WORDLENGTH_8D:字長,8位或9位
UART1_STOPBITS_1:停止位
UART1_PARITY_NO:奇偶校驗
UART1_SYNCMODE_CLOCK_DISABLE:同步模式
UART1_MODE_TXRX_ENABLE:收發(fā)使能
這里每一個參數(shù)都可以有不同值,可參看其枚舉類型。
UART1_Cmd(ENABLE):使能UART1.
UART1_ITConfig(UART1_IT_RXNE, ENABLE):使能中斷接收。
enableInterrupts():使能全局中斷。
B.UART1_SendByte:發(fā)送字節(jié)數(shù)據(jù)
void UART1_SendByte(uint8_t Data)
{
while((UART1_GetFlagStatus(UART1_FLAG_TXE)==RESET));
UART1_SendData8(Data);
while((UART1_GetFlagStatus(UART1_FLAG_TC)==RESET));
}
while((UART1_GetFlagStatus(UART1_FLAG_TXE)==RESET)):等待發(fā)送為空
UART1_FLAG_TXE代表發(fā)送寄存器為空。
UART1_SendData8(Data):發(fā)送字節(jié)數(shù)據(jù)
while((UART1_GetFlagStatus(UART1_FLAG_TC)==RESET)):等待傳輸完成
UART1_FLAG_TC代表發(fā)送完成標志。
C.中斷接收
位于stm8s_it.c文件下:
INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18)
{
uint8_t temp;
temp = UART1_ReceiveData8();
UART1_SendData8(temp);
}
這里只是簡單的一個Demo例程,接收到數(shù)據(jù),將其通過串口發(fā)送出去。
UART串口有接收數(shù)據(jù)中斷,會置位接收標志,平常我們響應中斷,一般都會清楚中斷標志,但串口中斷接收數(shù)據(jù),我們都會去讀取串口接收數(shù)據(jù),讀取數(shù)據(jù)會自動清除標志位。見參考手冊中“狀態(tài)寄存器UART_SR”:
D.主函數(shù)功能
while(1)
{
LED_ON;
TIMDelay_Nms(500);
LED_OFF;
TIMDelay_Nms(500);
UART1_Printf((uint8_t*)"Demo...");
}
主函數(shù)里面實現(xiàn)間隔一段時間(1s),通過UART串口發(fā)送字符串“Demo...”。
下載 Ⅳ
STM8S資料:
http://pan.baidu.com/s/1o7Tb9Yq
軟件源代碼工程(STM8S-A04_UART基本收發(fā)數(shù)據(jù)):
http://pan.baidu.com/s/1c2EcRo0
提示:如果網盤鏈接失效,可以微信公眾號“底部菜單”查看更新鏈接。
-
微控制器
+關注
關注
48文章
7660瀏覽量
152187 -
uart
+關注
關注
22文章
1245瀏覽量
101821 -
STM8S
+關注
關注
16文章
149瀏覽量
31514
發(fā)布評論請先 登錄
相關推薦
TMS320DM643 DMP通用異步收發(fā)器(UART)手冊
![TMS320DM643 DMP通用異步<b class='flag-5'>收發(fā)</b>器(<b class='flag-5'>UART</b>)手冊](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
ElfBoard技術貼|如何在NXP源碼基礎上適配ELF 1開發(fā)板的UART功能
![ElfBoard技術貼|如何在NXP源碼基礎上適配ELF 1開發(fā)板的<b class='flag-5'>UART</b>功能](https://file1.elecfans.com/web2/M00/08/D1/wKgaombzpf2ANbDaAABFevJym7M948.png)
【xG24 Matter開發(fā)套件試用體驗】8-UART收發(fā)數(shù)據(jù)
TSU6111A USB端口單刀雙擲(SP2T)開關支持USB和通用異步接收發(fā)器(UART)數(shù)據(jù)表
![TSU6111A USB端口單刀雙擲(SP2T)開關支持USB和通用異步接<b class='flag-5'>收發(fā)</b>器(<b class='flag-5'>UART</b>)<b class='flag-5'>數(shù)據(jù)</b>表](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
ESP32-S3-WROOM-1U-N8R8 UART1用默認引腳調試不通怎么解決?
SDIO UART和音頻電壓轉換收發(fā)器TWL1200數(shù)據(jù)表
![SDIO <b class='flag-5'>UART</b>和音頻電壓轉換<b class='flag-5'>收發(fā)</b>器TWL1200<b class='flag-5'>數(shù)據(jù)</b>表](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論