第一篇:嵌入式系統(tǒng)ARM實驗報告
南京郵電大學通信與信息工程學院
實驗報告
實驗名稱:實驗一基于ADS開發(fā)環(huán)境的設計
實驗二嵌入式Linux交叉開發(fā)環(huán)境的建立 實驗三嵌入式Linux環(huán)境下的程序設計
課程名稱嵌入式系統(tǒng)B
班級學號B13010711 姓名馬俊民
開課時間 2015/2016學年第1學期
實驗一基于ADS開發(fā)環(huán)境的程序設計
一、實驗目的
1、學習ADS開發(fā)環(huán)境的使用;
2、學習和掌握ADS環(huán)境下的匯編語言及C語言程序設計;
3、學習和掌握匯編語言及C語言的混合編程方法。
二、實驗內容
1、編寫和調試匯編語言程序;
2、編寫和調試C語言程序;
3、編寫和調試匯編語言及C語言的混合程序;
4、編寫程序測試多寄存器傳送指令的用法。
三、實驗原理
ADS全稱為ARM Developer Suite,是ARM公司推出的新一代ARM集成開發(fā)工具。現(xiàn)在常用的ADS版本是ADS1.2,它取代了早期的ADS1.1和ADS1.0。
ADS用于無操作系統(tǒng)的ARM系統(tǒng)開發(fā),是對裸機(可理解成一個高級單片機)的開發(fā)。ADS具有極佳的測試環(huán)境和良好的偵錯功能,它可使硬件開發(fā)工作者更深入地從底層去理解ARM處理器的工作原理和操作方法,為日后自行設計打基礎,為BootLoader的編寫和調試打基礎。
1.ADS軟件的組成
ADS由命令行開發(fā)工具、ARM運行時庫、GUI開發(fā)環(huán)境(CodeWarrior和AXD)、實用程序、支持軟件等組成。
2.GUI開發(fā)環(huán)境
ADS GUI開發(fā)環(huán)境包含CodeWarrior和AXD兩種,其中Code Warrior是集成開發(fā)工具,而AXD是調試工具。
使用匯編語言進行編程簡單、方便,適用于初始化硬件代碼、啟動代碼等。匯編語言具有一些相同的基本特征:
1.一條指令一行。
2.使用標號(label)給內存單元提供名稱,從第一列開始書寫。3.指令必須從第二列或能區(qū)分標號的地方開始書寫。4.注釋必須跟在指定的注釋字符后面,一直書寫到行尾。
在ARM匯編程序中,每個段必須以AREA作為段的開始,以碰到下一個AREA作為該段的結束,段名必須唯一。程序的開始和結束需以ENTRY和END來標識。嵌入式C語言設計是利用基本的C語言知識,面向嵌入式工程實際應用進行程序設計。為了使單獨編譯的C語言程序和匯編程序之間能夠相互調用,必須為子程序之間的調用規(guī)定一定的規(guī)則。ATPCS就是ARM程序和Thumb程序中子程序調用的基本規(guī)則。
四、實驗過程與關鍵代碼分析
1.創(chuàng)建項目工程
在File菜單中選擇New命令,打開一個新建工程對話框。在Project選項卡下,選擇ARM Executable Image, 然后在Project name文本框里輸入項目名稱,點擊確定。彈出工程窗口。
選擇File菜單中的New命令,選擇File標簽頁,在File name文本框中輸入要創(chuàng)建的文件名。匯編程序以.s結尾,c程序以.c結尾。在Location文本框中指定文件的存放位置,選中Add to Project,在Targets中選中DebugRel,單擊確定關閉窗口。
2.用匯編語言設計程序實現(xiàn)10的階乘
AREA EXAMPLE, CODE, READONLY ENTRY start MOV R0, #10 MOV R1, #1 LOOP MUL R0, R0, R1 SUB R0, R0, 1 CMP R0, #1 BHI LOOP END 在這個程序中,我們首先對R0和R1賦值,將R0作為一個變量,而R1作為一個存貯階乘值的寄存器。在每進行一次乘法之后,將R0減1。同時在做完減法后進行判斷,如果此時R0大于1,則返回繼續(xù)乘法,否則結束程序,輸出結果。
3.用調用子程序的方法實現(xiàn)1!+2!+3!+?+10!,代碼如下: asmp.s
AREA JC, CODE, READONLY
EXPORT JCP
ENTRY JCP
ADD R3, R0, #1
MOV R2, #1
MOV R1, #1 LOOP MUL R0, R1, R2
MOV R1, R0
ADD R2, R2, #1
CMP R2, R3
BNE LOOP
NOP
NOP
MOV PC, LR
END
PROGC.c #include
int main(){ int res=0;int m=10;int i;for(i=1;i<=m;i++)
res=res+JCP(i);printf(“The result =%dn”,res);return 0;} 在這個程序中,主程序由c語言完成作求和,子程序由匯編語言寫成作階乘。
5.實現(xiàn)字符串的逆序復制TEXT1=“HELLO”=>TEXT2=“OLLEH”
AREA invstring, CODE, READONLY start
ADR R1,TEXT1
ADR R2,TEXT2
MOV R3, #0 LOOP
LDRB R0,[R1], #1
ADD R3,R3,#1
CMP R0,#0
BNE LOOP
SUB R1,R1,#2
LOOP1
LDRB R0,[R1], #-1
STRB R0,[R2], #1
SUB R3,R3, #1
CMP R3,#1
BNE LOOP1
MOV R5,#&55
TEXT1
TEXT2 NOP =“HELLO”,0 ALIGN =“OELLH” END
五、實驗小結
在這次實驗中,學會了如何使用匯編程序進行編程。對匯編程序編程一些基本的要求有了一定的了解,學習了C語言的語法和在其中調用匯編程序的方法。學會了利用CodeWarrior IDE開發(fā)C和ARM匯編代碼。學會了在AXD中進行代碼調試的方法和過程,對AXD的調試有初步的了解。,實驗二嵌入式Linux交叉開發(fā)環(huán)境的建立
一、實驗目的
1、掌握嵌入式Linux交叉開發(fā)環(huán)境的建立方法
2、學習和掌握Linux常用命令
3、學習和掌握vi編輯器的使用
二、實驗內容
1、搭建嵌入式Linux交叉開發(fā)環(huán)境
2、熟悉Linux的常用命令
3、熟悉vi編輯器的常用命令
三、實驗原理
Linux系統(tǒng)是UNIX系統(tǒng)的分支,是UNIX的微機版。Linux具有異常豐富的驅動程序資源,支持各種主流的硬件設備與技術。Linux包含了現(xiàn)代的UNIX操作系統(tǒng)的所有功能特性,這些功能包括多任務、虛擬內存、虛擬文件系統(tǒng)、進程間通信、對稱所處理器、多用戶支持等。
Vi編輯器是所有UNIX和Linux下的標準編輯器。它包含3種工作模式。嵌入式系統(tǒng)是專用的計算機系統(tǒng),它對系統(tǒng)的功能、可靠性、成本、體積、功耗等有嚴格的要求。大部分嵌入式系統(tǒng)沒有大容量存儲設備,一般不能安裝大型開發(fā)軟件,系統(tǒng)的開發(fā)需要采用交叉開發(fā)模式。
四、實驗過程與關鍵代碼分析
實驗用的是UP-NetARM2410-S試驗箱,里面配有三星的芯片S3c2410X。打開電腦上VMWare軟件,在Windows系統(tǒng)下啟動虛擬機里的Linux系統(tǒng)。接著需要
1.宿主機的環(huán)境搭建
下載并運行VMWare,根據向導創(chuàng)建一臺新虛擬機并選擇Linux作為客戶操作系統(tǒng),再根據向導安裝RedHat Linux 9.0。
2.虛擬機中啟動Linux操作系統(tǒng)
使用root登陸,用戶名為root,密碼為123456。之后對共享文件設置進行調整:打開settings界面,打開shared folders功能,同時將路徑設置到有課前下載的軟件的目錄下。
3.開發(fā)工具軟件的安裝(1)安裝gcc 打開Linux后,打開終端窗口,在共享的目錄下找到install.sh并運行,命令如下: ls./ install.sh 安裝程序將自動建立/arm2410s目錄,并將所有的開發(fā)軟件包安裝到/arm2410s 目錄下,同時自動配置編譯環(huán)境,建立合適的符號鏈接。安裝完成后在目錄/opt/host/armv4l/bin/下應該能看到主編譯器。(2)配置PATH路徑
vi.bash.profile 將里面PATH變量改為PATH=$PATH:$HOME/bin:/opt/host/armv41/bin/;存盤后執(zhí)行
source.bash_profile 以后armv4l-unknown-linux-gcc將被自動搜索到
4.宿主機上的開發(fā)環(huán)境配置(1)配置IP地址
ifconfig eth0 192.168.0.121 命令配置了宿主機的IP地址。然后打開網絡配置窗口,重新探測MAC地址。重新激活。(2)關閉防火墻
單擊“Red”菜單→“系統(tǒng)設置”→“安全級別”→打開“安全級別配置”窗口,選擇“無防火墻選項。”(3)配置NFS。
單擊“Red”菜單→“系統(tǒng)設置”→“服務器設置”→“服務”,在“服務配置”窗口中勾選nfs,單擊“開始”(4)NFS設置
單擊“Red”菜單→“系統(tǒng)設置”→“服務器設置”→“NFS服務器”,打開“NFS服務器配置”窗口,設置NFS共享。
然后在NFS服務器中增加主機IP地址的鏈接許可和目錄。完成配置。
5.目標機的信息輸出
Windows系統(tǒng)下,“開始”→“所有程序”→“附件”→“通訊”→“超級終端”,新建一個通信終端。區(qū)號、電話號碼隨意輸入。設置每秒位數為“115200”,數據位為“8”,無奇偶校驗,停止位為“1”,無數據流控制。單擊“確定”。
6.程序的運行
打開超級終端,啟動Linux,屏幕顯示:
[/mnt/yaffs] 在超級終端上執(zhí)行掛載命令:
[/mnt] mount –t nfs 192.168.0.121:/arm2410s /mnt/nfs 掛載成功后可執(zhí)行程序。
五、實驗小結
在這次實驗中,學會建立Linux交叉開發(fā)環(huán)境,學會了ls和vi,cd等常用的Linux命令,并掌握了Vi編輯器的使用方法。同時知道了如何在搭建失敗時尋找錯誤進行排錯。
實驗三嵌入式Linux環(huán)境下的程序設計
一、實驗目的
1、掌握嵌入式Linux環(huán)境下的程序設計方法
2、學會編寫Makefile文件
二、實驗內容
1、熟悉嵌入式教學實驗箱的使用
2、編寫C程序和Makefile文件
3、編譯程序產生可執(zhí)行程序
4、完成主機的掛載和程序的執(zhí)行
三、實驗原理
在嵌入式Linux環(huán)境下的程序設計方法有一下幾個步驟:
1.編寫源程序
2.編寫Makefile文件 3.編譯程序
4.運行和調試程序
5.將生產的可執(zhí)行文件加入文件系統(tǒng)。
前三個步驟在宿主機上完成,后面的步驟在目標機上完成。
四、實驗過程與關鍵代碼分析
1.建立工作目錄
mkdir hello cd hello
2.編寫源程序
用vi編輯器編輯Hello.c文件
vi Hello.c 在Vi中輸入源程序如下:
#include
printf(“hello world n”);}
3.編寫Makefile文件
vi Makefile 在vi中編輯Makefile文件如下:
CC= armv4l-unknown-linux-gcc EXEC = hello OBJS = hello.o CFLAGS += LDFLAGS+=-static all: $(EXEC)$(EXEC):(OBJS)$(CC)$(LDFLAGS)–o $@ $(OBJS)clean:
-rm –f $(EXEC)*.elf *.gdb *.o
4.編譯程序
在hello目錄下運行“make”來編譯程序。
make clean
make 編譯成功后,生成可執(zhí)行文件Hello.o。
5.下載調試
在宿主機上啟動nfs服務,并將/arms2410s設置為共享目錄。接下來啟動超級終端,建立通訊,掛載。
[/mnt] mount –t nfs 192.168.0.121:/arm2410s /mnt/nfs 掛載成功后,進入/mnt/nfs,再進入/mnt/nfs/hello,直接運行剛剛編譯生成的可執(zhí)行文件Hello.o,查看運行結果
cd hello./hello 可以看見“Hello world”
只需要掛載一次便可,只要實驗箱沒有重啟,就可以一直保持連接。反復修改、編譯、調試,直至程序調試通過。
6.可執(zhí)行文件加入文件系統(tǒng)
程序調試通過后,可以把可執(zhí)行文件拖放到usr/bin目錄下,然后使用mkcramfs制作工具生成新的文件系統(tǒng)。當系統(tǒng)啟動后,就可以在相應目錄下執(zhí)行可執(zhí)行程序hello.五、實驗小結 在這次實驗中,學會了在嵌入式Linux環(huán)境下設計程序。同時知道了如何對目標機進行掛載。以及如何在發(fā)現(xiàn)掛載不成功尋找錯誤進行修改。另外在編譯文件時需要注意的也都有所了解。
實驗四多線程程序設計
一、實驗目的1、2、二、實驗內容1、2、3、4、三、實驗原理
四、實驗過程與關鍵代碼分析
五、實驗小結
3+
第二篇:ARM與嵌入式實驗報告
ARM與嵌入式技術
實驗報告
專業(yè)班級:通信工程
姓名:**** 學號:******
實驗日期:2012年6月7日 指導老師:*****
一、實驗目的
1.學習使用Embest IDE開發(fā)環(huán)境及ARM 軟件模擬器;
2.掌握簡單ARM 匯編指令,進一步加強對嵌入式的熟悉和了解。
二、實驗設備
硬件:PC 機
軟件:Embest IDE 開發(fā)環(huán)境
三、實驗內容
例3:實現(xiàn)64位加法運算,要求【R1:R0】+【R3:R2】,結果放回【R1:R0】中; 例2:編寫程序將R2的高8位傳送到R3的低8位(不考慮R3的其它位); 例7:編寫一段程序計算10!;
例8:串拷貝(R1指向源數據串的首地址,R0指向目的數據串的首地址)。
四、實驗步驟
1)新建工程:
運行Embest IDE 集成開發(fā)環(huán)境,選擇菜單項File → New Workspace,如圖一,系統(tǒng)彈出一個對話框,鍵入文件名“沈”,如圖二,點擊OK 按鈕。將創(chuàng)建一個新工程,并同時創(chuàng)建一個與工程名相同的工作區(qū)。此時在工作區(qū)窗口將打開該工作區(qū)和工程.。
2)建立源文件:
點擊菜單項File → New,如圖三,系統(tǒng)彈出一個新的文本編輯窗,輸入源文件代碼。編輯完后,保存文件“沈.s”后綴,如圖四。
3)添加源文件:
選擇菜單項Project → Add To Project → Files,在工程目錄下選擇剛才建立的源文件.s后綴文件,如圖五,圖六。
4)基本配置:
選擇菜單項Project → Settings,彈出工程設置對話框。在工程設置對話框中。① 選擇Processor 設置對話框,按照圖七所示,進行配置:
圖七
② 選擇Remote設置對話框,按照下圖八所示,進行配置:
圖八 ③ 選擇最右邊一個進行編譯,顯示如圖九,則編譯成功。
圖九
④ 選擇Project → Settings → Debug設置對話框,按照圖十所示,進行配置:
圖十 ⑤
選擇
5)選擇菜單項Debug →Remote Connect 進行連接軟件仿真器,將存儲器地址改為0x1000,如圖十一,執(zhí)行Debug →Download 命令下載程序,并打開寄存器窗口。打開memory 窗口,按F10進行單步跟蹤,觀察寄存器的數據變化并分析。最右邊一個進行編譯,顯示如圖九,則編譯成功。
圖十一
五、各實驗的參考程序及運行結果
實驗一:(例3)實現(xiàn)64位加法運算,要求【R1:R0】+【R3:R2】,結果放回【R1:R0】中; 1.程序代碼如下:
.global _start
.text _start:
mov R0,#11
/*R0=11*/ mov R1,#22
/*R1=22*/ mov R2,#33
/*R2=33*/ mov R3,#44
/*R3=44*/ ADDS R0,R0,R2
/*R0等于低32位相加,并影響標志位*/
ADC R1,R1,R3
/*R1等于高32位相加,并加上低位進位*/ stop:
b stop.end
2.分析調試:
①download下載:
② 讀入數據:
③ r0+r2→r0(低32位):
④ r1+r3→r1(帶進位的加法):
實驗二:(例2)編寫程序將R2高8位傳送到R3的低8位(不考慮R3的其它位);
1.程序代碼如下:
.global _start _start: ldr r2,=0x23453401 ldr r3,=0xabcd1200 and r2,r2,#0xff000000 /*保留R2的高8位,屏蔽低24位*/ and r3,r3,#0xffffff00 /*保留R3的高24位,屏蔽低8位*/
orr r3,r3,r2,lsr #24
/*將R2的高8位傳送到R3的低8位*/ stop:
b stop.end
2.分析調試:
①download下載:
②保留r2的高8位,屏蔽低24位:
③保留r3的高24位,屏蔽低8位:
④將R2的高8位傳送到R3的低8位:
實驗三:(例7)編寫一段程序計算10!
1.程序代碼如下:
.global _start.text.equ num,10 _start: mov r0,#num mov r1,r0 s1: subs r1,r1,#1
/*把r1-1放入r1*/ mul r0,r1,r0
/*r0*r1放入r0*/ cmp r1,#1
/*比較R1與1的大小*/ beq stop
bne s1 stop: b stop.end
2.分析調試:
① download下載:
② 第一次執(zhí)行S1,r1=10-1=9,10*9=90,換成16進制是5a。
③ 第二次執(zhí)行S1,r1=9-1=8,10*9*8=720,換成16進制是2d0。
④ 依次執(zhí)行S1,到r1=1,停止,10*9*8??*1=3628800,換成16進制是375f00。
實驗四:(例8)串拷貝(R1指向源數據串首地址,R0指向目的數據串的首地址)。1.程序代碼如下:.global _start.text.EQU NUM,8 _start:
LDR R0,=srcstr
/*指向源數據串R0*/
LDR R1,=dststr
/*指向目標數據串R1*/
mov R3,#NUM
/*R3=8*/
mov LR,PC
/*返回*/
B strcopy
/*調用串拷貝子程序*/ stop: b stop
strcopy:
LDRB R2,[R0],#1
/*裝載字節(jié)同時更新地址*/
STRB R2,[R1],#1
/*存儲字節(jié)同時更新地址*/
SUBS R3,R3,#1
CMP R3,#0
/*判斷是否結束*/
BNE strcopy
/*不是,則繼續(xù)*/
MOV PC,LR
/*返回*/.data
srcstr:.long 1,2,3,4,5,6,7,0
/*定義源數據串*/
dststr:.long 5,3,2,1,4,6,8,0
/*定義目的字符串*/
2.分析調試:
①單步跟蹤后的結果及存儲器的結果顯示:
②寄存器的結果顯示:
六、實驗心得
今天在實驗室里,學習使用Embest IDE開發(fā)環(huán)境及ARM 軟件模擬器,掌握簡單ARM 匯編指令,進一步加強了對嵌入式的熟悉和了解。鄭老師在兢兢業(yè)業(yè)的向我們傳授實踐知識的同時也向我們提問相關理論問題,讓我們在學習的過程加深對實踐和理論兩者之間的聯(lián)系,知道每一個步驟的發(fā)生的原因及產生相應的結果,即對實驗的來龍去脈有了更清楚的認識,為今后的學習打下了一定的基礎。相信在接下來的實驗中,我們會在鄭老師的引導下,做起實驗來更能得心應手,輕車熟駕!
第三篇:嵌入式系統(tǒng)實驗報告
嵌入式系統(tǒng)實驗報告
學
號:
姓
名:
班
級:13電子信息工程
指導老師:
蘇州大學 電子信息學院
2016年12月
實驗一:一個燈的閃爍
1、實驗要求
實現(xiàn)PF6-10端口所連接的任意一個LED燈點亮
2、電路原理圖
圖1 LED燈硬件連接圖
3、軟件分析
RCC_Configuration();/* 配置系統(tǒng)時鐘 */
GPIO_Configuration();
/* 配置GPIO IO口初始化 */
for(;;)
{
GPIOF->ODR = 0xfcff;
/* PF8=0--> 點亮D3 */
Delay(1000000);
GPIOF->ODR = 0xffff;
/* PF8=1--> 熄滅D3 */
Delay(1000000);
4、實驗現(xiàn)象
通過對GPIOF8的操作,可以使LED3閃爍
5、實驗總結
這是第一次使用STM32開發(fā)板,主要內容是對IO端口進行配置,點亮與IO端口相連接的LED燈,閃爍周期為2S。通過本實驗對STM32開發(fā)板的硬件原理有了初步了解。
實驗二:流水燈
1、實驗要求
實現(xiàn)PF6-10端口所連接的5個LED燈順次亮滅
2、電路原理圖
圖1 流水燈硬件連接圖
3、軟件分析
int main(void){
RCC_Configuration();/* 配置系統(tǒng)時鐘 */
GPIO_Configuration();/* 配置GPIO IO口初始化 */
for(;;)
{
GPIOF->ODR = 0xffbf;
/* PF6=0--> 點亮LED1 */ Delay(5000000);GPIOF->ODR = 0xff7f;
}
/* PF7=0--> 點亮LED2 */ Delay(5000000);
GPIOF->ODR = 0xfeff;
/* PF8=0--> 點亮LED3 */ Delay(5000000);
GPIOF->ODR = 0xfdff;
/* PF9=0--> 點亮LED4 */ Delay(5000000);
GPIOF->ODR = 0xfbff;
/* PF10=0--> 點亮LED5 */ }
4、實驗現(xiàn)象
LED1~LED5依次點亮,亮滅的時間間隔都為1S。
5、實驗總結
本次實驗對STM32開發(fā)板的GPIO端口進行進一步學習,通過程序可以實現(xiàn)流水燈的閃爍。
實驗三:單級外部中斷
1、實驗要求
按下某個按鍵,觸發(fā)中斷,中斷服務程序改變LED燈狀態(tài)
2、電路原理圖
圖3 SW1硬件原理圖
3、軟件分析
int main()
{
RCC_Configuration();
GPIO_Configuration();
GPIO_Write(GPIOF,0xffff);Delay(5000);
while(1)
{
}
/* 配置系統(tǒng)時鐘 */
/* IO口初始化 */
/* 全滅 */
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8)==0)/* 如果SW1 PA8=0 */ {
GPIO_SetBits(GPIOF, GPIO_Pin_6);
/* LED1點亮 */
Delay(0x1FFFFF);
GPIO_ResetBits(GPIOF, GPIO_Pin_6);
/* LED1 熄滅 */ Delay(0x1FFFFF);} }
4、實驗現(xiàn)象
原來5個LED燈都處于熄滅狀態(tài),按下SW1,觸發(fā)中斷程序,LED1點亮。
5、實驗總結
通過本次實驗,可以對某一狀態(tài)通過外部中斷,改變其當前狀態(tài)。
實驗四:多中斷嵌套
1、實驗要求
按下某個按鍵,觸發(fā)中斷,中斷服務程序改變LED燈狀態(tài)
2、電路原理圖
圖4 SW1,SW2,SW3硬件原理圖
3、軟件分析
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
//設定中斷源為PA0 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//中斷占優(yōu)先級為0 NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQChannel;
//設定中斷源為PD3 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//中斷占優(yōu)先級為1 NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;//設定中斷源為PA8 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//中斷占優(yōu)先級為2 void EXTI0_IRQHandler(void){ int i=0;if(EXTI_GetITStatus(EXTI_Line0)!= RESET){ for(i=0;i<10;i++){
GPIO_Write(GPIOF,0xffff);
GPIO_SetBits(GPIOF, GPIO_Pin_6);/* LED1 點亮 */ Delay(0x5fFFFF);GPIO_ResetBits(GPIOF, GPIO_Pin_6);/* LED1 熄滅 */
Delay(0x5fFFFF);EXTI_ClearITPendingBit(EXTI_Line0);} } }
void EXTI3_IRQHandler(void)if(EXTI_GetITStatus(EXTI_Line3)!= RESET){ {
int i=0;for(i=0;i<10;i++){
GPIO_Write(GPIOF,0xffff);
GPIO_SetBits(GPIOF, GPIO_Pin_7);/* LED2 點亮 */ Delay(0x5fFFFF);GPIO_ResetBits(GPIOF, GPIO_Pin_7);/* LED2 熄滅 */ Delay(0x5fFFFF);EXTI_ClearITPendingBit(EXTI_Line3);} } } void EXTI9_5_IRQHandler(void){ int i=0;
if(EXTI_GetITStatus(EXTI_Line8)!= RESET){
for(i=0;i<10;i++){
GPIO_Write(GPIOF,0xffff);
GPIO_SetBits(GPIOF, GPIO_Pin_8);/* LED3 點亮 */
Delay(0x5fFFFF);
GPIO_ResetBits(GPIOF, GPIO_Pin_8);/* LED3 熄滅 */
Delay(0x5fFFFF);
EXTI_ClearITPendingBit(EXTI_Line8);} } }
4、實驗現(xiàn)象
中斷優(yōu)先級從高到低依次為:SW3,SW2,SW1 原來5個LED燈都處于熄滅狀態(tài),按下SW1,LED3應該閃爍10次,當其閃爍5次后按下SW2,LED2也應該閃爍10次,當其閃爍4次后按下SW3,LED1也應該閃爍10次,則當LED1閃爍完10次后,LED2繼續(xù)閃爍6次,之后LED1繼續(xù)閃爍5次。
5、實驗總結
通過本次實驗,可以對LED狀態(tài)實行中斷嵌套,由以上實驗現(xiàn)象,得出以下結論:高中斷優(yōu)先級可以打斷低優(yōu)先級,中斷系統(tǒng)正在執(zhí)行一個中斷服務時,有另一個優(yōu)先級更高的中斷提出中斷請求,這時會暫時終止當前正在執(zhí)行的級別較低的中斷源的服務程序,去處理級別更高的中斷源,待處理完畢,再返回到被中斷了的中斷服務程序繼續(xù)執(zhí)行,反之,低中斷優(yōu)先級不可以打斷高優(yōu)先級。
實驗五:TIM2的基本應用
1、實驗要求
TIM2定時器將LED燈定時點亮和熄滅一定的時間
2、電路原理圖
3、軟件分析
TIM_Cmd(TIM2, ENABLE);
/* TIM2 enable counter */ TIM_TimeBaseStructure.TIM_Period = 1999;
TIM_TimeBaseStructure.TIM_Prescaler = 35999;
//定時時間為1s void TIM2_IRQHandler(void){ TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
GPIO_WriteBit(GPIOF, GPIO_Pin_6,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOF, GPIO_Pin_6)));}
4、實驗現(xiàn)象
LED1燈按照1S的定時時間不斷閃爍
5、實驗總結
通過本次實驗,可以實現(xiàn)對LED燈進行定時控制其閃爍,而不需要延時函數控制了,定時時間較為精準。實驗六:TIM2,TIM3,TIM4多定時器的應用
1、實驗要求
利用TIM2,TIM3,TIM4定時器使LED燈以不同的頻率閃爍
2、電路原理圖
3、軟件分析
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;此處比上一個實驗增加了2個定時器,同時又增加了一個優(yōu)先級
4、實驗現(xiàn)象
中斷優(yōu)先級從高到低依次為:TIM2,TIM3,TIM4 首先LED1以1S的定時時間閃爍5次,之后LED2以2S的定時時間閃爍5次,最后LED3以3S的定時時間閃爍5次
5、實驗總結
利用定時器可以同時使LED燈按照不同的頻率閃爍,但是為了現(xiàn)象明顯,可以加一個優(yōu) 先級,分別觀察現(xiàn)象。
實驗七:串口USART1讀取CPU的ID號
1、實驗要求
通過USART1讀取 CPU 的 96 bit ID
2、電路原理圖
圖 開發(fā)板USART原理圖
3、軟件分析
void Get_ChipID(void)/* 獲取芯片ID */ { ChipUniqueID[0] = *(u32 *)(0X1FFFF7F0);/* 高字節(jié) */ ChipUniqueID[1] = *(u32 *)(0X1FFFF7EC);
ChipUniqueID[2] = *(u32 *)(0X1FFFF7E8);/* 低字節(jié) */ } void USART_Configuration(void){
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_ClearFlag(USART1, USART_FLAG_TC);
USART_Cmd(USART1, ENABLE);
/* Enable USART1 */ }
4、實驗現(xiàn)象
PA9連接的是USART1 Tx,PA10連接的是USART1 Rx,再通過串口調試助手就可 以在電腦上面顯示出CPU的ID以及flash容量大小。
5、實驗總結
本次實驗實現(xiàn)了串口和PC機的傳輸,可以通過USART1將CPU的ID在電腦上顯示出來。
實驗八:異步通信USART2的重映射
1、實驗要求
實現(xiàn)異步通信USART2的重映射,將數據傳送到PC機上
2、電路原理圖
圖 開發(fā)板USART原理圖
3、軟件分析
void GPIO_Configuration()
/* IO口初始化 */ {
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
/* USART2 Tx--> PD05 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;/* PD05--> JP7 WR */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
/* USART2 Rx--> PD06 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD, &GPIO_InitStructure);GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);} 該程序將USART2重映射到PD05,PD06引腳
4、實驗現(xiàn)象
PD05連接的是USART2 Tx,PD06連接的是USART2 Rx,通過串口調試助手就可以在電腦上面顯示Program Running!
5、實驗總結
通過本次實驗,可以實現(xiàn)對異步通信USART2的重映射,再通過串口調試助手在電腦上顯示出來。
第四篇:嵌入式系統(tǒng)實驗報告
嵌入式系統(tǒng)設計實驗報告
班 級: 學 號: 姓 名: 成 績: 指導教師:
1.實驗一
1.1 實驗名稱
博創(chuàng)UP-3000實驗臺基本結構及使用方法
1.2 實驗目的
1.學習嵌入式系統(tǒng)開發(fā)流程。
2.熟悉UP-net3000實驗平臺的核心硬件電路和外設。
3.增加對各個外設的了解,為今后各個接口實驗打下基礎。
1.3 實驗環(huán)境
博創(chuàng)UP-NETARM3000 嵌入式開發(fā)平臺
1.4 實驗內容及要求
(1)嵌入式系統(tǒng)開發(fā)流程概述
(2)熟悉UP-net3000實驗平臺的核心硬件電路和外設(3)ARM JTAG的安裝與使用
(4)通過操作系統(tǒng)自帶的通訊軟件超級終端,檢驗各個外設的工作狀態(tài)(5)通過本次課程對各個外設的了解,為今后各個接口實驗打下基礎
1.5 實驗設計與實驗步驟
1.硬件安裝 2.軟件安裝
(1)超級終端:
運行Windows 系統(tǒng)下的超級終端(HyperTerminal)應用程序,新建一個通信終端;在接下來的對話框中選擇 ARM開發(fā)平臺實際連接的PC機串口;完成新建超級終端的設置以后,可以選擇超級終端文件菜單中的保存,將當前設置保存為一個特定超級終端到桌面上,以備后用。
(2)JTAG 驅動程序的安裝:
執(zhí)行armJtag目錄下armJtagSetup.exe程序,選擇安裝目錄,安裝 JTAG 軟件。
1.6 實驗過程與分析
(1)了解嵌入式系統(tǒng)開發(fā)流程(2)對硬件的安裝(3)對軟件的安裝
1.7 實驗結果總結
通過本次實驗對嵌入式系統(tǒng)開發(fā)流程進行了了解,并且對硬件環(huán)境和軟件環(huán)境進行了安裝配置,通過本次實驗對以后的接口實驗打了基礎。
1.8 心得體會
通過本次實驗對嵌入式實驗有了初步的了解,對基本開發(fā)流程也有了初步的了解。
2.實驗二
2.1 實驗名稱
ADS1.2軟件開發(fā)環(huán)境使用方法
2.2 實驗目的
熟悉ADS1.2開發(fā)環(huán)境,學會 ARM仿真器的使用。使用 ADS 編譯、下載、調試并跟蹤一段已有的程序,了解嵌入式開發(fā)的基本思想和過程。
2.3 實驗環(huán)境
(1)ADS1.2開發(fā)環(huán)境
(2)博創(chuàng)UP-NETARM3000 嵌入式開發(fā)平臺(3)PC(4)串口線
2.4 實驗內容及要求
本次實驗使用ADS 集成開發(fā)環(huán)境,新建一個簡單的工程文件,并編譯這個工程文件。學習ARM仿真器的使用和開發(fā)環(huán)境的設置。下載已經編譯好的文件到嵌入式控制器中運行。學會在程序中設置斷點,觀察系統(tǒng)內存和變量,為調試應用程序打下基礎。
2.5 實驗設計與實驗步驟
(1)運行ADS1.2開發(fā)環(huán)境(2)新建工程文件(3)編譯工程文件
(4)下載編譯好的文件到嵌入式控制器中運行
2.6 實驗過程與分析
(1)實現(xiàn)Hello World!
最終在輸出了Hello World(2)編程實現(xiàn)ARM 和計算機之間的串行通訊
實現(xiàn)了串口通信,用ARM監(jiān)視串口,接收到的字符串由ARM通過串口發(fā)送給超級終端,最終在超級終端上顯示了按下的鍵。學習了串行通訊原理,了解串行通訊控制器,閱讀ARM 芯片文檔,掌握ARM 的UART相關寄存器的功能,熟悉ARM 系統(tǒng)硬件的UART 相關接口。
2.7 實驗結果總結
對ADS 1.2開發(fā)環(huán)境使用和AXD Debugger使用方法有了初步的了解,基本成功運行了編譯好的工程文件。
2.8 心得體會
學習了ADS1.2開發(fā)環(huán)境的使用方法和調試方法。使用 ADS 編譯、下載、調試并跟蹤一段已有的程序,了解了嵌入式開發(fā)的基本思想和過程。
3.實驗三
3.1 實驗名稱
鍵盤控制方法及LED驅動設計
3.2 實驗目的
熟悉ZLG7289芯片的內部結構,掌握用ZLG7289驅動鍵盤和LED的方法,掌握ARM匯編語言和C語言的編程方法編寫出一段程序,要求能在LED上顯示出小鍵盤上按下的4位數字。
3.3 實驗環(huán)境
(1)ADS1.2開發(fā)環(huán)境
(2)博創(chuàng)UP-NETARM3000 嵌入式開發(fā)平臺(3)PC(4)串口線
3.4 實驗內容及要求
通過ZLG7289芯片驅動17鍵的鍵盤和8個共陰極LED,將按鍵值在LED 上顯示出來。
3.5 實驗設計與實驗步驟
(1)新建工程,將“Exp3鍵盤及LED 驅動實驗”中的文件添加到工程。(2)定義ZLG7289 寄存器(3)編寫ZLG7289 驅動函數(4)定義鍵盤映射表(5)定義鍵值讀取函數
(6)編寫主函數
3.6 實驗過程與分析
(1)定義ZLG7289寄存器 #define ZLG7289_CS #define ZLG7289_KEY #define ZLG7289_ENABLE()do{ZLG7289SIOBand=rSBRDR;ZLG7289SIOCtrl=rSIOCON;rSIOCON=0x31;rSBRDR=0xff;rPDATB&=(~ZLG7289_CS);}while(0)#define ZLG7289_DISABLE()do{rPDATB|=ZLG7289_CS;rSBRDR=ZLG7289SIOBand;rSIOCON=ZLG7289SIOCtrl;}while(0)(2)主函數中需要在開始初始化zlg7289。編寫驅動和鍵值映射之后,在一個循環(huán)里面從鍵盤中讀取按鍵的號碼,根據鍵值映射讀出按鍵的值。然后在主函數中,將讀出的按鍵值在數碼管上顯示出來。
(3)Main函數的主要功能部分,GetKey()函數得到按鍵值是調用zlg7289獲取鍵盤事件和核心。
3.7 實驗結果總結
通過實驗最終LED燈上能顯示數字,即實現(xiàn)了通過鍵值控制LED燈
3.8 心得體會
通過本次實驗對ZLG7289芯片的內部結構有了更進一步的了解,對ZLG7289驅動鍵盤和LED的方法也更進一步的進行了學習。
4.實驗四
4.1 實驗名稱
電機轉動控制及中斷實驗
4.2 實驗目的
(1)熟悉ARM本身自帶的六路即三對PWM,掌握相應寄存器的配置
(2)編程實現(xiàn) ARM系統(tǒng)的PWM 輸出和I/O 輸出,前者用于控制直流電機,后者用于控制步進電機。
(3)了解直流電機和步進電機的工作原理,學會用軟件的方法實現(xiàn)步進電機的脈沖分配,即用軟件的方法代替硬件的脈沖分配器。
(4)掌握帶有PWM 和I/O 的CPU 編程實現(xiàn)其相應功能的主要方法。
4.3 實驗環(huán)境
(1)ADS1.2開發(fā)環(huán)境
(2)博創(chuàng)UP-NETARM3000 嵌入式開發(fā)平臺(3)PC(4)串口線
4.4 實驗內容及要求
學習步進電機和直流電機的工作原理,了解實現(xiàn)兩個電機轉動對于系統(tǒng)的軟件和硬件要求。學習ARM知識,掌握PWM 的生成方法,同時也要掌握I/O 的控制方法。
(1)編程實現(xiàn)ARM芯片的一對PWM 輸出用于控制直流電機的轉動,通過A/D 旋鈕控制其正反轉及轉速
(2)編程實現(xiàn)ARM的四路I/O 通道實現(xiàn)環(huán)形脈沖分配用于控制步進電機的轉動,通過A/D 旋鈕轉角控制步進電機的轉角。
(3)通過超級終端來控制直流電機與步進電機的切換。4.5 實驗設計與實驗步驟
(1)新建工程,將“電機轉動控制實驗”中的文件添加到工程(2)編寫直流電機初始化數(MotorCtrl.c)(3)控制直流電機與步進電機
4.6 實驗過程與分析
(1)通過把從串口中得到控制信息的代碼修改成從zlg7289芯片中讀取小鍵盤信息,從而利用試驗臺的小鍵盤來控制步進電機和直流電機的切換
(2)A/D轉換可以把電信號轉換成數字信號來控制電機的轉速。for(;;)
{ loop:
//if((rUTRSTAT0 & 0x1))//有輸入,則返回
if(rPDATG&ZLG7289_KEY)//17鍵小鍵盤控制電機
{
*Revdata=RdURXH0();
goto begin;
}
Delay(10);ADData=GetADresult(0);
if(abs(lastADData-ADData)<20)
goto loop;Delay(10);count=-(ADData-lastADData)*3;
//(ADData-lastADData)*270/1024為ad旋鈕轉過的角度,360/512為步距角,//由于接了1/8減速器,兩者之商再乘以8為步進電機相應轉過的角度
if(count>=0)
{//轉角大于零
for(j=0;j { for(i=0;i<=7;i++) { SETEXIOBITMASK(stepdata[i], 0xf0); Delay(200); } } } else {//轉角小于零 count=-count; for(j=0;j { for(i=7;i>=0;i--) { SETEXIOBITMASK(stepdata[i], 0xf0); Delay(200); } } } lastADData=ADData; } } (3)S3C44B0X 具有6 個16bit定時器,每個定時器可以基于中斷模式或 DMA模式運行。在定時中斷服務程序中寫需要定時處理的程序,每隔一段時間就會運行一次。 4.7 實驗結果總結 利用A/D轉換器實現(xiàn)了對直流電機和步進電機的控制,利用實驗設備上自帶的小鍵盤實現(xiàn)了A/D轉換器對兩個電機控制的切換。 4.8 心得體會 通過本次實驗,熟悉了ARM自帶的六路(三對)PWM,并對直流電機和步進電機的工作原理有了進一步的了解。 5.實驗五 5.1 實驗名稱 LCD驅動及觸摸屏實驗 5.2 實驗目的 掌握LCD顯示原理及顯示驅動的嵌入式系統(tǒng)編程實現(xiàn)方法;學習基于ARM的LCD 顯示驅動控制方法,通過對ARM 內置的LCD 控制器進行編程實現(xiàn)驅動LCD顯示屏;學習觸摸屏基本原理,理解觸摸屏的輸出標定以及與LCD 顯示器配合的過程,編程對觸摸屏進行控制。 5.3 實驗環(huán)境 (1)ADS1.2開發(fā)環(huán)境(2)博創(chuàng)UP-NETARM3000 嵌入式開發(fā)平臺(3)PC(4)串口線 5.4 實驗內容及要求 (1)學習LCD顯示器的基本原理,理解其驅動控制方法(2)編程對觸摸屏進行控制,實現(xiàn): 1.點擊觸摸屏上兩點后,兩點之間畫出一條直線。2.點擊觸摸屏并在其上移動,顯示移動軌跡 (3)編程實現(xiàn)總線方式驅動模塊的LCD和ARM內置的LCD控制器來驅動LCD 5.5 實驗設計與實驗步驟 (1)新建工程 (2)定義有關常量與宏 #define LCDWIDTH 320 #define LCDHEIGHT 240 U32* pLCDBuffer16=(U32*)0xc000000;// 一級緩存指針 U32 LCDBuffer[LCDHEIGHT][LCDWIDTH];//二級緩存(3)編寫LCD 初始化函數(4)編寫LCD 刷新函數(5)編寫主函數 5.6 實驗過程與分析 (1)通過不斷刷新的方式獲得LCD液晶屏幕的動畫。即刷新函數將二級緩存LCDBuffer 的數據由32 位彩色圖形信息轉換成8 位256 色的圖形信息,然后放到pLCDBuffer16指向的一級緩存。 (2)觸摸屏的先得到觸屏輸出的電信號的值,然后轉換為實際的屏幕坐標,再根據動作來決定如何處理緩存信息,刷新LCD。 LCD二級緩存矩陣: for(i=0;i<9;i++){ switch(i){ case 0: jcolor=0x00000000;// 黑色 break;case 1: jcolor=0x000000e0;// 紅色 break;case 2: jcolor=0x0000d0e0;// 橙色 break;case 3: jcolor=0x0000e0e0;// 黃 break;case 4: jcolor=0x0000e000;// 綠色 break;case 5: jcolor=0x00e0e000;// 青色 break;case 6: jcolor=0x00e00000;// 藍色 break;case 7: jcolor=0x00e000e0;// 紫色 break;case 8: jcolor=0x00e0e0e0;// 白色 break;} for(k=0;k<240;k++)for(j=i*32;j 5.7 實驗結果總結 本次實驗由于坐標設定的問題并沒有成功實現(xiàn)觸摸痕跡的顯示,但在測試過程中,在觸摸屏上點擊或移動時會在超級終端上有顯示。 5.8 心得體會 雖然本次實驗不太成功實現(xiàn),但對LCD屏幕和觸摸屏的工作原理有了進一步的了解,更好的掌握了LCD顯示原理及顯示驅動的嵌入式系統(tǒng)編程實現(xiàn)方法。 6.實驗六 6.1 實驗名稱 ucos-II裁剪實驗 6.2 實驗目的 掌握μcos-II裁剪的基本原理與嵌入式編程實現(xiàn)方法;學習如何根據具體情況對μcos-II操作系統(tǒng)進行裁剪,從而得到即滿足需要,又非常緊湊的應用軟件系統(tǒng)。 6.3 實驗環(huán)境 (1)ADS1.2開發(fā)環(huán)境 (2)博創(chuàng)UP-NETARM3000 嵌入式開發(fā)平臺(3)PC(4)串口線 6.4 實驗內容及要求 (1)通過對μcos-II配置文件(OS_CFG.H)中相關的配置常量進行設置,實現(xiàn)對μcos-II的裁剪 (2)給出裁剪的詳細過程與裁剪結果說明,并生成裁剪后的操作系統(tǒng)文件。 6.5 實驗設計與實驗步驟 (1)新建工程,將ucosII移植的文件添加到工程中。 (2)編輯os_cfg.h頭文件。 (3)將裁減后的系統(tǒng)所需用到的功能宏定義配置常量置為1,實現(xiàn)系統(tǒng)的裁減。(4)編譯生成新的ucosII系統(tǒng)。 6.6 實驗過程與分析 (1)配置功能常量,將裁剪后的系統(tǒng)需要用到的功能配置常量設為1(2)裁減信號量數據(3)配置數據結構 OS_MAX_TASKS,若程序中用到了三個任務,則該值的最小值為3 OS_LOWEST_PRIO設置程序中最低任務的優(yōu)先級 OS_TASK_IDLE_STK_SIZE設置UC/OS操作系統(tǒng)中空閑任務堆棧的容量 OS_TASK_STAT_STK_SIZE設定統(tǒng)計任務的任務堆棧容量 6.7 實驗結果總結 通過本次實驗,裁減了系統(tǒng),修改了某些數據結構相關的常量,節(jié)省了內存空間 6.8 心得體會 通過本次實驗主要學習到了如何根據具體情況對μcos-II操作系統(tǒng)進行裁剪,從而得到即滿足需要,又非常緊湊的應用軟件系統(tǒng)。 7.實驗七 7.1 實驗名稱 ucos-II移植實驗 7.2 實驗目的 了解μC/OS-II 內核的主要結構,掌握ARM的C語言和匯編語言的編程方法;了解ARM7處理器結構;掌握將μC/OS-II 內核移植到ARM 7 處理器上的基本原理與嵌入式編程實現(xiàn)方法 7.3 實驗環(huán)境 (1)ADS1.2開發(fā)環(huán)境 (2)博創(chuàng)UP-NETARM3000 嵌入式開發(fā)平臺(3)PC(4)串口線 7.4 實驗內容及要求 (1)將μC/OS-II 內核移植到ARM7 微處理器S3C44B0上。(2)編寫兩個簡單任務,在超級終端上觀察兩個任務的切換。 7.5 實驗設計與實驗步驟 (1)新建工程 (2)該實驗的文件分為兩類,其一是 STARTUP目錄下的系統(tǒng)初始化、配置等文件,其二是uCOS-II 的全部源碼,arch 目錄下的3 個文件是和處理器架構相關的3.定義驅動函數(tchscr.c)(3)設置os_cpu.h 中與處理器和編譯器相關的代碼(4)用C 語言編寫6 個操作系統(tǒng)相關的函數(5)用匯編語言編寫4 個與處理器相關的函數 (6)編寫一個簡單的多任務程序來測試一下移植是否成功(7)編譯并下載移植后的uCOS-II 7.6 實驗過程與分析 (1)首先需要對相關寄存器做詳細的設定(2)用匯編語言編寫與處理器相關的函數(3)用分時的方法同時運行兩個任務 OS_STK TaskName_Stack[STACKSIZE]={0, };//任務堆棧 void TaskName(void *Id);//任務函數 #define TaskName_Prio N //任務優(yōu)先級 在main()函數中調用OSStart()函數之前用下列語句創(chuàng)建任務: OSTaskCreate(TaskName,(void*)0,(OS_STK*)&TaskName_Stack[STACKSIZE-1], TaskName_Prio);OSTaskCreate()函數的原型是: INT8U OSTaskCreate(void(*task)(void *pd), void *p_arg, OS_STK *ptos, INT8U prio);(4)編寫任務函數 7.7 實驗結果總結 通過實驗達到了ucosII系統(tǒng)移植的目的,并編寫了一個簡單的多任務程序,分時運行。 7.8 心得體會 通過本次實驗了解了μC/OS-II 內核的主要結構,掌握了ARM的C語言和匯編語言的編程方法。 8.實驗八 8.1 實驗名稱 各接口模塊相互銜接綜合實驗 8.2 實驗目的 (1)回顧串口、鍵盤、LED接口、A/D、電機轉動、定時器中斷、LCD接口及觸摸屏驅動控制等接口模塊驅動設計及開發(fā)方法 (2)綜合應用以上全部或者部分模塊,實現(xiàn)一個嵌入式綜合應用系統(tǒng),要求至少用到8個模塊中的5個 8.3 實驗環(huán)境 (1)ADS1.2開發(fā)環(huán)境 (2)博創(chuàng)UP-NETARM3000 嵌入式開發(fā)平臺(3)PC(4)串口線 8.4 實驗內容及要求 (1)綜合應用串口、鍵盤、LED接口、A/D、電機轉動、定時器中斷、LCD接口及觸摸屏驅動控制等全部或者部分模塊(2)實現(xiàn)一個嵌入式綜合應用系統(tǒng),要求至少用到8個模塊中的5個,盡量使綜合應用系統(tǒng)具備合理的功能。 8.5 實驗設計與實驗步驟 (1)運行ADS1.2開發(fā)環(huán)境(2)新建工程文件 (3)將綜合實驗中用到的文件放到這個工程文件中(4)下載編譯好的文件到嵌入式控制器中運行 8.6 實驗過程與分析 (1)本次實驗設計主要是通過中斷來實現(xiàn),設定了flag=1,2,3,4,5,6六個標志位,對應不同的鍵值來實現(xiàn)功能的切換 (2)通過num/lock鍵來控制直流電機(3)通過“/”鍵來控制步進電機 (4)通過“*”鍵來控制屏輸出“hello world”(5)通過“+”鍵來實現(xiàn)LED燈的計時 (6)通過“DEL”鍵來實現(xiàn)清屏和LED燈的清除 (7)通過“enter”鍵來進入到鍵值控制LED顯示的功能 8.7 實驗結果總結 實驗最終能實現(xiàn)5個功能的切換,但不足的是未涉及到觸摸屏的設計,并且最后的鍵值控制LED燈不能實現(xiàn)正常的中斷跳轉。 8.8 心得體會 通過本次綜合性的實驗來綜合之前做的串口、鍵盤、LED接口、A/D、電機轉動、定時器中斷、LCD接口及觸摸屏驅動控制實驗,回顧了之前的知識,對整體的運用有了進一步的了解,但是實驗結果仍有很多的不足,需要改進。 9.實驗總結與心得體會 通過之前的串口、鍵盤、LED接口、A/D、電機轉動、定時器中斷、LCD接口及觸摸屏驅動控制實驗這7個小模塊的實驗,對嵌入式系統(tǒng)的開發(fā)流程有了基本的了解,熟悉了博創(chuàng)UP-NETARM3000實驗臺和ADS1.2軟件的實驗環(huán)境,同時也掌握了各模塊功能實現(xiàn)功能的基本原理。在最后的綜合性實驗中,通過對以上知識的掌握和理解,進一步的對以上知識進行了加深和鞏固,雖然有幾次實驗實現(xiàn)的實驗結果并不是很成功,但還是達到了學習和理解的效果。 廣西工學院鹿山學院 實 驗 報 告 課程名稱: 嵌入式系統(tǒng) 指導教師: 劉瑞琪 班 級: 自動化101 姓 名: 楊杰 學 號: 20102787 成績評定: 指導教師簽字: 2013年5月25日 實驗一 簡單的程序 一 實驗目的:、動手實踐一個簡單的字符型設備驅動程序。、學習Linux 驅動程序構架。、學習在應用程序中調用驅動。 二 實驗內容: 編寫簡單的字符型設備驅動程序。編寫相應的應用程序。 三 實驗設備:、一套S3C2410RP 嵌入式實驗箱。、安裝Redhat9的宿主PC機,并且配置好 ARM Linux 的開發(fā)環(huán)境。 四 實驗步驟 實驗二 CPU GPIO 驅動程序及測試程序 一、實驗目的: 編寫第一個針對實際硬件的驅動程序,進一步了解驅動程序構架。 二、實驗內容:、編寫S3C2410 GPIO驅動程序。、編寫S3C2410 GPIO應用程序。、在 LINUX系統(tǒng)中插入自己的驅動程序,調用它。實現(xiàn)用 CPU GPIO 控制外部LED,利用S3C2410 核心板上的 LED 驗證我們的工作。 三、實驗設備、一套S3C2410RP 嵌入式實驗箱。、安裝Redhat9的宿主PC機,并且配置好 ARM Linux 的開發(fā)環(huán)境。 四、實驗步驟 1、復制Experiment_KeyHello_driverapl_test文件下的simple_test_driver.c文件到Experiment_KeyGPIO文件夾下,將文件名更改為test.c。 2、打開test.c,在else語句后更改函數語句如下: 3、復制Experiment_KeyADapl_test文件夾下的Makefile到Experiment_KeyGPIO文件夾下,打開并將中的ADC刪除。 4、打開Experiment_KeyGPIOdriver文件下的gpio_led.c文件。 5、在ssize_t SIMPLE_GPIO_LED_ioctl函數下添加如下語句: if(cmd==0)GPBDAT &= ~(0xf<<5); if(cmd==1)GPBDAT |=(0xf<<5);如下圖所示: 6、在int __init HW_GPIO_LED_CTL_init函數下屏蔽for循環(huán),如下圖所示: 保存并關閉。 7、打開終端,并編譯test.c文件和gpio_led.c文件。 8、重新打開一個終端,并按步驟輸入如下語句: 9、依次輸入如下語句: 1、cd..2、ls 3、mknod /dev/hello_ctl c 97 1 4、./test 實驗三 中斷實驗及LED顯示 一、實驗目的: 學習Linux 系統(tǒng)是如何處理中斷。 二、實驗內容: 編寫獲取和處理外中斷的驅動程序。 三、實驗設備:、一套S3C2410RP 嵌入式實驗箱。、安裝Redhat9的宿主PC機,并且配置好 ARM Linux 的開發(fā)環(huán)境。 四、實驗步驟 1、打開Experiment_KeyGPIOdriver文件下的gpio_led.c文件。 2、在ssize_t SIMPLE_GPIO_LED_ioctl函數下添加如下語句: if(cmd==0)GPBDAT &= ~(0xf<<5); if(cmd==1)GPBDAT |=(0xf<<5);如下圖所示: 3、在int __init HW_GPIO_LED_CTL_init函數下屏蔽for循環(huán),如下圖所示: 保存并關閉。 4、打開Experiment_KeyInterruptdriver下的Interrupt.c文件,并在其interrupt函數下添加for語句,如下圖所示: 5、打開終端,并編譯Interrupt.c文件和gpio_led.c文件。 6、重新打開一個終端,并按步驟輸入如下語句: 7、依次輸入如下語句: 1、cd /mnt/2410RP_linux/Experiment_Key/Interrupt/driver 2、ls 3、insmod Interrupt.o 實驗四 數碼管顯示實驗 一、實驗目的: 學習串并轉換的相關知識,并編寫驅動程序。 二、實驗內容: 編寫針對zlg7289A 的驅動程序。 三、實驗設備:、一套S3C2410RP 嵌入式實驗箱。、安裝Redhat9的宿主PC機,并且配置好 ARM Linux 的開發(fā)環(huán)境。 四、實驗步驟 1、打開Experiment_KeySpi_leddriver文件夾下的spi_led.c 2、并在spi_ledInit函數下添加如下語句: 保存并關閉。 3、打開終端,并編譯spi_led文件。 4、重新打開一個終端,并輸入如下語句: 實驗五 AD 驅動實驗 一 實驗目的:、了解模數轉換的基本原理;、掌握模數轉換的編程方法。 二 實驗內容:、編程對模擬量輸入進行采集和轉換,并將結果顯示在超級終端上。、通過改變模擬量輸入,觀察顯示結果。 三 實驗設備:、一套S3C2410RP 嵌入式實驗箱。、安裝Redhat9的宿主PC機,并且配置好 ARM Linux 的開發(fā)環(huán)境。 四 實驗步驟 1、在spi_led..c中的simpled ioctl中加入以下程序 2、在testADC中復制以下程序并修改如下 3、掛載程序 cd /mnt/2410RP_linux/Experiment_Key/spi_led/driver ls insmod spi_led.o cd /mnt/2410RP_linux/Experiment_Key/ad/driver insmod adc.o cd /mnt/2410RP_linux/Experiment_Key/ad/apl_test ls mknod /dev/spi c 104 1 ls ./testADC第五篇:嵌入式系統(tǒng)實驗報告