自1996年MSP430十六位單片機(jī)問世以來,它的低功耗性能及豐富的片內(nèi)資源受到各方面的好評,本文針對MSP430F13x及 MSP43014X 系列單片機(jī)中的定時(shí)器進(jìn)行介紹,利用定時(shí)器A(Timer_A)和定時(shí)器B(Timer_B)中的捕獲比較寄存器來開發(fā)多個(gè)串行通信口,使十六位單片機(jī)在通信領(lǐng)域發(fā)揮更大的潛力。 關(guān)鍵詞 Timer_A Timer_B 捕獲/比較寄存器 UART口 一、 概述 MSP430具有豐富的外圍模塊,如MSP430F149就包含:12位A/D,精密模擬比較器,硬件乘法器,2組頻率可達(dá)8MHZ的時(shí)鐘模塊,2個(gè)可以實(shí)現(xiàn)異步、同步及多址訪問的串行通行接口,采用了超低功耗技術(shù),可以進(jìn)行在線調(diào)試與編程,其指令周期可達(dá)125ns。MSP430F14X 系列目前在市場的售價(jià)大約為60元人民幣,與其它單片機(jī)相比,MSP430具有更高的性價(jià)比和優(yōu)越性,適合做測控、通訊等嵌入系統(tǒng)。本文介紹利用 MSP430中的定時(shí)器解決多串口通信。 目前美國德州儀器所出的所有FLASH 單片機(jī)都含有Timer_A,而在MSP430F13X系列和MSP43014X系列中既含有Timer_A也含有Timer_B,在F13X中有一個(gè)帶有3個(gè)捕獲/比較模塊的Timer_B,在F14X中有一個(gè)帶有7個(gè)捕獲/比較模塊的Timer_B,它們均是擴(kuò)展UART口的核心。 Timer_A和Timer_B都是非常有用的定時(shí)器,Timer_A具有以下特點(diǎn): (1) 十六位計(jì)數(shù)器,有四種工作模式(停止、增計(jì)數(shù)、連續(xù)、增/減計(jì)數(shù)) (2) 可以選擇計(jì)數(shù)器時(shí)鐘源(外設(shè)的,內(nèi)置的快慢速均可) (3) 三個(gè)具有可配置輸入端的捕獲/比較寄存器(具有自動(dòng)鎖存功能) (4) 可用于串行通信 與Timer_A相比,Timer_B可進(jìn)行8、10、12、16位計(jì)數(shù),但在Timer_B中未實(shí)現(xiàn)鎖存功能。Timer_A和Timer_B可支持同時(shí)進(jìn)行的多時(shí)序控制、多個(gè)捕獲/比較功能、多種輸出波形(PWM波形),也可以是上述功能的組合。 二、 可行性分析 首先,收和發(fā)是針對不同的定時(shí)器,它們的中斷源不同,中斷標(biāo)志會(huì)記住不同中斷。其次,同一定時(shí)器的不同捕獲寄存器(不包括CCR0)的中斷標(biāo)志有優(yōu)先級、共用一個(gè)中斷向量的中斷標(biāo)志,中斷向量寄存器(TAIV或TBIV)用于確定產(chǎn)生中斷請求的中斷源,所以當(dāng)出現(xiàn)同發(fā)或者同收現(xiàn)象時(shí),可以根據(jù)中斷向量寄存器中的內(nèi)容來確定具體的中斷操作,在進(jìn)入一個(gè)中斷后,中斷向量寄存器會(huì)保存另外中斷源的中斷向量,直到前一中段結(jié)束而執(zhí)行該中斷,即不會(huì)丟失另外的中斷。 三、 系統(tǒng)原理 計(jì)算機(jī)進(jìn)行串行通信的高電平為-5~-15V,低電平為5~15V,而從MSP430單片機(jī)輸出的信號的高電平為3V,低電平0V,要實(shí)現(xiàn)MSP430與計(jì)算機(jī)通信必須進(jìn)行電平轉(zhuǎn)換。實(shí)現(xiàn)這一轉(zhuǎn)換,可以利用MAX202E來實(shí)現(xiàn)。 發(fā)送特性的實(shí)現(xiàn)是用比較功能將數(shù)據(jù)從輸出單元的引腳移出,波特率是用定時(shí)器定時(shí)產(chǎn)生中斷來實(shí)現(xiàn)的。 接收特性的實(shí)現(xiàn)是利用定時(shí)器的捕獲功能實(shí)現(xiàn)接收數(shù)據(jù)的檢測,當(dāng)檢測到起始位時(shí),將定時(shí)器設(shè)置為比較模式,接收的位被EQUx信號自動(dòng)鎖存。這樣就不會(huì)因CPU無法及時(shí)響應(yīng)而造成接收錯(cuò),提高了接收控制的靈活性,從而CPU因不需等待接收而提高其利用率。 以MSP430F149為例,Timer_A的捕捉/比較寄存器具有將輸入信號鎖存的功能,故利用它實(shí)現(xiàn)輸入信號的準(zhǔn)確接收;而 Timer_B捕捉/比較寄存器不具有將輸入信號鎖存的功能,不宜將其作為串口的輸入,本例利用它控制串口的輸出。因Timer_A只有三個(gè)捕捉/比較寄存器,故利用它們可以開發(fā)出三個(gè)UART口,加上其本身的兩個(gè)UART口,MSPF149最終可有五個(gè)UART口,硬件電路簡圖如圖(1)(其中,UTXD1、URXD1的電平轉(zhuǎn)換與其它幾個(gè)UART的 硬件連接 一樣) 四、主程序工作過程及軟件框圖 用Timer_A和Timer_B要實(shí)現(xiàn)多個(gè)UART口,合理選取Timer_A和Timer_B的工作模式非常重要。經(jīng)分析,我們選取 Timer_A和Timer_B工作在連續(xù)記數(shù)模式。在主程序中,需要發(fā)送數(shù)據(jù)時(shí),由主程序調(diào)用發(fā)送子程序(其主要作用是初始化用于發(fā)送數(shù)據(jù)的 Timer_B,經(jīng)過初始化以后,由定時(shí)器定時(shí)產(chǎn)生中斷來發(fā)送數(shù)據(jù))。而接收模塊初始化以后,接收數(shù)據(jù)的起始位的檢測由定時(shí)器的捕獲功能自動(dòng)實(shí)現(xiàn),不需軟件控制,當(dāng)捕獲器檢測到起始位以后由接收中斷服務(wù)子程序?qū)崿F(xiàn)數(shù)據(jù)的接收,其軟件框圖如下: 以Timer_A的CCR0的接收、Timer_B的CCR0的發(fā)送為例,其中斷服務(wù)子程序分別如下: 1、 發(fā)送中斷服務(wù)子程序: TX_LOOP ADD #Bitime,&TBCCR0 BIT #0001H,R5 JNZ TX1 BIC #OUT,&TBCCTL0 JMP TX2 TX1 BIS #OUT,&TBCCTL0 TX2 SUB #01H,R6 JNZ TX3 BIC #CCIE,&TBCCTL0 TX3 RRA R5 RETI 2、 接收中斷服務(wù)子程序: RX_LOOP CMP #0009H,R8 JNZ RX_START BIC #CAP,&CCTL0 MOV &TAR,&CCR0 ADD #Bitime1_5,&CCR0 MOV #0000H,R7 DEC R8 JMP RXEND RX_START BIT #SCCI,&CCTL0 RRC.B R7 SUB #01H,R8 JNZ RXEND1 BIC #CCIE,&CCTL0 RXEND1 ADD #Bitime,&CCR0 RXEND RETI 利用Timer_A和Timer_B實(shí)現(xiàn)UART功能的完整調(diào)試程序見附頁:(在程序中,考慮到接收與發(fā)送的多個(gè)UART的中斷具有相似之處,我們在程序中僅對兩個(gè)發(fā)送口和兩個(gè)接收口進(jìn)行了調(diào)試,經(jīng)調(diào)試,證實(shí)了利用Timer_A和Timer_B可以實(shí)現(xiàn)多個(gè)UART口功能。 五、對Timer_A和Timer_B實(shí)現(xiàn)的UART口的實(shí)時(shí)性、誤差分析: 1. 接收和發(fā)送的實(shí)時(shí)性: 在發(fā)送數(shù)據(jù)時(shí),如果定時(shí)器的計(jì)數(shù)時(shí)鐘頻率比較高,例如,當(dāng)定時(shí)器的計(jì)數(shù)時(shí)鐘頻率為8MHZ,波特率為9600時(shí),接收/發(fā)送相鄰比特的間隔為833個(gè)時(shí)鐘周期,即使延時(shí)幾十個(gè)時(shí)鐘周期(按理論,只要小于250個(gè)時(shí)鐘周期即可)發(fā)送下一個(gè)比特也能正確接收該字節(jié)。在接收數(shù)據(jù)時(shí),由于定時(shí)器具有自動(dòng)鎖存功能,對數(shù)據(jù)位的接收只要在下一位數(shù)據(jù)到來之前接收即可。由此可見,用定時(shí)器實(shí)現(xiàn)的UART口完全可以實(shí)現(xiàn)實(shí)時(shí)性,這完全可以用于對實(shí)時(shí)性要求比較高的系統(tǒng)。 2. 接收和發(fā)送一個(gè)字節(jié)的CPU占用率: 由于是利用中斷來喚醒接收和發(fā)送中斷服務(wù)的,在接收和發(fā)送的位間隔時(shí)間中CPU可以繼續(xù)執(zhí)行其他程序。CPU占用率可用以下公式計(jì)算: CPU占用率=(發(fā)送或接收一位總的占用時(shí)鐘周期*波特率)/CPU頻率 經(jīng)計(jì)算,發(fā)送和接收一個(gè)字節(jié)的CPU占用率(以最高時(shí)鐘頻率8MHZ、波特率為9600為例)分別約為:3.31%和3.39%。 3. 時(shí)間誤差分析: 對于一般的UART口來說,由于字節(jié)間存在累積誤差,因此,對波特率的要求較高,需要時(shí)鐘頻率非常接近波特率的整數(shù)倍。而實(shí)際波特率往往是通過時(shí)鐘分頻得到,無法產(chǎn)生精確的波特率,不可避免地會(huì)擴(kuò)大累積誤差。對于利用定時(shí)器實(shí)現(xiàn)的UART口來說,在發(fā)送或接收下一個(gè)字節(jié)時(shí),定時(shí)器重新開始該字節(jié)內(nèi)的計(jì)數(shù),因此,字節(jié)之間不存在累積誤差,僅存在字節(jié)內(nèi)的累積誤差,因此,這大大降低了時(shí)鐘接近波特率的整數(shù)倍的要求,在定時(shí)器的計(jì)數(shù)時(shí)鐘頻率比較高(為波特率的幾百倍時(shí))時(shí),時(shí)鐘的選擇將不受限制。 在定時(shí)器實(shí)現(xiàn)的UART口中,當(dāng)定時(shí)器的計(jì)數(shù)時(shí)鐘頻率比較高時(shí),字節(jié)內(nèi)產(chǎn)生的累積誤差也非常小。例如,當(dāng)定時(shí)器的計(jì)數(shù)時(shí)鐘頻率為 8MHZ,波特率為9600時(shí),要求定時(shí)器每計(jì)數(shù)833.333時(shí)發(fā)送一個(gè)比特,然而,定時(shí)器只能計(jì)整數(shù),因此選擇每計(jì)數(shù)833時(shí)發(fā)送一個(gè)比特。在這種情況下,每一位所產(chǎn)生的誤差只有千之幾,這樣的誤差較一般的UART口來說是非常小的。 4. 與一般的UART口的性能比較: UART口的實(shí)現(xiàn)在各種不同類型的微處理機(jī)系統(tǒng)中都不同,可能是用通用的I/O端口以等待的方式用軟件實(shí)現(xiàn)位的處理,這樣的處理方式需要極大的CPU開銷,因此增大了功耗,也降低了CPU的可用性。而用定時(shí)器實(shí)現(xiàn)的UART口,在發(fā)送或接收時(shí)的位間隔期間,CPU可以繼續(xù)執(zhí)行其他的程序,加上MSP430單片機(jī)自身的特點(diǎn),它甚至可以在超低功耗模式下接收和發(fā)送。 六、結(jié)束語 MSP430單片機(jī)的定時(shí)器功能強(qiáng)大,中斷源較多,可以任意嵌套,它給工程開發(fā)人員提供了較多的選擇余地。上面僅介紹了用TIMER_A、 TIEMR_B來擴(kuò)充UART口,開發(fā)人員只要熟悉定時(shí)器的工作原理,就可以根據(jù)自己的需要,從多種方法中選出最優(yōu)方案。MSP430單片機(jī)所具有的較高性價(jià)比及優(yōu)越性必將使其成為眾多單片機(jī)中出色的一員。 參考文獻(xiàn) 1. 胡大可.《MSP430系列FLASH型超低功耗16位單片機(jī)》.北京航空航天大學(xué)出版設(shè),2001 2. 《MSP430系列軟件用戶指南》.利爾達(dá)(中國)電子有限公司 3. 《MSP430 ASSERMBLER,LINKER,AND LIBRARIAN PROMGRAMING》.利爾達(dá)(中國)電子有限公司 4. 鄔寬明.《單片機(jī)外圍器件使用手冊-數(shù)據(jù)傳輸接口器件分冊》.北京航空航天大學(xué)出版設(shè) 完整的調(diào)試程序源代碼 #include "msp430x14x.h" ORG 0FFFEH DW MAIN /*設(shè)置上電起始地址*/ RSEG UDATA0 DS 0 Bitime EQU 209H /*發(fā)送比特的時(shí)間間隔,時(shí)鐘平率為5.030MHZ,波特率為9600比特/秒*/ Bitime1_5 EQU 30EH /*起始位與第一個(gè)比特的時(shí)間間隔*/ TX_Count EQU 000AH /*發(fā)送數(shù)據(jù)的計(jì)數(shù)值*/ RX_Count EQU 0009H /*接收數(shù)據(jù)的計(jì)數(shù)值*/ CHECKDATA EQU 0300H /*存儲(chǔ)通道1(CCR0)接收數(shù)據(jù)的起始地址*/ CHECKDATA1 EQU 0500H /*存儲(chǔ)通道1(CCR1)接收數(shù)據(jù)的起始地址*/ RSEG CSTACK /*定義堆棧段*/ DS 0 RSEG CODE /*代碼段開始*/ DS 0 MAIN MOV #(WDTPW+WDTHOLD),&WDTCTL /* 關(guān)閉看門狗*/ INITSYS MOV #SFE(CSTACK),SP MOV.B #(RSEL2+RSEL1+RSEL0),&BCSCTL1 /*設(shè)置基礎(chǔ)時(shí)鐘模塊*/ MOV.B #(DCO2+DCO1+DCO0),&DCOCTL BIC.B #OSCOFF,SR PUSH #0FFFFH /*基礎(chǔ)時(shí)鐘的調(diào)整時(shí)鐘*/ LOOP DEC 0(SP) JNZ LOOP MOV.B #SELM_1,&BCSCTL2 /* 選擇系統(tǒng)時(shí)鐘源*/ SetupTA MOV #(TASSEL_2+MC1),&TACTL /*設(shè)置定時(shí)器A的時(shí)鐘源及工作模式*/ MOV #(TBSSEL_2+MC1),&TBCTL /*設(shè)置定時(shí)器B的時(shí)鐘源及工作模式*/ SetupC0 MOV #OUT,&TBCCTL0 /*通道1發(fā)送空閑數(shù)據(jù)*/ MOV #OUT,&TBCCTL1 /*通道2發(fā)送空閑數(shù)據(jù)*/ Setupp1_2 MOV.B #00H,&1DIR /*設(shè)置定時(shí)器A和定時(shí)器B輸入/出數(shù)據(jù)的管腳*/ BIS.B #06H,&1SEL /*P1.1和P1.2用于接收數(shù)據(jù)*/ BIS.B #03H,&4DIR /*P4.0和P4.1用于發(fā)送數(shù)據(jù)*/ BIS.B #03H,&4SEL Delay PUSH #00FFH /*用于延時(shí)*/ Delay2 DEC 0(SP) JNZ Delay2 INCD SP MOV #GIE,SR /*開中斷*/ /*--------------調(diào)試發(fā)送、接受模塊的功能-----------------------*/ MOV #CHECKDATA,R14 /*設(shè)置接收通道1數(shù)據(jù)的起始地址*/ MOV #CHECKDATA1,R4 /*設(shè)置接收通道2數(shù)據(jù)的起始地址*/ MOV #35H,R5 /*R5、R9用于存儲(chǔ)發(fā)送的數(shù)據(jù)*/ MOV #39H,R9 /*發(fā)送數(shù)據(jù)可以放于RAM中,或用變量代替R5,R9*/ MOV #00H,R10 CALL #RX_Ready /*開啟接收端口*/ CALL #TX_Byte /*發(fā)送2個(gè)通道的可以同時(shí)開啟,但這里先開啟通道1*/ TEST_TX12 CMP #00H,R6 /*判斷通道1發(fā)送是否完畢,可以在中斷服務(wù)程序中設(shè)置發(fā)送完標(biāo)志*/ JNZ TEST_TX22 MOV #0035H,R5 /*發(fā)送的數(shù)據(jù)沒有設(shè)置奇偶校驗(yàn)位,但可以根據(jù)情況設(shè)置*/ CALL #TX_Byte /*發(fā)送完畢繼續(xù)發(fā)送以便于調(diào)試發(fā)送數(shù)據(jù)是否正確*/ TEST_TX22 CMP #00H,R10 /*判斷通道2發(fā)送是否完畢,可以在中斷服務(wù)程序中設(shè)置發(fā)送完標(biāo)志*/ JNZ TEST_RX12 MOV #0039H,R9 /*發(fā)送完畢繼續(xù)發(fā)送以便于調(diào)試發(fā)送數(shù)據(jù)是否正確*/ CALL #TX_Byte1 JMP TEST_RX12 TEST_RX12 CMP #00H,R8 /*判斷通道1數(shù)據(jù)是否接收完*/ JNZ TEST_RX22 MOV R7,R15 /*將接暫時(shí)數(shù)據(jù)存儲(chǔ)于R15中,也可以利用RAM來存儲(chǔ)*/ MOV #RX_Count,R8 /*接收控制*/ MOV #(CCIE+CAP+CCIS_0+CM_2+OUT),&CCTL0 /*準(zhǔn)備接受下一個(gè)數(shù)據(jù)*/ LOAD MOV.B R15,0(R14) /*將接收數(shù)據(jù)存儲(chǔ)在RAM中,用于調(diào)試接收是否正確,可以奇偶校驗(yàn)來判斷*/ INC R14 /*R14用于存儲(chǔ)接收數(shù)據(jù)存放的地址,可以用變量代替*/ TEST_RX22 CMP #00H,R12 /*判斷通道2數(shù)據(jù)是否接收完*/ JNZ TEST_TX12 MOV R11,R13 /*將接暫時(shí)數(shù)據(jù)存儲(chǔ)于R13中,也可以利用RAM來存儲(chǔ)*/ MOV #RX_Count,R12 /*接收控制*/ MOV #(CCIE+CAP+CCIS_0+CM_2+OUT),&CCTL1 LOAD1 MOV.B R13,0(R4) /*將接收數(shù)據(jù)存儲(chǔ)在RAM中,用于調(diào)試接收是否正確,可以奇偶校驗(yàn)來判斷*/ INC R4 /*R4用于存儲(chǔ)接收數(shù)據(jù)存放的地址,可以用變量代替*/ JMP TEST_TX12 /*------------調(diào)試代碼段結(jié)束------*/ /************發(fā)送數(shù)據(jù)子程序*****************/ TX_Byte /*通道1的發(fā)送中斷服務(wù)子程序*/ MOV #TX_Count,R6 /*R6用于存放發(fā)送的比特?cái)?shù),可以用變量代替*/ BIS #0FF00H,R5 /*用于設(shè)置停止位*/ MOV #(CCIE+CLLD_3),&TBCCTL0 /*設(shè)置定時(shí)器B的CCR0的工作模式*/ MOV #Bitime,&TBCCR0 /*設(shè)置第一位的中斷時(shí)間*/ ADD &TBR,&TBCCR0 BIC #OUT,&TBCCTL0 /*發(fā)送起始位*/ ADD #Bitime,&TBCCR0 /*下一位的接收時(shí)間*/ RET /*CCR1,CCR2的中斷共用一個(gè)地址,如果CCR2用于模塊功能,必須首先判斷是否為CCR1產(chǎn)生的中斷*/ TX_Byte1 /*通道2的發(fā)送中斷服務(wù)子程序*/ MOV #TX_Count,R10 /*發(fā)送控制,R10用于存儲(chǔ)通道2的發(fā)送比特位的個(gè)數(shù)*/ BIS #0FF00H,R9 MOV #(CCIE+CLLD_3),&TBCCTL1 /*設(shè)置定時(shí)器B的CCR1的工作模式*/ MOV #Bitime,&TBCCR1 /*設(shè)置第一位的中斷時(shí)間*/ ADD &TBR,&TBCCR1 BIC #OUT,&TBCCTL1 /*發(fā)送起始位*/ ADD #Bitime,&TBCCR1 /*下一位的接收時(shí)間*/ RET /*---------準(zhǔn)備接受數(shù)據(jù)-----------------------------*/ RX_Ready MOV #(TASSEL_2+MC_2),&TACTL /*設(shè)置定時(shí)器A的工作模式*/ MOV #RX_Count,R8 /*R8,R12用于存儲(chǔ)接收的比特?cái)?shù),可以用變量代替*/ MOV #RX_Count,R12 /*接受控制*/ MOV #(CCIE+CAP+CCIS_0+CM_2+OUT),&CCTL0 /* 設(shè)置定時(shí)器A的CCR0的工作模式*/ MOV #(CCIE+CAP+CCIS_0+CM_2+OUT),&CCTL1 /* 設(shè)置定時(shí)器A的CCR1的工作模式*/ MOV #0000H,R11 /* R11 用于存儲(chǔ)CCR1接受的數(shù)據(jù)*/ MOV #0000H,R7 /* R7用于存儲(chǔ)通道1接受的數(shù)據(jù)*/ RET /*----------------發(fā)送中斷服務(wù)子程序(CCR0)---------------------*/ TX_LOOP /*通道1的發(fā)送中斷服務(wù)子程序*/ ADD #Bitime,&TBCCR0 BIT #0001H,R5 /*判斷發(fā)送位為1還是0*/ JNZ TX1 BIC #OUT,&TBCCTL0 /*發(fā)送起始位*/ JMP TX2 TX1 BIS #OUT,&TBCCTL0 TX2 SUB #01H,R6 /*發(fā)送比特?cái)?shù)減1*/ JNZ TX3 BIC #CCIE,&TBCCTL0 TX3 RRA R5 /*發(fā)送數(shù)據(jù)存儲(chǔ)于R5中,可以用變量代替,必須與主程序中的設(shè)置一致*/ RETI /*----------------發(fā)送中斷服務(wù)子程序(CCR1)---------------------*/ TX_LOOP1 /*通道2的發(fā)送中斷服務(wù)子程序*/ ADD #Bitime,&TBCCR1 BIT #0001H,R9 /*判斷發(fā)送位為1還是0*/ JNZ TX11 BIC #OUT,&TBCCTL1 /*發(fā)送起始位*/ JMP TX21 TX11 BIS #OUT,&TBCCTL1 TX21 SUB #01H,R10 /*發(fā)送比特?cái)?shù)減1*/ JNZ TX31 BIC #CCIE,&TBCCTL1 TX31 RRA R9 /*發(fā)送數(shù)據(jù)存儲(chǔ)于R9中,可以用變量代替,必須與主程序中的設(shè)置一致*/ BIC #CCIFG,&TBCCTL1 /*中斷完,關(guān)閉中斷標(biāo)志位*/ RETI /*----------------接受中斷服務(wù)子程序(CCR0)---------------------*/ RX_LOOP /*通道1的接收中斷服務(wù)子程序*/ CMP #0009H,R8 /*判斷接收位數(shù)*/ JNZ RX_START BIC #CAP,&CCTL0 /*接收到起始位,將定時(shí)器設(shè)置為比較模式*/ MOV #Bitime1_5,&CCR0 /*設(shè)置第一位的接收時(shí)間*/ ADD &TAR,&CCR0 MOV #0000H,R7 /*將接收存儲(chǔ)器清除,準(zhǔn)備接收數(shù)據(jù)*/ DEC R8 JMP RXEND RX_START BIT #SCCI,&CCTL0 /*判斷接收位為是0還是1*/ RRC.B R7 SUB #01H,R8 JNZ RXEND1 BIC #CCIE,&CCTL0 /*接收完,關(guān)閉中斷允許位,開啟在主程序*/ JMP RXEND RXEND1 ADD #Bitime,&CCR0 /*設(shè)置下一位的接收時(shí)間*/ RXEND RETI /*----------------接受中斷服務(wù)子程序(CCR1)---------------------*/ RX_LOOP1 /*通道1的接收中斷服務(wù)子程序*/ CMP #0009H,R12 /*判斷接收位數(shù)*/ JNZ RX_START1 BIC #CAP,&CCTL1 /*接收到起始位,將定時(shí)器設(shè)置為比較模式*/ MOV #Bitime1_5,&CCR1 /*設(shè)置第一位的接收時(shí)間*/ ADD &TAR,&CCR1 MOV #0000H,R11 /*將接收存儲(chǔ)器清除,準(zhǔn)備接收數(shù)據(jù)*/ DEC R12 JMP RXEND10 RX_START1 BIT #SCCI,&CCTL1 /*判斷接收位為是0還是1*/ RRC.B R11 SUB #01H,R12 JNZ RXEND11 BIC #CCIE,&CCTL1 /*接收完,關(guān)閉中斷允許位,開啟在主程序*/ RXEND11 ADD #Bitime,&CCR1 /*設(shè)置下一位的接收時(shí)間*/ RXEND10 BIC #CCIFG,&CCTL1 /*中斷完,關(guān)閉中斷標(biāo)志位*/ RETI /*-----------列中斷向量表-----------------*/ COMMON INTVEC ORG TIMERB0_VECTOR DW TX_LOOP ORG TIMERB1_VECTOR DW TX_LOOP1 ORG TIMERA0_VECTOR DW RX_LOOP ORG TIMERA1_VECTOR DW RX_LOOP1 END 說明:該程序用于測試?yán)枚〞r(shí)器實(shí)現(xiàn)UART口的可行性,接收數(shù)據(jù)直接通過存儲(chǔ)器所接收的數(shù)據(jù)來判斷接收的正確性,在整個(gè)調(diào)試過程中,我們用超級終端隨機(jī)發(fā)送數(shù)據(jù),利用示波器觀察UART發(fā)送的數(shù)據(jù),通過在線調(diào)試來觀察接收的數(shù)據(jù)是否正確。因此,沒有考慮寄存器的有限性、數(shù)據(jù)的奇偶位。在實(shí)際運(yùn)用系統(tǒng)中,可以用存儲(chǔ)器來代替某些寄存器,也可以擴(kuò)充存儲(chǔ)空間和判斷奇偶位。 通過反復(fù)的調(diào)試,用定時(shí)器擴(kuò)充的UART口可以正確無誤的進(jìn)行接收/發(fā)送。由于該程序僅用于調(diào)試用定時(shí)器擴(kuò)充的UART口的可行性,在實(shí)際運(yùn)用中可以根據(jù)具體情況做相應(yīng)改動(dòng)。 利用定時(shí)器擴(kuò)充的另外的一個(gè)UART口與其它兩個(gè)類似,在擴(kuò)充另外一個(gè)UART口時(shí),必須考慮CCR1與CCR2共用一個(gè)中斷向量的中斷標(biāo)志。 作者簡介: 丁鵬飛 男,西安郵電學(xué)院電子與信息工程系本科生 徐國軍 男,西安郵電學(xué)院通信工程工程系本科生 電話號碼: 丁鵬飛(029-5384124),徐國軍(029-5384044) |