?? chapter10.txt
字號:
本文是nios2文檔的第十章的翻譯稿,希望能對各位同仁有所幫助。
轉載時請標明出處。
譯者:姜黎
南京氣象大學2000級
QQ:44425312
UART的寄存器:
UART 通過Avalon總線和一組寄存器文件打交道。UART有6個16位的寄存器。
它們是control,status,rxdata,txdata,divisor,endofpacket。
UART的中斷:
當串口收到一個數據或者為發送一個字節準備好時,它就會產生一個高有效
的中斷信號。
UART的DMA操作:
UART支持流模式傳輸,因此它可以用來和存儲器進行DMA操作。
UART的接口:
由于大多數FPGA芯片不支持RS-232的數據接口,因此它需要在片外加一個電平
轉換芯片來完成電平轉換。邏輯'0'代表數據為1,邏輯'1'代表數據為0。
發送邏輯單元:
UART內部的發送邏輯由發送保持寄存器(holding register)和發送移位寄存器(shifting register)
組成。當主設備向發送寄存器(txdata)寫數據時,如果移位寄存器發送完上一個數據后,
就會把該數據載入。數據就會從最低位開始通過TXD引腳從位移寄存器一位一位移出。
由于有了保持寄存器和位移寄存器的雙緩沖,串口在把數據移出的同時又可以向保持寄存器
寫入新的數據。主端口還可以實時監控發送status寄存器,可以讀取發送準備好位(trdy),
發送位移寄存器空位(tmt),發送溢出位(toe)。
接收邏輯單元:
UART內部的接收邏輯由接收保持寄存器(holding register)和接收移位寄存器(shifting register)
組成。當移位寄存器接收完一個完整的數據后,主設備就可以讀取接收保持寄存器(txdata)的數據。
由于有了保持寄存器和位移寄存器的雙緩沖,串口在把數據移到保持寄存器的同時,又可以向接收
位移寄存器移入新的數據了。主端口還可以實時監控接收status寄存器,可以讀取接收準備好位(rrdy),
接收溢出位(roe),停止偵測位(brk),奇偶校驗位(pe),幀錯誤位(fe)。
波特率的產生:
波特率可以通過以下兩種方式產生:
1。在系統生成時設定固定的值。
2。設置16位的分配寄存器(divisor register)。
當波特率在系統生成時被設成固定值時,系統生成后是不能被改變的。相反,把波特率設成可變的話,
在系統生成后,可以通過軟件設定分配寄存器的值來改變波特率。
下面是波特率和分配因子的計算方法:
divisor = int( (clock frequency)/(baud rate) + 0.5 )
baud rate = (clock frequency)/(divisor + 1)
數據位數的設定:
數據的數據位、停止位、奇偶校驗位在系統生成時是可以配置的。一旦系統生成后,這些參數是不能被
改變的。
數據流(DMA)的控制方式:
UART可以支持流模式的Avalon傳送方式。這樣可以使得uart準備好接受下一個字符時主端口才會向它發送
數據,或者uart接收到數據時主端口才去讀它接收的數據。此時可以設置SOPC Builder來選擇給uart構造
end of packet寄存器。
在加入end of packet 寄存器后,uar就會在基地址+5的位置多了一個寄存器;在status寄存器中多一位
eop位;在control寄存器中多一位ieop位;在Avalon總線上多一個endofpacket信號用來和支持流模式數據
傳輸的主端口進行接口。如果沒有設定該寄存器,則不會加入上述資源。
End-of-packet(EOP)偵測可以決定UART和支持流模式傳輸的Avalon主端口在什么時候中止流模式數據傳輸。
EOP偵測可以和DMA控制器中一起使用,例如,可以實現將UART中接收到的數據自動寫入存儲器,直到接收到一個
特定的字符。這個中止字符的就是被寫入到endofpacket寄存器的值。
軟件編程模式:
HAL 系統庫支持
Altera公司為Nios II系統提供了設備驅動,該驅動將HAL層的字符型設備驅動集成到了HAL系統庫中。
HAL用戶可以通過熟悉的HAL API和ANSI C標準庫,而不是訪問UART的寄存器組。用戶可以使用ioctl()請求
來控制和uart硬件相關的操作。
(注:如果在程序中使用HAL設備驅動來訪問UART的話,此時直接對設備的寄存器進行訪問會干擾設備驅動
的正常運行。)
對于Nios II CPU用戶來說,HAL系統庫的API提供了完整的對UART的訪問函數。Nios II的程序把uart當
成一個字符型的設備,發送和接收數據都使用ANSI C標準庫函數。
下面的代碼示范了一個最簡單的應用,用printf()打印一段消息到stdout。在這個例子中HAL系統庫已經
配置了一個串口作為stdout。
----------------------------------------------------------------------------------------------
#include <stdio.h>
int main ()
{
printf("Hello world.\n");
return 0;
}
----------------------------------------------------------------------------------------------
下面的代碼示范了如何通過C標準庫從uart讀字符和向uart發送消息。在這個例子中程序把該設備當成
和HAL文件系統中任何其他的節點一樣來處理。
----------------------------------------------------------------------------------------------
/* A simple program that recognizes the characters 't' and 'v' */
#include <stdio.h>
#include <string.h>
int main ()
{
char* msg = "Detected the character 't'.\n";
FILE* fp;
char prompt = 0;
fp = fopen ("/dev/uart1", "r+"); //Open file for reading and writing
if (fp)
{
while (prompt != 'v')
{ // Loop until we receive a 'v'.
prompt = getc(fp); // Get a character from the UART.
if (prompt == 't')
{ // Print a message if character is 't'.
fwrite (msg, strlen (msg), 1, fp);
}
}
fprintf(fp, "Closing the UART file.\n");
fclose (fp);
}
return 0;
}
---------------------------------------------------------------------------------------------
驅動實現的兩種選擇:Fast vs. Small
根據不同系統的需要,uart驅動提供了兩種形式:快速模式和小模式。快速模式是默認模式。這兩種
模式都支持C標準庫函數和HAL API。
快速模式是一種中斷實現方式,這種方式可以使得CPU在UART未準備好收發數據時做其他的事情。
小模式是一種查詢方式,這種方式必須一直在等待uart準備好以后才能收發數據。使能小模式可以
通過兩種方式:1。設置HAL系統庫工程屬性,開啟small footprintf(這種方法也會影響其他設備驅動);
2。定義預處理宏 -DALTERA_AVALON_UART_SMALL ,使用這個選項不會影響到其他設備的驅動。
ioctl()操作:
uart驅動支持ioctl()函數,該函數允許程序基于HAL層的設備相關操作請求。
------------------------------------------------------------------------------------------
請求 含義
TIOCEXCL 鎖定設備避免被再次訪問。對該設備用open()函數再次訪問會失敗,直到這個
設備的文件描述符被關閉,或者用TIOCNXCL ioctl請求解鎖。在使用該請求時
"arg"參數可忽略。
TIOCNXCL 對前一次的訪問解鎖。在使用該請求時"arg"參數可忽略。
以下請求只對快速模式有效:
TIOCMGET 向termios結構填入內容,返回當前的設備配置情況。指向這個結構的指針
是作為ioctl的"opt"參數。
TIOCMSET 根據輸入termios結構的值來配置設備。指向這個結構的指針是作為ioctl的
"arg"參數。
-----------------------------------------------------------------------------------------
termios結構在Newlib C標準庫里被定義。在<Nios II kit path>/components/altera_hal/HAL
/inc/sys/termios.h文件中有它的定義。
軟件開發文件:
UART的核還配有以下軟件開發文件。這些文件定義了底層硬件的接口,并且提供了HAL驅動。
應用程序開發者不要去修改這些文件。
altera_avalon_uart_regs.h
該文件定義了寄存器映射,提供了符號名稱來訪問底層硬件。這些符號名稱只是被設備驅動函數所
使用。
altera_avalon_uart.h,altera_avalon_uart.c
該文件實現了uart HAL系統庫的設備驅動。
另外,UART還支持第一代Nios處理器遺留的SDK子程序。
UART的中斷行為:
UART會輸出一個IRQ信號到Avalon總線接口,它可以和任何主設備接口,例如,Nios II處理器。
主外設必須讀status寄存器來決定是哪種類型中斷。
每一種中斷會在status和interrupt-enable寄存器中有相應的位。當任意一種中斷條件滿足時,
相應的寄存器位就會被置位,直到完全響應中斷才會被清除。中斷信號輸出信號在任何status寄存器
的某一位被置位且那一位是被中斷使能的。而主外設通過清除status寄存器來相應這個IRQ。
在系統復位時,所有的中斷使能寄存器的位都被置為0,因此只有當主外設對中斷使能寄存器的
一位或多位置1時,才能產生IRQ信號。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -