999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于嵌入式Nios Ⅱ軟核的串口直接讀寫寄存器方式編程

2010-04-12 00:00:00
現代電子技術 2010年14期

摘 要:討論了Nios Ⅱ軟核的串口直接讀寫寄存器方式的編程方法,并給出了參考源代碼。它與C語言的標準輸入/輸出語句相比,可極大地縮短程序執行時間,并使得CPU能同時處理其他事務。根據此代碼編寫了應用測試程序,并進行了測試。測試結果顯示串口通信運行良好,較為穩定。

關鍵詞:Uart; Nios Ⅱ; SoPC; Register-access

中圖分類號:TN98; TP368.1 文獻標識碼:A

文章編號:1004-373X(2010)14-0037-03

Direct Register Access Serial Program Based on Embedded Nios II Soft Core

LI Rui

(College of Electronic Science Engineering, Nanjing University of Posts and Telecommunications, Nanjing 210003, China)

Abstract: The deriect-register access program of serial communication based on Nios II soft core is discussed. The reference source code is also presented. In comparison with the traditional standard C input and output program, the deriect-register access program can greatly reduce the excution time of the program and release CPU to process the other affair. According to the source code, the test code is programed and run in the hardware. The experiment result shows that the serial communication program runs well and stable.

Keywords: Uart; Nios II; SoPC; Register-access

0 引 言

Altera公司的FPGA作為全定制芯片的一個代表正在得到日益廣泛的應用。為了用戶使用方便,Altera公司推出嵌入式軟核Nios Ⅱ可以便利地使用工具生成并放入FPGA芯片中。Nios Ⅱ軟核可以在用戶的系統中處理一些諸如人機接口界面、內部時序邏輯控制、外部設備初始化等工作[1]。通用異步收發器(UART),是嵌入式系統上很常用的一個串行接口,由于其方便、簡單、易用等特性,在嵌入式系統中依然扮演著十分重要的角色。所以Altera才把UART作為一個連接Nios/NiosⅡ與其相關外設的IP放在SoPC Builder里面供用戶使用。Nios一代調試甚至直接用串口[2]。

Nios Ⅱ處理器是Intel公司為Altera公司推出的一個32位精簡指令處理器軟核[3]。在Altera公司推出的軟件SoPC中加載Nios Ⅱ軟核和相應的外圍接口以及與定義相應的自定義指令,然后對設計進行綜合,下載到FPGA中就可以方便地實現一個具有高速DSP功能的嵌入式處理器[4]。

NiosⅡ處理器的軟件開發是建立在ANSI C基礎上的。NiosⅡ IDE是NiosⅡ系列嵌入式處理器的主要軟件開發工具。用戶可以在NiosⅡ IDE中完成所有的軟件開發任務,如編輯、編譯、下載、調試和閃存編程。NiosⅡ嵌入式系統的一個重要問題就是軟件代碼量的大小,這關系到存放代碼的存儲器件容量大小,因此控制和減小程序代碼量是降低系統成本的重要方法,必須首先從處理器的啟動順序開始研究。

1 串口C語言方式編程

使用該方法要加上下面語句:

#include

并且要在System library Properties 的stdout/stdin 選擇你的串口。

int main ()

{

printf(\"Hello world.\\");

return 0;

}

執行上面程序可以得到串口輸出結果[5]。

如果不調用alt_main()函數,則系統默認運行步驟如下[6]:

(1) 調用alt_os_int()函數來執行任何操作系統所特有的初始化。如果HAL是在操作系統里運行的,那么初始化alt_fd_list_lock命令。它可以控制訪問HAL文件系統,初始化中斷控制器并執行中斷。

(2) 調用alt_sys_init()函數,以初始化系統里所有的驅動裝置和軟件組成部分。

(3) 重新設置C標準I/O通道(stdin,stdout,stderr),以使用合適的器件。

(4) 調用main()。

(5) 調用exit()。main()的返回代碼作為exit()的輸入。

該方式使用串口比較簡單,但是占用的存儲資源比較大,編譯時間也較長。

圖1 C標準輸入/輸出方式串口配置

2 串口直接讀寫寄存器方式編程

2.1 串口初始化

Nios Ⅱ的串口編程有多種方式,比較多的是采用標準C語言寫法,占用程序空間比較大。NiosⅡ處理器的啟動可采用2種方式:自動初始化和用戶自定義初始化。ANSI C標準定義應用程序可以通過調用main()來開始執行。在調用main()之前,應用程序假定運行環境和所有的服務系統都被初始化并準備運行。初始化可以被硬件抽象層(HAL)系統庫自動執行。程序員不需要考慮系統的輸出設備以及如何初始化每一個外設,HAL會自動初始化整個系統[7]。

另外,ANSI C標準也提供了一個可變的入口點程序,以避免自動初始化。ANSI C標準還定義程序員能手動初始化任何所用的硬件。alt_main()函數提供了一個獨立式的編程環境,能夠完全控制系統的初始化。獨立式編程環境可以使程序員手動編寫初始化系統的代碼[8]。

HAL提供的系統初始化代碼按以下啟動順序運行[9]:

(1) 啟動指令和數據高速緩沖存儲器;

(2) 配置堆棧;

(3) 配置全局指針;

(4) 通過鏈接器提供的_bss_start和_bss_end來零初始化BSS層,_bss_start和_bss_end是開始和結束BSS的命令;

(5) 如果當前系統沒有啟動下載器,就復制.rwdata,.rodata或者剩下的部分到RAM;

(6) 調用alt_main()。

在NiosⅡ IDE工程中,只需簡單定義alt_main()就可以實現用戶的啟動順序,而且能夠選擇HAL的服務程序。如果應用程序需要一個alt_main()入口點程序,可以復制默認的執行作為開始點,根據要求來定制它。

int main (void) __attribute__ ((weak, alias (\"alt_main\")));

alt_main()函數可以是整數型,其原型是:int alt_main(){}。

使用獨立式編程環境會增加NiosⅡ程序編寫的復雜性。獨立式編程環境的主要作用在于減小代碼量,但要使用這種方法,需要對NiosⅡ處理器的外設和驅動編寫都非常熟悉才行。在NiosⅡ IDE中也可以通過某些選項來減小HAL系統庫容量,從而達到減小代碼量的目的,比使用獨立式編程環境容易得多[10]。

串口部分程序初始化代碼如下:

//串口中斷初始化

void Uart_init()

{

void * status_ptr;

IOWR_ALTERA_AVALON_UART_CONTROL(UART_BASE, 0x80); //接收中斷使能

IOWR_ALTERA_AVALON_UART_STATUS(UART_BASE, 0x0); //清狀態標志

IOWR_ALTERA_AVALON_UART_RXDATA(UART_BASE, 0x0); //清接收寄存器

alt_irq_register(UART_IRQ,status_ptr,Haddle_Uart_ISR); //中斷注冊

}

2.2 串口收發通信程序

串口的收發可采用查詢和中斷方式,中斷方式要更好一些。

查詢方式發送子程序代碼如下:

extern unsigned char leddata[8]; //UART發送1 B子程序

void Uart_send(unsigned char data)

{

alt_u16 status;

status=IORD_ALTERA_AVALON_UART_STATUS(UART_BASE);

while(!(status0x0040)) //等待發送完成

status=IORD_ALTERA_AVALON_UART_STATUS(UART_BASE);

IOWR_ALTERA_AVALON_UART_TXDATA(UART_BASE,data);

}

//UART發送多個字節子程序

void Uart_send_n(unsigned char *ptr,unsigned char n)

{

for(;n>0;n--)

{

Uart_send(*ptr);

ptr++;

}

}

查詢方式接收子程序代碼如下:

int Uart_receive(void)

{

alt_u16 status;

int temp;

status=IORD_ALTERA_AVALON_UART_STATUS(UART_BASE);

while(!(status0x0080)) //等待發送完成

status=IORD_ALTERA_AVALON_UART_STATUS(UART_BASE);

temp=IORD_ALTERA_AVALON_UART_RXDATA(UART_BASE);

return temp;

}

因為串口的中斷號是惟一的,所以中斷方式接收發送只能在一個中斷函數內。中斷方式接收發送子程序代碼如下:

void Haddle_Uart_ISR(void * context,alt_u32 id)

{

unsigned char temp;

if((IORD_ALTERA_AVALON_UART_STATUS(UART_BASE)(0x80))==0x80)

{temp=IORD_ALTERA_AVALON_UART_RXDATA(UART_BASE);

leddata[5]=temp;

}

if((IORD_ALTERA_AVALON_UART_STATUS(UART_BASE)(0x40))==0x40)

{IOWR_ALTERA_AVALON_UART_TXDATA(UART_BASE, send_buffer[indexsc++]);

}

}

該中斷處理程序可進行中斷方式接收發送,如果程序需要進行精確的接收發送,還需加上中斷程序和主程序的相互控制變量。

2.3 串口通信調試

在Nios中調試“Hello world!”范例的時候往往會出現這樣的錯誤:nios2-terminal: can't open uart: Permission denied。這是因為在調試程序時,打開了另外的串口調試工具,或者可以說是串口偵聽器。但實際上NIOS IDE中已經集成了串口調試工具,或者串口偵聽器。在任務管理器中nios2-terminal.exe就是這個偵聽串口的進程。

所以,如果用NIOS IDE來觀察發送的數據,就不要用其他的串口調試工具,如果在編譯之前就打開了其他的串口偵聽器,編譯鏈接的時候就會出現上述的錯誤。而在程序編譯鏈接后再去打開其他的串口偵聽器,串口就會因為nios2-terminal.exe占用而無法打開。解決的方法,如果想用NIOS IDE觀察的話就不要事先打開其他的串口調試工具。而如果想用其他的串口調試工具來觀察數據,通過USB_BLASTER將數據下載到板子后,刪除任務管理器中的nios2-terminal.exe,然后打開串口調試工具。如果程序沒有問題,運行后就可以看到數據。

3 結果與討論

為證明以上程序的可運用性,特別制作了電路來驗證,芯片使用EP3C40,PC端使用串口調試助手,波特率為19 200 b/s,8位數據位,1位停止位,無校驗位。實驗結果如圖2所示。

圖2 串口調試的數據

經實驗證明,該方法簡單可靠,可以生成比較小的代碼。

4 結 語

本文討論了嵌入式軟核Nios Ⅱ中串口模塊的編程方法,給出了串口模塊編程的示例代碼,經實際運用,效果良好,具有一定的參考意義。

參考文獻

[1]崔曉松,胡建萍,王春寒.基于NiosⅡ的串口通信在解算芯片中的應用[J].杭州電子科技大學學報,2007,27(2):5-8.

[2]彭澄廉.挑戰SoC:基于NIOS的SoPC設計與實踐[M].北京:清華大學出版社,2004.

[3]吳繼華,王誠.Altera FPGA/CPLD設計(高級篇)[M].北京:人民郵電出版社,2005.

[4]李化,王永麗.NIOS系統與計算機串口通信的實現[J].西南民族大學學報:自然科學版,2008,34(8):864-867.

[5]ALTERA Corporation. Quartus II version 6.0 handbook[DB/OL].[ 2006-09-20.] .http://WWW.altera.com/literature/lit-qts.jsp.

[6]ALTERA Corporation. Nios Ⅱ processor reference handbook[DB/OL].[ 2006-09-20] .http://WWW.altera.com/literature/lit-nios2.jsp.

[7]范啟富,張文鋒,溫超.基于FPGA的多功能多路舵機控制器的實現[J].控制工程, 2008,15(11):696-698.

[8]李肇,韓濤.串行端口技術[M].北京:國防工業出版社,2004.

[9]潘松,黃繼業.SoPC技術實用教程[M].北京:清華大學出版社,2005.

[10]劉紀斌,羅忠省.脈沖調制器遠程控制系統設計[J].微計算機信息,2009,25(9):50-51.

主站蜘蛛池模板: 一级不卡毛片| 国产亚洲欧美在线中文bt天堂| 亚洲视频在线青青| 国产91熟女高潮一区二区| 欧类av怡春院| 97精品伊人久久大香线蕉| 91年精品国产福利线观看久久| 精品综合久久久久久97| 欧美日韩国产系列在线观看| 成人永久免费A∨一级在线播放| 国产在线八区| 精品综合久久久久久97| 国产成人亚洲欧美激情| 一区二区三区成人| 亚洲制服丝袜第一页| 日本精品αv中文字幕| 天堂成人在线| 国产毛片高清一级国语| 欧美精品1区2区| 国产精品亚洲精品爽爽| 有专无码视频| 秋霞国产在线| 亚洲综合第一区| 最新午夜男女福利片视频| 波多野结衣一区二区三区四区| 中文字幕人成乱码熟女免费| 欧美日韩精品一区二区视频| 国产噜噜噜| 无码福利视频| 狠狠ⅴ日韩v欧美v天堂| jizz在线免费播放| 婷婷午夜影院| 国产午夜无码片在线观看网站| 亚洲免费成人网| 亚洲日本韩在线观看| 国内精品久久人妻无码大片高| 久久99国产乱子伦精品免| 免费无码又爽又黄又刺激网站 | 免费在线一区| 午夜小视频在线| 国产成人亚洲毛片| 亚洲视频三级| 亚洲精品无码日韩国产不卡| 老司机精品久久| 黄色网址免费在线| 亚洲成人黄色网址| 毛片一区二区在线看| 91精品视频播放| 亚洲综合九九| 国产91特黄特色A级毛片| av一区二区三区高清久久| 另类综合视频| 在线中文字幕网| 伊人网址在线| 久久久久国色AV免费观看性色| 日本在线欧美在线| 国产农村1级毛片| 美女国内精品自产拍在线播放 | 日本国产一区在线观看| 国产黄在线观看| 香蕉99国内自产自拍视频| 538国产视频| 亚洲性影院| 亚洲国产精品不卡在线| 91久久偷偷做嫩草影院精品| 午夜爽爽视频| 91精品啪在线观看国产91九色| 五月天天天色| 亚洲一级毛片| 在线色国产| 99成人在线观看| 国产精品香蕉| 亚洲第一视频网| 国产成人久久777777| 久久黄色影院| 999精品视频在线| 欧美日本在线观看| 福利在线免费视频| 男女男免费视频网站国产| 国产超碰一区二区三区| 91福利在线观看视频| 午夜性爽视频男人的天堂|