第一篇:嵌入式實(shí)驗(yàn)總結(jié)
如今,嵌入式系統(tǒng)已經(jīng)在眾多電氣電子產(chǎn)品上應(yīng)用,有人預(yù)測(cè)今后5年發(fā)展形勢(shì)看好。嵌入式是典型的交叉學(xué)科,電信、電子、電氣、計(jì)算機(jī)、通信等等都有涉及。
嵌入式理論、實(shí)踐要求多、門(mén)檻高,只有理論、實(shí)踐同步才能在積累中更好的漸次掌握,這學(xué)期我們針對(duì)嵌入式入門(mén)做了一些實(shí)驗(yàn),通過(guò)自己動(dòng)手和實(shí)驗(yàn)箱、實(shí)驗(yàn)軟件打交道,對(duì)嵌入式編程形成初步了解,為今后進(jìn)一步發(fā)展打基礎(chǔ)。
實(shí)驗(yàn)環(huán)境:
武漢創(chuàng)維特公司JXARM9-2410開(kāi)發(fā)板、PC;
Linux、windows操作平臺(tái);
DNW、VMwareWorkstation應(yīng)用軟件;
《ARM9嵌入式技術(shù)及Linux高級(jí)實(shí)踐教程》、實(shí)驗(yàn)參考資料等;
實(shí)驗(yàn)內(nèi)容及目標(biāo):
閱讀樣例程序,進(jìn)行:
1.熟悉JXARM9-2410開(kāi)發(fā)板、相關(guān)應(yīng)用軟件的使用,能成功運(yùn)行示例實(shí)驗(yàn)程序(demo-led);
2.使用VMware,修改demo-led源程序,使開(kāi)發(fā)板上數(shù)碼管按照demo-led顯示方式顯示;
3.使用VMware、DNW,修改相關(guān)源程序,實(shí)現(xiàn)開(kāi)發(fā)板鍵盤(pán)輸入的字符在DNW中顯示;
4.使用VMware、DNW,修改相關(guān)源程序,實(shí)現(xiàn)對(duì)直流電機(jī)轉(zhuǎn)動(dòng)狀態(tài)的控制;
觀看教學(xué)視頻,進(jìn)行交叉編譯:
1.加載linux內(nèi)核;
2.配置、編譯linux內(nèi)核;
3.Windows、linux跨平臺(tái)文件共享;
4.編譯、運(yùn)行l(wèi)inux程序(helloworld)
5.Linux下編譯數(shù)碼管顯示驅(qū)動(dòng)程序;
6.Linux下編譯攝像頭、GPRS驅(qū)動(dòng)程序;
學(xué)習(xí)嵌入式是一個(gè)漫長(zhǎng)的過(guò)程,學(xué)好它還是需要一番的功夫。通過(guò)嵌入式實(shí)驗(yàn)由淺入深的動(dòng)手實(shí)踐,我漸漸對(duì)嵌入式有了具體概念,也逐漸對(duì)其產(chǎn)生了興致和好奇心。
對(duì)于初學(xué)者,還有一點(diǎn)小建議,不要好高騖遠(yuǎn),要腳踏實(shí)地.
第二篇:嵌入式實(shí)驗(yàn)二
1.實(shí)驗(yàn)二:利用中斷實(shí)現(xiàn) OLED 動(dòng)態(tài)顯示實(shí)驗(yàn)
1.1 實(shí)驗(yàn)名稱(chēng)
1.2 實(shí)驗(yàn)?zāi)康?/p>
(1)深入學(xué)習(xí)、理解、掌握 OLED 字符顯示方法
(2)深入學(xué)習(xí)、理解、掌握 OLED 圖形顯示方法(3)學(xué)習(xí)、理解、掌握中斷使用方法
1.3 實(shí)驗(yàn)過(guò)程與分析
1.3.1 回答實(shí)驗(yàn)報(bào)告中的實(shí)驗(yàn)問(wèn)題
(1)ISR是什么?簡(jiǎn)述一下中斷的作用和使用方法
答:ISR是中斷服務(wù)程序。作用是通過(guò)處理器執(zhí)行事先編好的某個(gè)特定的程序。使用方法就是在main中寫(xiě)一個(gè)中斷程序,然后在startup.s中進(jìn)行注冊(cè)。
(2)嵌入式系統(tǒng)中有哪些應(yīng)用有定時(shí)性循環(huán)處理的要求?舉幾個(gè)例子
答:在各種網(wǎng)絡(luò)的應(yīng)用中,設(shè)計(jì)的一些部件,如計(jì)數(shù)器,時(shí)鐘等。
(3)定時(shí)時(shí)間間隔如何修改?
(4)選作內(nèi)容5-8的編程思路是什么?若做的話應(yīng)該怎樣實(shí)現(xiàn)? 答:編程思路:先畫(huà)直線和豎線,組成一個(gè)正方形,將各個(gè)參數(shù)填寫(xiě)到函數(shù)答:通過(guò)改變SysTickPeriodSet(SysCtlClockGet()/100)后面的100這個(gè)參數(shù)。
RIT128x96x4ImageDraw(buf,,);
第6個(gè)選作:判斷畫(huà)的原點(diǎn)x,原點(diǎn)y,和畫(huà)原點(diǎn)x+的長(zhǎng),畫(huà)原點(diǎn)y+畫(huà)寬的值要在0-128和0-96。
第7個(gè)選作:把RIT128x96x4StringDraw(“hello”,,);就是把畫(huà)的灰度定義為一個(gè)變量x。最后就會(huì)出現(xiàn)由不同的亮度而形成的波浪。
第8個(gè)就是利用隨機(jī)函數(shù)產(chǎn)生畫(huà)的原點(diǎn),隨機(jī)的在屏幕上進(jìn)行顯示。
(5)拖影現(xiàn)象如何解決?計(jì)數(shù)值顯示為什么沒(méi)有拖影? 答:在程序結(jié)束后執(zhí)行清屏語(yǔ)句:計(jì)數(shù)顯示是每次重新賦值,所以不會(huì)出現(xiàn)拖影。
1.3.2 實(shí)驗(yàn)中遇到的問(wèn)題及解決方法
(1)字符和下方橫線,從左至右移動(dòng),無(wú)法同時(shí)到達(dá)
通過(guò)最大寬度128除以閥值,調(diào)整了字符和橫線的速度,解決(2)附加字符循環(huán)移動(dòng),移動(dòng)到一半,不見(jiàn)了
查看函數(shù)排錯(cuò),得以解決
(3)基本問(wèn)題做完時(shí),字符顯示完整,添加附加任務(wù)后,字符顯示不全
未解決...1.4實(shí)驗(yàn)結(jié)果總結(jié) 實(shí)驗(yàn)結(jié)果(附照片)
總結(jié)(自己的收獲)1.5心得體會(huì)
#include
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff };unsigned char buf2[] = {
0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00 };unsigned char buf3[] = {
0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff };unsigned char buf4[] = {
0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff };unsigned char buf5[] = {
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff };unsigned char buf6[] = {
0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff };unsigned char buf7[] = {
0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff };unsigned char buf8[] = {
0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff };
unsigned char r1[] = {
0xff,0xff };unsigned char r2[] = {
0xf0,0x0f };unsigned char r3[] = {
0xf0,0x0f };unsigned char r4[] = {
0xff,0xff };
unsigned char c1[] = {
0x0f,0xf0 };unsigned char c2[] = {
0xf0,0x0f };unsigned char c3[] = {
0xf0,0x0f };unsigned char c4[] = {
0x0f,0xf0 };void SysTick_Handler(void){ Event = 1;} void printX(){ }
int main(){
int count = 0,i,Light=0,x=0,z=0,y=0,zz=0,yy=0,c=0,cc=0,a=0,aa=0;unsigned char buf[5];
//存(數(shù)字)字符串
unsigned char name[20] = “";unsigned char number[20] = ”“;SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN SYSCTL_XTAL_8MHZ);RIT128x96x4Init(1000000);RIT128x96x4Clear();
串
SysTickPeriodSet(SysCtlClockGet()/ 10);
//調(diào)頻率
SysTickEnable();SysTickIntEnable();while(1){
if(Event){
RIT128x96x4Clear();
Event = 0;
sprintf(buf,”%3i“,count);
//通過(guò)sprintf將數(shù)字轉(zhuǎn)換為字符
| if(Light >= 15)
{
Light=0;
} else {
Light++;} RIT128x96x4StringDraw(name, 50, 55, 15-Light);RIT128x96x4StringDraw(number, 50, 65, Light);sprintf(buf,”%d",count);;RIT128x96x4StringDraw(buf, 50, 75, 12);
count++;if(count>=200){
count=0;} RIT128x96x4ImageDraw(buf2,(int)(x*0.50), 5, 20, 1);RIT128x96x4ImageDraw(buf3,(int)(x*0.50), 7, 20, 1);RIT128x96x4ImageDraw(buf4,(int)(x*0.50), 9, 20, 1);RIT128x96x4ImageDraw(buf5,(int)(x*0.50), 11,20, 1);RIT128x96x4ImageDraw(buf6,(int)(x*0.50), 13, 20, 1);RIT128x96x4ImageDraw(buf7,(int)(x*0.50), 15, 20, 1);RIT128x96x4ImageDraw(buf8,(int)(x*0.50), 17, 20, 1);RIT128x96x4ImageDraw(buf1, 0, 20,(int)(x*0.60), 1);RIT128x96x4ImageDraw(c1,(int)(60+c*1.20),(int)(5+a*0.85), 4, 1);RIT128x96x4ImageDraw(c2,(int)(60+c*1.20),(int)(7+a*0.85), 4, 1);RIT128x96x4ImageDraw(c3,(int)(60+c*1.20),(int)(9+a*0.85), 4, 1);RIT128x96x4ImageDraw(c4,(int)(60+c*1.20),(int)(11+a*0.85), 4, 1);RIT128x96x4ImageDraw(r1,(int)(z*0.30),(int)(50+y*0.20), 4, 1);RIT128x96x4ImageDraw(r2,(int)(z*0.30),(int)(52+y*0.20), 4, 1);RIT128x96x4ImageDraw(r3,(int)(z*0.30),(int)(54+y*0.20), 4, 1);RIT128x96x4ImageDraw(r4,(int)(z*0.30),(int)(56+y*0.20), 4, 1);if(x<=200&&x>=0)
//直線 {
x++;} if(x>=200){
x=0;} if(c<=50&&c>=-50)
//圓形循環(huán) {
if(cc==0)c++;
if(cc==1)c--;} if(c>=50){
cc=1;} if(c<=-50){
cc=0;} if(a<=100&&a>=0){
if(aa==0)a++;
if(aa==1)a--;} if(a>=100){
aa=1;} if(x<=0){
aa=0;} if(y<=200&&y>=0){
if(yy==0)y++;
if(yy==1)y--;} if(y>=200){
yy=1;} if(y<=-200){
yy=0;} if(z<=400&&z>=0){
if(zz==0)z++;
if(zz==1)z--;} if(z>=400){
zz=1;} if(z<=0){
//矩形反彈
}
zz=0;
} } } return 0;
第三篇:嵌入式系統(tǒng)實(shí)驗(yàn)
南京信息工程大學(xué) 實(shí)驗(yàn)(實(shí)習(xí))報(bào)告
實(shí)驗(yàn)(實(shí)習(xí))名稱(chēng)
電機(jī)轉(zhuǎn)動(dòng)控制及中斷實(shí)驗(yàn) 實(shí)驗(yàn)(實(shí)習(xí))日期
2016.5 得分
指導(dǎo)教師 謝勝東
學(xué)院 計(jì)算機(jī)與軟件 專(zhuān)業(yè) 計(jì)算機(jī)科學(xué)與技術(shù) 年級(jí)
2013 班次 3 姓名
葉正舟 學(xué)號(hào)
20131308072 實(shí)驗(yàn)名稱(chēng)
電機(jī)轉(zhuǎn)動(dòng)控制及中斷實(shí)驗(yàn) 實(shí)驗(yàn)?zāi)康?/p>
(1)熟悉ARM本身自帶的六路即三對(duì)PWM,掌握相應(yīng)寄存器的配置
(2)編程實(shí)現(xiàn) ARM系統(tǒng)的PWM 輸出和I/O 輸出,前者用于控制直流電機(jī),后者用于控制步進(jìn)電機(jī)。
(3)了解直流電機(jī)和步進(jìn)電機(jī)的工作原理,學(xué)會(huì)用軟件的方法實(shí)現(xiàn)步進(jìn)電機(jī)的脈沖分配,即用軟件的方法代替硬件的脈沖分配器。
(4)掌握帶有PWM 和I/O 的CPU 編程實(shí)現(xiàn)其相應(yīng)功能的主要方法。實(shí)驗(yàn)環(huán)境
(1)ADS1.2開(kāi)發(fā)環(huán)境(2)PC(3)串口線 實(shí)驗(yàn)內(nèi)容及要求
學(xué)習(xí)步進(jìn)電機(jī)和直流電機(jī)的工作原理,了解實(shí)現(xiàn)兩個(gè)電機(jī)轉(zhuǎn)動(dòng)對(duì)于系統(tǒng)的軟件和硬件要求。學(xué)習(xí)ARM知識(shí),掌握PWM 的生成方法,同時(shí)也要掌握I/O 的控制方法。
(1)編程實(shí)現(xiàn)ARM芯片的一對(duì)PWM 輸出用于控制直流電機(jī)的轉(zhuǎn)動(dòng),通過(guò)A/D 旋鈕控制其正反轉(zhuǎn)及轉(zhuǎn)速
(2)編程實(shí)現(xiàn)ARM的四路I/O 通道實(shí)現(xiàn)環(huán)形脈沖分配用于控制步進(jìn)電機(jī)的轉(zhuǎn)動(dòng),通過(guò)A/D 旋鈕轉(zhuǎn)角控制步進(jìn)電機(jī)的轉(zhuǎn)角。
(3)通過(guò)超級(jí)終端來(lái)控制直流電機(jī)與步進(jìn)電機(jī)的切換。實(shí)驗(yàn)設(shè)計(jì)與實(shí)驗(yàn)步驟
(1)新建工程,將“電機(jī)轉(zhuǎn)動(dòng)控制實(shí)驗(yàn)”中的文件添加到工程(2)編寫(xiě)直流電機(jī)初始化數(shù)(MotorCtrl.c)(3)控制直流電機(jī)與步進(jìn)電機(jī) 實(shí)驗(yàn)過(guò)程與分析
(1)通過(guò)把從串口中得到控制信息的代碼修改成從zlg7289芯片中讀取小鍵盤(pán)信息,從而利用試驗(yàn)臺(tái)的小鍵盤(pán)來(lái)控制步進(jìn)電機(jī)和直流電機(jī)的切換
(2)A/D轉(zhuǎn)換可以把電信號(hào)轉(zhuǎn)換成數(shù)字信號(hào)來(lái)控制電機(jī)的轉(zhuǎn)速。for(;;)
{ loop:
//if((rUTRSTAT0 & 0x1))//有輸入,則返回
if(rPDATG&ZLG7289_KEY)//17鍵小鍵盤(pán)控制電機(jī)
{
*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旋鈕轉(zhuǎn)過(guò)的角度,360/512為步距角,//由于接了1/8減速器,兩者之商再乘以8為步進(jìn)電機(jī)相應(yīng)轉(zhuǎn)過(guò)的角度
if(count>=0)
{//轉(zhuǎn)角大于零
for(j=0;j { for(i=0;i<=7;i++) { SETEXIOBITMASK(stepdata[i], 0xf0); Delay(200); } } } lastADData=ADData; } } 實(shí)驗(yàn)結(jié)果總結(jié) 利用A/D轉(zhuǎn)換器實(shí)現(xiàn)了對(duì)直流電機(jī)和步進(jìn)電機(jī)的控制,利用實(shí)驗(yàn)設(shè)備上自帶的小鍵盤(pán)實(shí)現(xiàn)了A/D轉(zhuǎn)換器對(duì)兩個(gè)電機(jī)控制的切換。心得體會(huì) 通過(guò)本次實(shí)驗(yàn),熟悉了ARM自帶的六路(三對(duì))PWM,并對(duì)直流電機(jī)和步進(jìn)電機(jī)的工作原理有了進(jìn)一步的了解。 南昌航空大學(xué)實(shí)驗(yàn)報(bào)告 二0一一 年 10月 16日 課程名稱(chēng): 嵌入式系統(tǒng) 實(shí)驗(yàn)名稱(chēng): 串行端口程序設(shè)計(jì) 班 級(jí): 080611 學(xué)生姓名: 曹啟斌 學(xué)號(hào): 08061107 指導(dǎo)教師評(píng)定: 簽名: 一、實(shí)驗(yàn)?zāi)康?了解在linux環(huán)境下串行程序設(shè)計(jì)的基本方法。掌握終端的主要屬性及設(shè)置方法,熟悉終端IO函數(shù)的使用。3 學(xué)習(xí)使用多線程來(lái)完成串口的收發(fā)處理。 二、實(shí)驗(yàn)內(nèi)容 讀懂程序源代碼,學(xué)習(xí)終端IO函數(shù)tcgetattr(), tcsetattr(),tcflush()的使用方法,學(xué)習(xí)將多線程編程應(yīng)用到串口的接收和發(fā)送程序設(shè)計(jì)中。 三、預(yù)備知識(shí) 1、有C語(yǔ)言基礎(chǔ)。 2、掌握在LINUX下常用編輯器的使用。 3、掌握Makefile 的編寫(xiě)和使用。 4、掌握Linux下的程序編譯與交叉編譯過(guò)程 四、實(shí)驗(yàn)設(shè)備及工具 硬件:UP-NETARM2410-S嵌入式實(shí)驗(yàn)儀,PC機(jī)pentumn500以上, 硬盤(pán)40G以上,內(nèi)存大于128M。 軟件:PC機(jī)操作系統(tǒng)REDHAT LINUX 9.0 +MINICOM + AMRLINUX開(kāi)發(fā)環(huán)境 五、實(shí)驗(yàn)原理 Linux 操作系統(tǒng)從一開(kāi)始就對(duì)串行口提供了很好的支持,為進(jìn)行串行通訊提供了大量的函數(shù),我們的實(shí)驗(yàn)主要是為掌握在LINUX中進(jìn)行串行通訊編程的基本方法。 1.程序流程圖 程序流程圖如圖2-3所示: 圖2-3 程序流程圖 2串口操作需要的頭文件 #include /*線程庫(kù)定義*/ 3打開(kāi)串口 在 Linux 下串口文件是位于 /dev 下,串口一為/dev/ttyS0,串口二為 /dev/ttyS1,打開(kāi)串口是通過(guò)使用標(biāo)準(zhǔn)的文件打開(kāi)函數(shù)操作: int fd;/*以讀寫(xiě)方式打開(kāi)串口*/ fd = open(“/dev/ttyS0”, O_RDWR);if(-1 == fd){ perror(“ 提示錯(cuò)誤!”);} 4設(shè)置串口 最基本的設(shè)置串口包括波特率設(shè)置,效驗(yàn)位和停止位設(shè)置。串口的設(shè)置主要是設(shè)置 struct termios 結(jié)構(gòu)體的各成員值。 struct termio { unsigned short c_iflag;/* 輸入模式標(biāo)志 */ unsigned short c_oflag;/* 輸出模式標(biāo)志 */ unsigned short c_cflag;/* 控制模式標(biāo)志 */ unsigned short c_lflag;/* local mode flags */ unsigned char c_line;/* line discipline */ unsigned char c_cc[NCC];/* control characters */ };設(shè)置這個(gè)結(jié)構(gòu)體很復(fù)雜,可以參考man手冊(cè)或者由趙克佳、沈志宇編寫(xiě)的《UNIX程序編寫(xiě)教程》,我這里就只考慮常見(jiàn)的一些設(shè)置: 波特率設(shè)置: 下面是修改波特率的代碼: struct termios Opt;tcgetattr(fd, &Opt);cfsetispeed(&Opt,B19200);/*設(shè)置為19200Bps*/ cfsetospeed(&Opt,B19200);tcsetattr(fd,TCANOW,&Opt);校驗(yàn)位和停止位的設(shè)置: 無(wú)效驗(yàn) 8位 Option.c_cflag &= ~PARENB;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= ~CSIZE;Option.c_cflag |= ~CS8;奇效驗(yàn)(Odd)7位 Option.c_cflag |= ~PARENB;Option.c_cflag &= ~PARODD;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= ~CSIZE;Option.c_cflag |= ~CS7;偶效驗(yàn)(Even)7位 Option.c_cflag &= ~PARENB;Option.c_cflag |= ~PARODD;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= ~CSIZE;Option.c_cflag |= ~CS7;Space效驗(yàn) 7位 Option.c_cflag &= ~PARENB;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= &~CSIZE;Option.c_cflag |= CS8;設(shè)置停止位: 1位: options.c_cflag &= ~CSTOPB;2位: options.c_cflag |= CSTOPB;需要注意的是,如果不是開(kāi)發(fā)終端之類(lèi)的,只是串口傳輸數(shù)據(jù),而不需要串口來(lái)處理,那么使用原始模式(Raw Mode)方式來(lái)通訊,設(shè)置方式如下: options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);/*Input*/ options.c_oflag &= ~OPOST;/*Output*/ 5讀寫(xiě)串口 設(shè)置好串口之后,讀寫(xiě)串口就很容易了,把串口當(dāng)作文件讀寫(xiě)就可以了。發(fā)送數(shù)據(jù): char buffer[1024];int Length=1024;int nByte;nByte = write(fd, buffer ,Length)讀取串口數(shù)據(jù): 使用文件操作read函數(shù)讀取,如果設(shè)置為原始模式(Raw Mode)傳輸數(shù)據(jù),那么read函數(shù)返回的字符數(shù)是實(shí)際串口收到的字符數(shù)。 可以使用操作文件的函數(shù)來(lái)實(shí)現(xiàn)異步讀取,如fcntl,或者select等來(lái)操作。char buff[1024];int Len=1024;int readByte = read(fd, buff, Len);6關(guān)閉串口 關(guān)閉串口就是關(guān)閉文件。close(fd);7空MODEM通訊連接電纜 一般進(jìn)行串口調(diào)試使用空MODEM連接電纜,其接線方式如下圖2-4所示: 圖2-4 實(shí)用RS-232C通訊連線 六、實(shí)驗(yàn)步驟 1.2.3.4.進(jìn)入expbasic
第四篇:嵌入式實(shí)驗(yàn)2