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