顏麗莎 朱力宏
(鄭州鐵路職業(yè)技術(shù)學(xué)院,河南 鄭州 450052)
NIOS II系統(tǒng)是Altera公司推出的32位RSIC嵌入式處理器。它具有完善的軟件開(kāi)發(fā)套件,包括編譯器、集成開(kāi)發(fā)環(huán)境、JTAG調(diào)試等,設(shè)計(jì)者能夠用Altera Quarter II開(kāi)發(fā)軟件的SOPC Builde系統(tǒng)開(kāi)發(fā)工具創(chuàng)建處理器系統(tǒng),并能夠根據(jù)需求添加其組件。[1]
通用異步收發(fā)器(UART),是嵌入式系統(tǒng)上很常用的一個(gè)串行接口,由于其方便、簡(jiǎn)單、易用等特性,在嵌入式系統(tǒng)中扮演著十分重要的角色。UART通過(guò)電平轉(zhuǎn)換可實(shí)現(xiàn)RS232、RS485、RS422等工業(yè)標(biāo)準(zhǔn)的接口,在相關(guān)工業(yè)控制通信中應(yīng)用十分廣泛。UART通信主要通過(guò)RXD和TXD兩條信號(hào)線,即可實(shí)現(xiàn)全雙工串行通信。
在一些應(yīng)用中,往往需要兩三個(gè)甚至多個(gè)串口,選用現(xiàn)成的MCU方案,顯然很難滿足需求。由于UART作為一個(gè)組件與其相關(guān)外設(shè)的IP放在SOPC Builder里,可供用戶直接調(diào)用。因此,基于FPAG芯片的NIOS系統(tǒng),可根據(jù)需求方便地配置出多個(gè),甚至是幾十個(gè)串口,而且可任意分配引腳。因此,討論和采用NIOS II系統(tǒng)實(shí)現(xiàn)串口通信功能具有重要的實(shí)際意義。
在以往的關(guān)于基于NIOS II系統(tǒng)串口使用的文章中,往往只針對(duì)于寄存器控制等某一細(xì)節(jié)問(wèn)題進(jìn)行討論。實(shí)際使用中,串口的軟件控制可以通過(guò)HAL系統(tǒng)庫(kù)、寄存器等幾種不同的控制方法實(shí)現(xiàn)。其每一種方法又各有優(yōu)劣,適合于不同的應(yīng)用場(chǎng)合。本文從NIOS II系統(tǒng)中串口硬件定制入手,重點(diǎn)討論幾種不同軟件控制方法的實(shí)現(xiàn)及特點(diǎn),并提供了詳細(xì)的例程代碼,為NIOS II系統(tǒng)的使用開(kāi)發(fā)者提供設(shè)計(jì)參考。
本設(shè)計(jì)中要實(shí)現(xiàn)帶NIOS II的FPGA系統(tǒng)與其它系統(tǒng)間的串行通訊,首先要建立硬件連接。在硬件設(shè)計(jì)中,通常采用接口芯片MAX3232構(gòu)成RS232硬件電路實(shí)現(xiàn)不同系統(tǒng)間的電平匹配。
在Quartus II中新建工程,將圖形設(shè)計(jì)作為頂層文件,通過(guò)SOPC將NIOS II系統(tǒng)模塊建立到頂層文件中。NIOS II處理器提供了豐富的外圍設(shè)備,可以根據(jù)需求在SOPC Builder中添加,其中主要包括UART串口IP核。
UART核實(shí)現(xiàn)了基于FPGA的嵌入式系統(tǒng)與外部器件之間的串行字符流通信。該核可實(shí)現(xiàn)RS-232協(xié)議,提供可以調(diào)節(jié)的波特率、校驗(yàn)、停止/數(shù)據(jù)位,以及可選的RTS/CTS控制信號(hào),用戶可以根據(jù)需要配置該核。
UART核提供了一個(gè)簡(jiǎn)單的寄存器映像Avalon從端口,它允許Avalon主外設(shè)(如NIOS II處理器)簡(jiǎn)單地通過(guò)讀和寫控制寄存器與該核實(shí)現(xiàn)通信。
該核可直接由SOPC Builder工具創(chuàng)建,創(chuàng)建完成后的接口信號(hào)有RXD、TXD、CTX和RTS(其中后兩項(xiàng)可選)。定制時(shí),可通過(guò)配置對(duì)話框設(shè)定UART核的各項(xiàng)參數(shù)。
主要參數(shù)有:
(1)波特率設(shè)置選項(xiàng)
UART核可以實(shí)現(xiàn)RS-232的所有標(biāo)準(zhǔn)波特率。波特率可以設(shè)定為固定波特率和可變波特率。當(dāng)設(shè)定為固定波特率時(shí),通過(guò)下拉框可選115200/9600等,不能通過(guò)軟件修改。可變波特率可以通過(guò)寫divisor寄存器設(shè)定分頻值,來(lái)改變波特率值。
(2)數(shù)據(jù)位、停止位和奇偶校驗(yàn)位設(shè)置
這些參數(shù)只能在配置系統(tǒng)創(chuàng)建時(shí)設(shè)置,不能在系統(tǒng)生成后通過(guò)寫相應(yīng)的寄存器修改。
(3)流控制
當(dāng)流控制選項(xiàng)Include CTS/RST pin& contro lregister bits選中時(shí),UART核的cts、dcts、rts、idcts等寄存器位直接反映流控制信號(hào),如果該選項(xiàng)未被選中時(shí),這些狀態(tài)位總是讀為0。
UART核中的Avalon接口可選擇實(shí)現(xiàn)流傳輸模式。這允許主設(shè)備僅在UART準(zhǔn)備接收一個(gè)字符時(shí)寫數(shù)據(jù),且僅在UART有效數(shù)據(jù)時(shí)讀數(shù)據(jù),當(dāng)選項(xiàng)Include end-of-packet register是on狀態(tài)時(shí),UART核可以結(jié)束一個(gè)與主設(shè)備之間的流模式數(shù)據(jù)傳輸。它能自動(dòng)將接收的字符寫到存儲(chǔ)器中,直到RxD端接收到一個(gè)指定的字符為止。結(jié)束字符由endofpacket寄存器決定。
建立硬件IP核完成硬件設(shè)計(jì)以后,在NIOS II集成開(kāi)發(fā)環(huán)境里,通過(guò)軟件編程及設(shè)置實(shí)現(xiàn)UART的控制。對(duì)于NIOS處理器用戶來(lái)說(shuō),我們總結(jié)了有下列三種控制UART的編程方法。
用戶可以使用ANSI C標(biāo)準(zhǔn)庫(kù)函數(shù)訪問(wèn)UART核,例如printf()和getchar()等。ioctl()請(qǐng)求允許HAL用戶直接控制UART核與硬件相關(guān)的功能。
HAL系統(tǒng)庫(kù)API支持對(duì)UART核功能部件的完全訪問(wèn)。NIOS II程序把UART核看成是一個(gè)字符模式設(shè)備,使用ANSIC標(biāo)準(zhǔn)庫(kù)函數(shù)發(fā)送和接收數(shù)據(jù)。
下面的代碼是一個(gè)最簡(jiǎn)單的串口通信程序,具體功能是使用printf函數(shù)將一個(gè)字符顯示到stdout設(shè)備上。
需要注意的是,這個(gè)例子中的SOPC Builder系統(tǒng)包含了一個(gè)名為uart0的UART核,采用這種方法的UART編程,要在NIOS II IDE的工程配置選項(xiàng)中將所使用的串口設(shè)備uart_0配置為stout。這種方法最簡(jiǎn)單,代碼最少。但是缺點(diǎn):1.效率較低;2.由于占用了stout等通道,調(diào)試時(shí),無(wú)法用jtag_uart通過(guò)NIOS II內(nèi)部控制臺(tái)打印信息。
通過(guò)使用C標(biāo)準(zhǔn)庫(kù)函數(shù)對(duì)UART設(shè)備完成特定字符操作,這是對(duì)串口UART核的標(biāo)準(zhǔn)使用方法。如下面實(shí)例:
在本例中,SOPC Builder系統(tǒng)包含了一個(gè)名為uart1的UART核,該核不需要配置為stdout設(shè)備,程序中把UART設(shè)備作為HAL系統(tǒng)支持的文件類型打開(kāi)并使用標(biāo)準(zhǔn)的文件操作函數(shù)對(duì)UART核進(jìn)行讀寫。[2]
這種方法將串口作為一個(gè)設(shè)備調(diào)用,代碼相對(duì)簡(jiǎn)單,但運(yùn)行效率較低,適用實(shí)時(shí)性要求不高的場(chǎng)合。
NIOS II軟核的串口直接讀寫寄存器方式的編程方法,與C語(yǔ)言的標(biāo)準(zhǔn)輸入/輸出語(yǔ)句相比,可極大地縮短程序執(zhí)行時(shí)間,并使得CPU能同時(shí)處理其他事務(wù)。
頭文件“altera_avalon_uart_regs.h”中定義了UART寄存器映射。[3]如下為根據(jù)寄存器實(shí)現(xiàn)UART功能的驅(qū)動(dòng)程序uart.h文件的節(jié)選:
這段程序采用寄存器控制的方法實(shí)現(xiàn)了單個(gè)字節(jié)的發(fā)送。
這種方法采用寄存器直接控制串口,程序較為復(fù)雜,但執(zhí)行效率最高,時(shí)間最短。
在Nios IDE集成開(kāi)發(fā)環(huán)境中將程序進(jìn)行編譯和仿真后,可直接通過(guò)JTAG下載線進(jìn)行在線Debug調(diào)試,也可利用Flash燒寫工具Flash programer,通過(guò)JTAG下載接口,將*.pof文件和*.jdi文件燒寫到片外Flash中后,實(shí)現(xiàn)脫機(jī)工作。最后將系統(tǒng)與計(jì)算機(jī)RS232串口相連通過(guò)串口調(diào)試助手進(jìn)行通訊實(shí)驗(yàn)。
在NIOS II中調(diào)試“Hello world!”的范例的時(shí)候,經(jīng)常會(huì)出現(xiàn)這樣的錯(cuò)誤:nios2 terminal:can't open uart:Permission denied。這是因?yàn)樵谡{(diào)試程序時(shí),打開(kāi)了另外的串口調(diào)試工具,或者認(rèn)為是串口偵聽(tīng)器。實(shí)際上NIOS II中已經(jīng)集成了串口調(diào)試工具(串口偵聽(tīng)器)。
在任務(wù)管理器中nios2 terminal.exe就是這個(gè)偵聽(tīng)串口的進(jìn)程。所以,如果用NIOS II來(lái)觀察發(fā)送的數(shù)據(jù),就不要用其他的串口調(diào)試工具。如果在編譯之前就打開(kāi)了其他的串口偵聽(tīng)器,編譯鏈接的時(shí)候就會(huì)出現(xiàn)上述的錯(cuò)誤。而在程序編譯鏈接后再去打開(kāi)其他的串口偵聽(tīng)器,串口就會(huì)因?yàn)閚ios2 terminal.exe占用而無(wú)法打開(kāi)。
解決的方法,如果想用NIOS IDE觀察的話就不要事先打開(kāi)其他的串口調(diào)試工具。而如果想用其他的串口調(diào)試工具來(lái)觀察數(shù)據(jù),通過(guò)下載器將FPGA配置文件下載到板子后,刪除任務(wù)管理器中的nios2 terminal.exe,然后打開(kāi)串口調(diào)試工具。如果程序沒(méi)有問(wèn)題,運(yùn)行后就可以看到數(shù)據(jù)。[4]
[1]黃佳瑋,陳福深.基于NIOS II的SOPC嵌入式系統(tǒng)設(shè)計(jì)[J].電子元器件應(yīng)用,2009,(7):48-51.
[2]王剛,張瀲.基于FPGA的SOPC嵌入式系統(tǒng)設(shè)計(jì)與典型實(shí)例[M].北京:電子工業(yè)出版社,2009:255-265.
[3]唐佳,楊路明.FPGA通用數(shù)字信號(hào)處理實(shí)驗(yàn)板的設(shè)計(jì)與實(shí)現(xiàn)[J].科技創(chuàng)新導(dǎo)報(bào),2010,(18):29-30.
[4]李銳.基于嵌入式NIOS II軟核的串口直接讀寫寄存器方式編程[J].西安:現(xiàn)代電子技術(shù),2010,(14):37-39.
[5]楊英強(qiáng).一種基于FPGA的UART電路實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2005,(12):82-84.