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.

主站蜘蛛池模板: 91久久夜色精品国产网站| 日韩无码视频专区| 无码啪啪精品天堂浪潮av| 欧美精品在线视频观看| 毛片网站在线播放| 欧美人与牲动交a欧美精品 | 一区二区影院| 国产成人精品亚洲日本对白优播| 国产精品天干天干在线观看| 午夜老司机永久免费看片| 久久精品娱乐亚洲领先| 一区二区影院| 免费又爽又刺激高潮网址 | 欧美日韩高清| 狠狠色丁香婷婷| a天堂视频| 亚洲男人的天堂在线| 精品人妻AV区| 在线精品亚洲一区二区古装| 国产精品亚洲а∨天堂免下载| Aⅴ无码专区在线观看| 日本高清免费一本在线观看 | 在线播放精品一区二区啪视频 | 国产在线视频导航| 午夜精品国产自在| 欧美天堂久久| 伊人成人在线| 日本一本在线视频| 无码免费视频| 久久国产乱子| 久久久久人妻一区精品色奶水 | 国产剧情一区二区| 熟妇人妻无乱码中文字幕真矢织江 | 国产免费a级片| 精品国产Av电影无码久久久| 成人免费网站久久久| 国产在线观看人成激情视频| 中文成人在线视频| 91精品小视频| 亚洲国产欧美自拍| 全部免费毛片免费播放| 国产成人欧美| 国产成人AV综合久久| 性做久久久久久久免费看| 国产真实乱子伦视频播放| 国产在线精彩视频论坛| 国产日本一线在线观看免费| 色综合中文字幕| 亚洲中文字幕日产无码2021| 亚洲人在线| 亚洲国产91人成在线| 国产区91| 国产性生大片免费观看性欧美| 亚洲一级毛片在线观| 成人在线不卡| 免费av一区二区三区在线| 国产在线观看91精品亚瑟| 人妻无码AⅤ中文字| 国产精品区网红主播在线观看| 国产91色在线| 69av在线| 亚洲无码91视频| 一本大道视频精品人妻| 久久中文电影| 999精品视频在线| 午夜性刺激在线观看免费| 国产精品极品美女自在线网站| 欧美一级高清片久久99| 久久综合伊人77777| 91精品人妻互换| 欧美a级完整在线观看| 青青草国产免费国产| 欧美h在线观看| 九九热视频在线免费观看| 亚洲人成在线精品| 一级黄色片网| 国语少妇高潮| 不卡午夜视频| 国产小视频在线高清播放| 中日韩一区二区三区中文免费视频 | 性色一区| 久久一级电影|