摘 要: 本文討論了UART的軟件實(shí)現(xiàn)方法,介紹了Holtek單片機(jī)在工業(yè)應(yīng)用中用軟件構(gòu)成UART的接口電路。
在各種MCU應(yīng)用系統(tǒng)中,經(jīng)常需要與其他的設(shè)備或系統(tǒng)進(jìn)行數(shù)據(jù)通訊,UART是比較常用的一種通訊模式。當(dāng)應(yīng)用系統(tǒng)要求多路UART,或者基于性能、成本綜合考慮選用了不帶UART的MCU時(shí),我們可以考慮用軟件構(gòu)建UART以實(shí)現(xiàn)系統(tǒng)的數(shù)據(jù)通訊要求。
有人對(duì)軟件UART工作效率和可靠性持否定態(tài)度。事實(shí)上系統(tǒng)要求的各項(xiàng)功能的實(shí)現(xiàn)是采用軟件還是硬件,通常要綜合考慮系統(tǒng)要求、可支配資源、成本。最后的結(jié)果總是在考慮上述因素之后的一個(gè)折衷。如果系統(tǒng)本身實(shí)時(shí)性要求不是很高,而MCU的其他資源又允許的話,完全可以以軟件的方式構(gòu)造合乎使用要求的軟件UART。
圖1 復(fù)費(fèi)率電表中的485接口電路
圖2 起始位確認(rèn)、數(shù)據(jù)采樣
圖3 發(fā)送準(zhǔn)備
圖4 按位發(fā)送
圖5 UART接收狀態(tài)轉(zhuǎn)換圖
UART
串行數(shù)據(jù)通訊時(shí),數(shù)據(jù)按位傳送,任何時(shí)候線上僅有一位數(shù)據(jù)。因此收、發(fā)雙方必須同步,以從二進(jìn)制位流中正確地讀出每一位數(shù)據(jù)。異步串行通訊中,收、發(fā)方的同步不采用時(shí)鐘線來進(jìn)行,而是由通訊雙方約定一個(gè)波特率,每一個(gè)傳送單元通過一個(gè)“起始位”來同步。當(dāng)接收方監(jiān)測(cè)到一個(gè)有效起始位,便按照約定的波特率的一個(gè)倍頻(例如16倍頻)對(duì)數(shù)據(jù)進(jìn)行采樣接收。由于每一個(gè)傳送單元的位數(shù)較少(通常不超過11位),而接收采樣的頻率要高于通訊波特率,即使收發(fā)雙方的時(shí)基存在一定誤差,仍然可以保證準(zhǔn)確的通訊。
在空閑狀態(tài),傳送線為邏輯“1”狀態(tài)。數(shù)據(jù)的傳送總是以一個(gè)“起始位”開始的,接著是要傳送的若干數(shù)據(jù)位,低位先行,最后是一個(gè)“1”狀態(tài)的“停止位”。例如在文檔中用“9600 N.8.1”描述一個(gè)UART,就表示UART使用9600bps的波特率,幀格式為一個(gè)起始位、8個(gè)數(shù)據(jù)位、一個(gè)停止位。
當(dāng)接收方檢測(cè)到一個(gè)“1”向“0”的跳變,便視為可能的起始位。起始位被確認(rèn)后,依次接收數(shù)據(jù)位和停止位,若檢測(cè)不到正確的停止位,可視為傳送出錯(cuò)而放棄。
下面以Holtek的HT49R70在復(fù)費(fèi)率電表中的應(yīng)用為例,說明如何實(shí)現(xiàn)一個(gè)符合實(shí)際使用要求的軟件UART。
硬件接口
HT49R70片內(nèi)集成了41×3或40×4段的LCD驅(qū)動(dòng)器,特別適用于多種LCD低功耗應(yīng)用。單周期指令和二級(jí)流水線結(jié)構(gòu)使得HT49系列適合各種高速處理的應(yīng)用。
HT49R70其他資源有:8K×16位的程序存儲(chǔ)器ROM, 224×8位的數(shù)據(jù)存儲(chǔ)器RAM,16級(jí)堆棧,8位輸入口,16位雙向輸入/輸出口,2個(gè)外部中斷輸入,一個(gè)8位和一個(gè)16位的帶PFD(可編程分頻器)功能可編程定時(shí)/計(jì)數(shù)器,看門狗定時(shí)器,帶8位前置分頻器的RTC,蜂鳴器輸出,內(nèi)置晶振、RC和32768Hz的振蕩電路,低電壓復(fù)位電路。
圖1為復(fù)費(fèi)率電表中的485接口電路。這里使用了3根口線,配合MAX481實(shí)現(xiàn)一個(gè)半雙工的485接口。
由于應(yīng)用中的其他任務(wù)對(duì)實(shí)時(shí)性的要求,這里使用了一個(gè)外部中斷作為接收線,用來捕捉起始位。有的完全使用普通口線實(shí)現(xiàn)軟件UART,這種做法從原理上是可能的,但是必須以查詢方式捕捉起始位,要求有較高的MCU時(shí)鐘,并且對(duì)主程序的運(yùn)行效率有較大的影響。在使用外部中斷后,UART部分僅在通訊發(fā)生時(shí)才占用MCU,空閑時(shí)對(duì)主程序沒有影響。
軟件實(shí)現(xiàn)
用軟件實(shí)現(xiàn)UART時(shí),本機(jī)發(fā)送相對(duì)容易,只要按UART時(shí)序要求在發(fā)送線上維持正確的電平即可。關(guān)鍵是數(shù)據(jù)接收,對(duì)接收方而言,接收事件的發(fā)生完全是隨機(jī)的。必須監(jiān)視接收線上任何時(shí)刻的電平變化,一旦確認(rèn)收到有效的起始位,軟件UART即開始接收數(shù)據(jù)。
波特率發(fā)生
使用一個(gè)定時(shí)器為接收和發(fā)送產(chǎn)生波特率。由于使用的是軟件UART,發(fā)送和接收時(shí)的時(shí)基頻率是不一樣的。發(fā)送時(shí)的時(shí)基頻率與通訊波特率相同,而接收時(shí)接收數(shù)據(jù)的采樣頻率實(shí)際為波特率的16倍頻。這里最終實(shí)現(xiàn)的是一個(gè)半雙工的485接口,發(fā)送和接收不會(huì)同時(shí)發(fā)生,因而可以用一個(gè)定時(shí)器來產(chǎn)生發(fā)送和接收所需的時(shí)間基準(zhǔn)。
例如,對(duì)應(yīng)1200bps的波特率,數(shù)據(jù)每一位的寬度為Td=s=833ms。發(fā)送數(shù)據(jù)時(shí),每一位數(shù)據(jù)的電平都必須維持這個(gè)寬度。接收數(shù)據(jù)時(shí)以波特率的16倍頻采樣,采樣周期為Tw==52ms。(見圖2)。
發(fā)送
數(shù)據(jù)發(fā)送只需按照UART時(shí)序在發(fā)送線上產(chǎn)生波形即可。 圖3中Send函數(shù)準(zhǔn)備好發(fā)送數(shù)據(jù),Timer1設(shè)為833ms定時(shí),并且開放中斷,同時(shí)將通訊狀態(tài)置為忙。
圖4中ISRTimer1Send為Timer1中斷服務(wù)程序中處理發(fā)送的函數(shù),ISRTimer1Send函數(shù)將包括起始位、數(shù)據(jù)位、停止位的數(shù)據(jù)按規(guī)定的順序和寬度,按位發(fā)送到發(fā)送端上。直到所有位發(fā)送完畢,將通訊狀態(tài)置為空閑。
接收
接收不是由本機(jī)啟動(dòng),而是由一個(gè)外部事件觸發(fā)的。 在空閑狀態(tài)時(shí),若接收線上出現(xiàn)一個(gè)下降沿,即視為一個(gè)可能的起始位,應(yīng)該對(duì)其再次采樣加以確定。一個(gè)真實(shí)的起始位,其低電平維持時(shí)間為Td。我們?cè)谄鹗嘉坏闹虚g時(shí)刻,以波特率的16倍頻對(duì)接收線采樣三次,經(jīng)多數(shù)表決確認(rèn)其電平狀態(tài)。狀態(tài)為高,表明是一個(gè)干擾信號(hào),UART仍回到空閑狀態(tài)。若確認(rèn)接收線的狀態(tài)為低,則這個(gè)起始位得到確認(rèn),UART開始接收后續(xù)數(shù)據(jù)。每一位的接收方式與起始位確認(rèn)方式一樣,UART對(duì)接收線的采樣時(shí)序參見圖2。接收完畢UART又回到空閑狀態(tài)。如果最后的停止位出錯(cuò),則這一幀數(shù)據(jù)接收失敗,放棄接收到的數(shù)據(jù)。UART的接收狀態(tài)轉(zhuǎn)換圖見圖5。
在UART的空閑狀態(tài),Rx的下降沿觸發(fā)外部中斷INT0,INT0中斷服務(wù)程序?qū)?/SPAN>Timer1定時(shí)設(shè)為8Tw。時(shí)間到,Timer1定時(shí)改為Tw,以Tw為周期對(duì)Rx連續(xù)采樣3次以確認(rèn)起始位。
當(dāng)起始位被確認(rèn),UART進(jìn)入數(shù)據(jù)接收狀態(tài),Timer1定時(shí)改為14Tw以采樣下一位數(shù)據(jù),每一位數(shù)據(jù)也是以Tw為周期對(duì)Rx連續(xù)采樣3次。這期間Timer1的定時(shí)會(huì)根據(jù)需要設(shè)為Tw或14Tw,參見圖2。停止位接收完畢,標(biāo)記接收有效或出錯(cuò),同時(shí)UART回到空閑狀態(tài)。
結(jié)語
本文介紹了用軟件方式構(gòu)建UART的一種方法,占用的MCU資源包括一個(gè)外部中斷和一個(gè)定時(shí)/計(jì)數(shù)器。這種方法可以實(shí)現(xiàn)較高的通訊波特率,并且在通訊過程中仍可以保證主任務(wù)的實(shí)時(shí)性。采用8M晶振時(shí),通訊波特率可以達(dá)到9600bps。以上方案在復(fù)費(fèi)率電子電能表中得到了很好的驗(yàn)證。
- uart(99724)
- 軟件實(shí)現(xiàn)(6164)
相關(guān)推薦
基于MM32F013x上實(shí)現(xiàn)UART極性取反的方案設(shè)計(jì)


如何通過MM32F013x-UART 9bit實(shí)現(xiàn)UART多處理器通信

基于FPGA實(shí)現(xiàn)多路UART/SPI通信系統(tǒng)

如何用HLS實(shí)現(xiàn)UART


如何用HLS實(shí)現(xiàn)UART呢?


UART0和UART1的相關(guān)資料分享
UART串口通信軟件相關(guān)資料推薦
實(shí)現(xiàn)UART轉(zhuǎn)BLE橋的參考設(shè)計(jì)
實(shí)現(xiàn)UART轉(zhuǎn)BLE的橋Bluetooth低能耗參考設(shè)計(jì)包含BOM,PCB文件及光繪文件
BF561 SPORT口用軟件實(shí)現(xiàn)UART
FPGA怎么用UART實(shí)現(xiàn) UART實(shí)現(xiàn)原理
【Z-turn Board試用體驗(yàn)】+UART原理及實(shí)現(xiàn)
【視頻】 stm32 uart硬件實(shí)現(xiàn)及深入探討3
【視頻】 stm32 uart硬件實(shí)現(xiàn)及深入探討4
一種基于FPGA的UART實(shí)現(xiàn)方法設(shè)計(jì)
三倍速采樣法實(shí)現(xiàn)多路軟件UART有什么優(yōu)點(diǎn)?
介紹一下UART的功能實(shí)現(xiàn)
如何實(shí)現(xiàn)ESP32 uart的接收空閑中斷?
如何利用FPGA實(shí)現(xiàn)UART的設(shè)計(jì)?
如何改變軟件中的UART波特率?
UART 4 UART參考設(shè)計(jì),Xilinx提供Verilo

UART 4 UART參考設(shè)計(jì),Xilinx提供VHDL代碼

基于FPGA的UART控制器的設(shè)計(jì)和實(shí)現(xiàn)

基于51系列單片機(jī)的通用軟件UART的實(shí)現(xiàn)

用FPGA/CPLD設(shè)計(jì)UART

利用FPGA實(shí)現(xiàn)UART的設(shè)計(jì)

HT48 & HT46 MCU UART的軟件實(shí)現(xiàn)方法

IO模擬UART實(shí)現(xiàn)

基于ASIC/SoC的UART核的設(shè)計(jì)

WK2124是SPITM接口的4通道UART器件,WK2124實(shí)現(xiàn)SPI橋接/擴(kuò)展4個(gè)增強(qiáng)功能串口(UART)的功能
帶硬件地址識(shí)別的UART IP的設(shè)計(jì)和實(shí)現(xiàn)

異步收發(fā)通信端口(UART)的FPGA實(shí)現(xiàn)

基于VerilogHDL的UART設(shè)計(jì)

HT48R30A-1/HT48C30-1輸入/輸出型八位單片

帶硬件地址識(shí)別的UART?IP?的設(shè)計(jì)和


用FPGA器件實(shí)現(xiàn)UART核心功能的一種方法


利用MAXQ3210實(shí)現(xiàn)軟件UART


用FPGA/CPLD設(shè)計(jì)UART


用FPGA器件實(shí)現(xiàn)UART核心功能的一種方法


TMS320C54X DSP實(shí)現(xiàn)UART的技術(shù)


C8051F310設(shè)計(jì)的UART擴(kuò)展實(shí)現(xiàn)


采用μPD78045F實(shí)現(xiàn)異步串行UART功能的方法


IO口模擬UART演示程序

外部中斷模擬UART演示程序

基于Verilog簡易UART的FPGA/CPLD實(shí)現(xiàn)

FPGA與CPLD實(shí)現(xiàn)UART

一種基于FPGA的UART 電路實(shí)現(xiàn)


集成UART核心的FPGA異步串行實(shí)現(xiàn)


基于NiosⅡ的UART設(shè)計(jì)與實(shí)現(xiàn)

華清遠(yuǎn)見FPGA代碼-RS-232C(UART)接口的設(shè)計(jì)與實(shí)現(xiàn)

uart是什么意思?認(rèn)識(shí)uart串口


HCI和UART的結(jié)構(gòu)與原理概述及計(jì)HCI-UART的設(shè)計(jì)實(shí)現(xiàn)方法


用于硬件UART和軟件模擬UART的DSPBIOS設(shè)備驅(qū)動(dòng)程序的實(shí)現(xiàn)詳細(xì)概述

將UART功能集成到FPGA內(nèi)部實(shí)現(xiàn)多模塊的設(shè)計(jì)


基于UART接口功能的實(shí)現(xiàn)設(shè)計(jì)


基于TL16C550C實(shí)現(xiàn)DSP UART數(shù)據(jù)通信的方法研究


單片機(jī)串口軟件UART的詳細(xì)資料合集免費(fèi)下載

使用FPGA和模塊化設(shè)計(jì)方法實(shí)現(xiàn)UART的設(shè)計(jì)論文

如何使用微處理器的UART來實(shí)現(xiàn)1-Wire?總線主機(jī)


通過USB如何快速了解UART串行接口的實(shí)現(xiàn)


在MM32F013x上實(shí)現(xiàn)UART單線半雙工的功能應(yīng)用

在MM32F013x上實(shí)現(xiàn)UART極性取反的功能應(yīng)用


如何使用FPGA和IP核實(shí)現(xiàn)多UART擴(kuò)展

EE-89:在ADSP-2181 EZ-Kit-Lite上實(shí)現(xiàn)軟件UART

一種基于FPGA的UART電路的實(shí)現(xiàn)

基于FPGA的UART模塊設(shè)計(jì)與實(shí)現(xiàn)簡介

UART寄存器的循環(huán)緩沖區(qū)實(shí)現(xiàn)以及中斷驅(qū)動(dòng)的UART實(shí)現(xiàn)和硬件設(shè)置


GPIO模擬UART的算法實(shí)現(xiàn)與設(shè)計(jì)方案

慕課嵌入式開發(fā)及應(yīng)用(第二章.UART驅(qū)動(dòng)構(gòu)件的設(shè)計(jì)方法)

AVR單片機(jī)教程——UART進(jìn)階

如何驅(qū)動(dòng)51單片機(jī)串口(uart通信)

ARM7-LPC213x(五)UART0 和 UART1

HAL_UART_Transmit函數(shù)底層實(shí)現(xiàn)

UART串口通信軟件推薦

【STM32筆記4】UART的時(shí)序解讀與硬件運(yùn)用(即硬件UART的實(shí)現(xiàn),另有硬件UART運(yùn)用和軟件UART運(yùn)用/硬件串口和軟件串口/USART的差異說明)

WK系列SPI擴(kuò)展UART驅(qū)動(dòng)移植參考

HT8 MCU Timer Module應(yīng)用范例–如何使用TM完成軟件UART功能

AN4457_基于STM32F4xx系列單片機(jī)軟件模擬UART的設(shè)計(jì)實(shí)現(xiàn)

振弦采集模塊的通訊速率和軟件握手( UART)


3. 瑞薩RA系列MCU-UART使用


基于FPGA實(shí)現(xiàn)多路UART/SPI通信系統(tǒng)

使用UART實(shí)現(xiàn)1-Wire總線主控


實(shí)現(xiàn)上位機(jī)與FPGA uart交互

代碼生成器配置和軟件UART的實(shí)現(xiàn)


實(shí)現(xiàn)一個(gè)在ARM中通過APB總線連接的UART模塊


評(píng)論