版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第七章ARM接口程序設(shè)計(jì)7.1LED顯示控制7.2K9F1208訪問技術(shù)7.3串口通信本章小結(jié)7.1LED顯示控制
參考本書2.5.2小節(jié)的分析,兩個(gè)LED數(shù)碼管的控制地址為0x08000110和0x08000112。借助于看門狗定時(shí)器或定時(shí)計(jì)數(shù)器可實(shí)現(xiàn)簡(jiǎn)單的計(jì)數(shù)秒表。由于只有兩位數(shù)碼管,秒表計(jì)到99秒后,從0開始重新計(jì)數(shù)。
7.1.1看門狗定時(shí)器秒表
在工程ex6_12的基礎(chǔ)上,新建工程ex7_1。工程ex7_1的工作界面如圖7-1所示。圖7-1工程ex7_1的工作界面由圖7-1可知,工程ex7_1包括的文件與工程ex6_12中的相同,即S3C2410A.s、leflash.c和cvectaddr.c。在工程ex6_12的同名文件的基礎(chǔ)上,只需修改文件cvectaddr.c的內(nèi)容,添加七段數(shù)碼管顯示操作即可。文件cvectaddr.c的內(nèi)容如下:
1#defineLED1_MASK0x20
2#defineLED2_MASK0x40
3#defineLED3_MASK0x80
4
5#defineGPCDAT_ADDR(*(volatileunsignedint*)
0x56000024)
6
7#defineSRCPND (*(volatileunsignedint*)
0x4A000000)
8#defineINTMOD
(*(volatileunsignedint*)
0x4A000004)
9#defineINTMSK(*(volatileunsignedint*)
0x4A000008)
10#definePRIORITY (*(volatileunsignedint*)
0x4A00000C)
11#defineINTPND (*(volatileunsignedint*)
0x4A000010)
12#defineINTOFFSET (*(volatileunsignedint*)
0x4A000014)
13
14//SEG7LEDAddress
15#defineSeg7A(*(volatileunsignedchar*)0x08000110)
16#defineSeg7B(*(volatileunsignedchar*)0x08000112)
17
18#defineU8unsignedchar
19
20U8seg7val[16]=
21{
22
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
23//0123456789ABCDEF
24};
25
26//enablewatchdogtimerintterupt
27voidopenDog(void)
28{
29 INTMOD=0x0; //setasIRQ
30 INTMSK&=~(0x200); //openDog
31 PRIORITY=0x7F;
32}
33intnumber=0;
34intnLED=0;
35intnCnt=0;
36__irqvoidc_Wdt_ISR()
37{
38
39 intiReg=0;
40 if(SRCPND|0x200)
41 SRCPND=0x200;
42 if(INTPND|0x200)
43 INTPND=0x200;
44 //INTMSK|=0xFFFFFFFF;//closeall,includeDog
45 nLED=0;
46 switch(number)
47 {
48 case0: //SWInumber0code
49 nLED^=(LED2_MASK|LED3_MASK);
//LED1light
50 break;
51 case1:
52 nLED^=(LED1_MASK|LED3_MASK);
//LED2light
53 break;
54 case2:
55 nLED^=(LED1_MASK|LED2_MASK);
//LED3light
56 break;
57 }
58 number++;
59 if(number>2)
60 number=0;
61 GPCDAT_ADDR=nLED; //Ledshineinturn
62
63 //Seg7LEDcountseachsecond
64 if(nCnt>=100)
65 nCnt=0;
66 Seg7A=seg7val[nCnt/10];
67 Seg7B=seg7val[nCnt%10];
68 nCnt++;
69
70 //openIRQ
71 __asm
72 {
73 MRSiReg,CPSR
74 BICiReg,iReg,#0x80
75 MSRCPSR_c,iReg
76 }
77//INTMSK&=~(0x200);//openDog
78}
編譯連接,下載并運(yùn)行工程ex7_1,可以看到七段數(shù)碼管按秒從00計(jì)數(shù)到99,然后循環(huán)計(jì)數(shù)。7.1.2定時(shí)器1秒表
由于看門狗定時(shí)器主要用于系統(tǒng)程序運(yùn)作監(jiān)控,在程序正常運(yùn)行過程中,有必要的“喂狗”操作,當(dāng)程序運(yùn)行不正常時(shí),看門狗將會(huì)減計(jì)數(shù)到0,從而強(qiáng)制系統(tǒng)復(fù)位。因此,常用的秒表控制不占用看門狗定時(shí)器,而是由定時(shí)計(jì)數(shù)器實(shí)現(xiàn)的。
S3C2410A具有5個(gè)16位的定時(shí)器,其中定時(shí)器0~3具有PWM波發(fā)生功能,即可以輸出PWM波,定時(shí)器4沒有外部輸出。定時(shí)器工作頻率為PCLK/(預(yù)分頻值+1)/分頻值,在下面的工程ex7_2中,將使用定時(shí)器1,并設(shè)置其工作頻率為20?kHz,即為48?MHz/(149+1)/16=20?kHz。定時(shí)器1的使用方法如下:
首先,設(shè)置TCFG0(定時(shí)器配置寄存器0,地址為0x51000000)的值為0x95,即定時(shí)器1的預(yù)分頻值為0x95,
十進(jìn)制數(shù)為149。注意:定時(shí)器0和1共用同一個(gè)預(yù)分頻值。
然后,設(shè)置TCFG1(定時(shí)器配置寄存器1,地址為0x51000004)的值為0x30,即定時(shí)器1的分頻值為16。
其次,設(shè)置TCNTB1(定時(shí)器1計(jì)數(shù)寄存器,地址為0x51000018)和TCMPB1(定時(shí)器1比較寄存器,地址為0x5100001C)的值為0x4E20和0x4000。這里沒有用到TCMPB1,當(dāng)TCNTB1減計(jì)數(shù)到0后,將觸發(fā)定時(shí)器1中斷。再次,設(shè)置TCON(定時(shí)器控制寄存器,地址為0x51000008)的值為0xA00,即刷新TCNB1和TCMPB1的值。
最后,設(shè)置TCON的值為0x900,啟動(dòng)定時(shí)器1。
從第五章的表5-7中可以查到,定時(shí)器1中斷的偏移號(hào)為11。
在工程ex7_1的基礎(chǔ)上,新建工程ex7_2,其工作界面如圖7-2所示。圖7-2工程ex7_2的工作界面工程ex7_2包括三個(gè)文件:S3C2410A.s、ledflash.c和cvectaddr.c。其中,文件S3C2410A.s與工程ex7_1中的相同;文件ledflash.c的源代碼如下:
1externvoidopenTimer1(void);
2
3externvoidc_Timer1_ISR(void);
4
5voidinitTimer1(void);
6
7intmain()
8{
9//0x010FFF20+11*4istheaddressofTimer1jumper
10*(volatileunsignedint*)
(0x010FFF20+4*11)=(unsigned)c_Timer1_ISR;
11 //initializeTimer1
12 initTimer1();
13 //EnableTimer1Interrupter
14 openTimer1();
15 while(1)
16 {
17
18 }
19}文件cvectaddr.c的源代碼如下:
1#defineLED1_MASK0x20
2#defineLED2_MASK0x40
3#defineLED3_MASK0x80
4
5#defineGPCDAT_ADDR(*(volatileunsignedint*)
0x56000024)
6
7#defineSRCPND
(*(volatileunsignedint*)
0x4A000000)
8#defineINTMOD (*(volatileunsignedint*)
0x4A000004)
9#defineINTMSK
(*(volatileunsignedint*)
0x4A000008)
10#definePRIORITY (*(volatileunsignedint*)
0x4A00000C)
11#defineINTPND (*(volatileunsignedint*)
0x4A000010)
12#defineINTOFFSET (*(volatileunsignedint*)
0x4A000014)
13
14//SEG7LEDAddress
15#defineSeg7A (*(volatileunsignedchar*)
0x08000110)
16#defineSeg7B (*(volatileunsignedchar*)
0x08000112)
17
18//Timer1registerrelatedAddress
19#defineTCFG0 (*(volatileunsignedint*)
0x51000000)
20#defineTCFG1 (*(volatileunsignedint*)
0x51000004)
21#defineTCON (*(volatileunsignedint*)
0x51000008)
22#defineTCNTB1 (*(volatileunsignedint*)
0x51000018)
23#defineTCMPB1 (*(volatileunsignedint*)
0x5100001C)
24
25#defineU8unsignedchar
26
27U8seg7val[16]=
28{
290xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
30//0123456789ABCDEF
31};
32
33//initializeTimer1
34voidinitTimer1(void)
35{
36TCFG0=0x95;
//prescale=119
37TCFG1=0x30;
//divider=1/16
38TCNTB1=0x4E20-1; //counternumber=0x4E1F
39TCMPB1=0x4000;
40TCON=0xA00; //updateTCNTB1andTCMPB1
41TCON=0x900; //StartTimer1
42}
43
44//enableTimer1intterupt
45voidopenTimer1(void)
46{
47 INTMOD=0x0;
//setasIRQ
48 INTMSK&=~(0x800); //openTimer1
49
PRIORITY=0x7F;
50}
51intnumber=0;
52intnLED=0;
53intnCnt=0;
54__irqvoidc_Timer1_ISR()
55{
56
57intiReg=0;
58if(SRCPND|0x800)//mustchangefrom0x200to0x800
59SRCPND=0x800;
60if(INTPND|0x800)//mustchangefrom0x200to0x800
61 INTPND=0x800;
62//INTMSK|=0xFFFFFFFF;//closeall,includeTimer1
63 nLED=0;
64 switch(number)
65 {
66 case0: //SWInumber0code
67nLED^=(LED2_MASK|LED3_MASK); //LED1light
68 break;
69 case1:
70 nLED^=(LED1_MASK|LED3_MASK);
//LED2light
71 break;
72 case2:
73 nLED^=(LED1_MASK|LED2_MASK);
//LED3light
74 break;
75 }
76 number++;
77 if(number>2)
78 number=0;
79 GPCDAT_ADDR=nLED; //Ledshineinturn
80
81 //Seg7LEDcountseachsecond
82 if(nCnt>=100)
83 nCnt=0;
84 Seg7A=seg7val[nCnt/10];
85 Seg7B=seg7val[nCnt%10];
86 nCnt++;
87
88 //openIRQ
89 __asm
90 {
91 MRSiReg,CPSR
92 BICiReg,iReg,#0x80
93 MSRCPSR_c,iReg
94 }
95//INTMSK&=~(0x800); //openTimer1
96}
工程ex7_2實(shí)現(xiàn)的功能與工程ex7_1完全相同,即實(shí)現(xiàn)按秒從00計(jì)數(shù)到99,繼而循環(huán)計(jì)數(shù)的功能。通過本節(jié)實(shí)例的學(xué)習(xí),讀者應(yīng)掌握了S3C2410A的中斷處理方法。7.2K9F1208訪問技術(shù)
我們?cè)谇懊娴诙碌?.4節(jié)介紹了K9F1208U0C的特性、管腳結(jié)構(gòu)及電路接口原理圖,關(guān)于K9F1208U0C更詳細(xì)的信息請(qǐng)參考K9F1208芯片手冊(cè)。為了便于理解如何訪問K9F1208,本節(jié)將摘錄部分K9F1208芯片資料的內(nèi)容。
7.2.1K9F1208U0C
K9F1208U0C的存儲(chǔ)陣列如圖7-3所示。圖7-3K9F1208U0C存儲(chǔ)陣列由圖7-3可知,一片K9F1208U0C芯片包含4096個(gè)存儲(chǔ)塊,每個(gè)存儲(chǔ)塊分為32個(gè)存儲(chǔ)頁,每個(gè)存儲(chǔ)頁為528字節(jié)。其中,512字節(jié)用于存儲(chǔ)數(shù)據(jù),16字節(jié)用于存儲(chǔ)校驗(yàn)信息。這樣,一片K9F1208U0C的存儲(chǔ)空間大小為4096×32×(512+16)B=
(64+2)MB=66?MB,其中,1?MB=1024?KB,1?KB=1024?B。用戶可用的存儲(chǔ)空間為64?MB,對(duì)其完全尋址,至少需要26根地址線。I/O0~I(xiàn)/O7作為地址輸入時(shí)至少占用4個(gè)周期,每個(gè)周期的地址輸入如圖7-3所示:第一個(gè)周期輸入的A0~A7作為列地址;第2~4周期輸入的A9~A25作為行地址,即頁地址,因此,一片K9F1208U0C有217=128?K個(gè)存儲(chǔ)頁面。每個(gè)512?B的頁面由A8分為上、下兩部分(Read1命令),每部分為256個(gè)字節(jié),可以被8位列地址尋址,即A0~A7尋址。每個(gè)存儲(chǔ)頁最后的16字節(jié)(512~527)使用A0~A3尋址,A4~A7忽略,對(duì)應(yīng)于不同的訪問命令(Read2命令)。現(xiàn)在,有充分理由相信,NAND型FLASH這種“分而治之”的存儲(chǔ)尋址方式比NOR型FLASH的“一統(tǒng)天下”方式在芯片制造上更容易實(shí)現(xiàn)。
K9F1208U0C共有4個(gè)存儲(chǔ)柱面(Plane),它的4096個(gè)存儲(chǔ)塊分布在不同的存儲(chǔ)柱面上,不同的存儲(chǔ)柱面可以同時(shí)讀寫。塊序號(hào)被4整除的存儲(chǔ)塊,例如塊0,4,8,…,4092位于面0上;而塊序號(hào)除以4余1的存儲(chǔ)塊,例如塊1,5,9,…,4093位于面1上;塊2,6,10,…,4094位于面2上;塊3,7,11,…,4095位于面3上。如圖7-4所示,每個(gè)柱面上有528字節(jié)的數(shù)據(jù)寄存器,位于存儲(chǔ)單元陣列和外部I/O口之間,用于緩沖讀寫的數(shù)據(jù)。圖7-4存儲(chǔ)器配置表由附錄一的附表1-1可知,NAND型FLASH操作寄存器位于0x4E000000~0x4E000014。由第二章的圖2-14和圖2-16可知,K9F1208U0C的I/O0~I(xiàn)/O7接S3C2410A的D0~D7,其控制管腳接S3C2410A的NANDFLASH控制器的相應(yīng)管腳。
通過S3C2410A訪問K9F1208的一般步驟為:
(1)初始化S3C2410ANAND型FLASH控制器。
(2)讀K9F1208的芯片ID號(hào)。
(3)整片擦除K9F1208,然后對(duì)K9F1208的存儲(chǔ)塊進(jìn)行有效性檢驗(yàn),對(duì)無效存儲(chǔ)塊進(jìn)行標(biāo)記。
(4)編程K9F1208芯片,并讀取寫入的數(shù)據(jù)進(jìn)行ECC校驗(yàn)。
K9F1208僅支持基于塊的擦除和基于頁的編程,針對(duì)FLASH來說,編程是指向其中寫入數(shù)據(jù)。由于S3C2410A具有硬件ECC校驗(yàn)發(fā)生器,用戶不需要編寫ECC校驗(yàn)碼產(chǎn)生函數(shù)。
下面兩個(gè)小節(jié)將分別介紹K9F1208的讀和編程操作方法。7.2.2K9F1208讀設(shè)計(jì)
K9F1208的讀操作需要初始化S3C2410A的NANDFLASH控制寄存器,方法如下:
//InitNANDControllerReg
voidinitFlash()
{
INTMSK=0xFFFFFFFF;
CLKCON=0x0007FFF0; //bit4
GPACON=0xFFFFFFFF;
NFCONF=(1<<15)|(1<<12)|(0<<11)|(7<<8)|(7<<4)|(7<<0);
while(!(NFSTAT&0x01));
NFCMD=0xFF; //ResetNAND
while(!(NFSTAT&0x01));
}
即關(guān)閉中斷,開啟NANDFLASH控制器時(shí)鐘,啟動(dòng)NANDFLASH控制器管腳,配置NFCONF寄存器,等待K9F1208是否準(zhǔn)備好,向K9F1208寫命令字0xFF復(fù)位FLASH。
初始化NANDFLASH控制器之后,讀取K9F1208的ID號(hào),方法如下:
//ReadflashID
voidreadFlashID()
{
inti;
NFCMD=0x90;
NFADDR=0x0;
for(i=0;i<4;i++)
{
flashID=flashID|(NFDATA<<((3-i)*8));
while(!(NFSTAT&0x01));//Ready?
}
}即寫命令字節(jié)0x90和地址字節(jié)0x0,然后依次讀出4個(gè)字節(jié),即為K9F1208的ID號(hào)。這里K9F1208U0C讀出來的ID號(hào)為:0xEC765A3F。
然后,可以讀取NANDFLASH的內(nèi)容了。一般編寫一個(gè)讀FLASH函數(shù),輸入?yún)⒘繛樽xFLASH的起始地址、讀取的字節(jié)長度和存放讀出內(nèi)容的數(shù)組,代碼如下:
//Readflashcontents
//Here,addr:startaddress;size:Pagesize;buf:data
voidflashRd(unsignedintaddr,unsignedintsize,unsignedchar*buf)
{ inti,n=1;
while(!(NFSTAT&0x01));
NFCMD=0x00|((addr>>8)&0x01);
NFADDR=addr&0xFF;
NFADDR=(addr>>9)&0xFF;
NFADDR=(addr>>17)&0xFF;
NFADDR=(addr>>25)&0x01;
while(!(NFSTAT&0x01));
for(i=0;i<size;i++,n++)
{
*buf++=NFDATA;
if((n%528)==0) //onepagereadover,wait
{
while(!(NFSTAT&0x01));
}
}
while(i%528)//Readtheentirepage
{
NFDATA;
i++;
}
while(!(NFSTAT&0x01));
}上述代碼首先等待FLASH準(zhǔn)備好,然后,寫命令0x00或0x01(當(dāng)輸入地址addr的第8位為1時(shí)),將地址按圖7-4分成4個(gè)字節(jié)從低位至高位依次寫入。由于NANDFLASH的讀按528字節(jié)的頁為單位,因此,如果輸入的讀取長度大于528時(shí),讀完一頁后需要等待FLASH再次準(zhǔn)備好;如果讀取長度不是528的整倍數(shù)時(shí),需要讀完整頁,但是讀出的數(shù)據(jù)不用保存。
在工程ex7_2的基礎(chǔ)上新建工程ex7_3,其工作界面如圖
7-5所示。圖7-5工程ex7_3的工作界面如圖7-5,工程ex7_3包括三個(gè)文件:S3C2410A.s、cvectaddr.s和flashRW.c,其中,S3C2410A.s和cvectaddr.s與工程ex7_2中的同名文件代碼相同;flashRW.c的代碼清單如下:
1//NANDFLASHControllerRegistersAddr.
2#defineNFCONF
(*(volatileunsignedint*)
0x4E000000)
3#defineNFCMD
(*(volatileunsignedint*)
0x4E000004)
4#defineNFADDR (*(volatileunsignedint*)
0x4E000008)
5#defineNFDATA (*(volatileunsignedint*)
0x4E00000C)
6#defineNFSTAT (*(volatileunsignedint*)
0x4E000010)
7#defineNFECC (*(volatileunsignedint*)
0x4E000014)
8
9#defineCLKCON(*(volatileunsignedlong*)
(0x4C00000C))
10
11#defineINTMSK(*(volatileunsignedlong*)
(0x4A000008))
12
13#defineGPACON (*(volatileunsignedlong*)
(0x56000000))
14
15externvoidopenTimer1(void);
16
17externvoidc_Timer1_ISR(void);
18
19voidinitTimer1(void);
20
21//Flashoperator
22voidinitFlash(void);
23voidreadFlashID(void);
24voidflashRd(unsignedintaddr,unsignedintsize,
unsignedchar*buf);
25unsignedintflashID=0;
26unsignedcharflashWhat[3000];
27unsignedcharflashDat[3000];
28
29intmain()
30{
31inti,n=0;
32 //initializeNANDController
33 initFlash();
34 readFlashID();
35 flashRd(0,3000,flashWhat);
36 //Flashdata,except16Bper528
37 for(i=0;i<3000;i++)
38 {
39n=i/528;
40 if((i>=n*528)&&(i<n*528+512))
41 {
42 flashDat[i-n*16]=flashWhat[i];
43 }
44 }
45 //AboveisNandFlashoperator
46
47//0x010FFF20+11*4istheaddressofTimer1jumper
48*(volatileunsignedint*)(0x010FFF20+4*11)
=(unsigned)c_Timer1_ISR;
49 //initializeTimer1
50 initTimer1();
51 //EnableTimer1Interrupter
52 openTimer1();
53
54 while(1)
55 {
56
57 }
58}
59
60//InitNANDControllerReg
61voidinitFlash()
62{
63INTMSK=0xFFFFFFFF;
64CLKCON=0x0007FFF0; //bit4
65GPACON=0xFFFFFFFF;
66
67NFCONF=(1<<15)|(1<<12)|(0<<11)|(7<<8)|
(7<<4)|(7<<0);
68
69while(!(NFSTAT&0x01));
70NFCMD=0xFF; //ResetNAND
71while(!(NFSTAT&0x01));
72
73}
74
75//ReadflashID
76voidreadFlashID()
77{
78 inti;
79 NFCMD=0x90;
80 NFADDR=0x0;
81 for(i=0;i<4;i++)
82 {
83 flashID=flashID|(NFDATA<<((3-i)*8));
84 while(!(NFSTAT&0x01));//Ready?
85 }
86}
87
88//Readflashcontents
89//Here,addr:startaddress;size:Pagesize;buf:data
90voidflashRd(unsignedintaddr,unsignedintsize,
unsignedchar*buf)
91{
92 inti,n=1;
93 while(!(NFSTAT&0x01));
94 NFCMD=0x00|((addr>>8)&0x01);
95 NFADDR=addr&0xFF;
96 NFADDR=(addr>>9)&0xFF;
97 NFADDR=(addr>>17)&0xFF;
98 NFADDR=(addr>>25)&0x01;
99 while(!(NFSTAT&0x01));
100 for(i=0;i<size;i++,n++)
101 {
102 *buf++=NFDATA;
103 if((n%528)==0)//onepagereadover,wait
104 {
105 while(!(NFSTAT&0x01));
106 }
107 }
108 while(i%528)//Readtheentirepage
109 {
110 NFDATA;
111 i++;
112 }
113 while(!(NFSTAT&0x01));
114}
上述代碼的第25~27行定義了變量和數(shù)組,用于存放從K9F1208中讀取的ID號(hào)和長度為3000字節(jié)的內(nèi)容。第33行初始化NANDFLASH控制器,第34行讀取FLASH的ID號(hào)。第35行從FLASH中讀取長度為3000字節(jié)的數(shù)據(jù),第37至44行把讀出的3000字節(jié)長度的數(shù)據(jù)中每528個(gè)字節(jié)去掉最后的16個(gè)字節(jié)。注意:這里讀出的3000個(gè)字節(jié)首地址為0;如果首地址不為0,則需要修改第37~44行的代碼,例如,首地址為5,則循環(huán)內(nèi)第39行和第40中的變量i應(yīng)變?yōu)閕+5。
通過編譯連接,下載并調(diào)試程序可查得,flashWhat的地址為0x01000020,flashDat的地址為0x01000BD8,從Memory中可查看地址0x0、0x01000020和0x01000BD8三個(gè)地址的內(nèi)容,可知,0x0~0xA08和0x01000BD8~0x010015E0的內(nèi)容完全相同(后面的內(nèi)容均為FF);而0x01000020每528個(gè)字節(jié)會(huì)出現(xiàn)16個(gè)字節(jié)的內(nèi)容是多余的(這些字節(jié)讀自NANDFLASH的校驗(yàn)區(qū))。7.2.3K9F1208Boot設(shè)計(jì)
K9F1208Boot設(shè)計(jì)是指將可執(zhí)行代碼文件(Hex文件)通過ULINK2在線下載到K9F1208中,然后,取下ULINK2,系統(tǒng)執(zhí)行K9F1208中的代碼。通過ULINK2下載可執(zhí)行代碼到NANDFLASH中。有兩種方法:其一,為借助MDK的菜單“FLASH|Download”實(shí)現(xiàn),這種方法在前面被多次使用,用于直接下載當(dāng)前工程文件的可執(zhí)行代碼(擴(kuò)展名為.axf的文件);其二,為本節(jié)將介紹的方法,即編寫一個(gè)下載工程,用于將Hex格式的文件寫入到K9F1208中,可以下載任意MDK生成的工程可執(zhí)行代碼文件(以.hex為擴(kuò)展名)。在介紹這個(gè)專用下載工程之前,需要介紹一下MDK生成的Hex文件的格式。
1.Hex文件格式
打開工程ex7_2所在的目錄,可以找到文件ex7_2.hex,用UltraEdit或文本編輯器可以打開該文件,如下:
1:0400000500000000F7
2:020000040000FA
3:100000003CF09FE53CF09FE53CF09FE53CF09FE530
4:100010003CF09FE50000A0E13CF09FE53CF09FE54F
5:1000200004D04DE200032DE9B8919FE5009099E5D9
6:10003000B4819FE5098188E0008098E508808DE51E
7:100040000083BDE8040100006400000068000000B7
8:100050006C00000070000000000000007400000050
9:1000600078000000FEFFFFEAFEFFFFEAFEFFFFEA66
10:10007000FEFFFFEAE9FFFFEAFEFFFFEA101111228F
11:100080000007000000070000000700000007000054
12:10009000000700000007000009800100098001003E
13:1000A0005904AC00B1000000200000002000000056
14:1000B000FFFFFF0003000000118005002380070000
15:1000C00004000000F0FF0700FF030000FF0700002E
16:1000D00000000000AA56AAAA0000000000000000CC
17:1000E0000000000000000000000000001A5900009D
18:1000F000000000000000000000000000FF070000FA
19:10010000000000005304A0E3E0109FE5E0209FE51D
20:10011000082080E5042080E5001080E51303A0E3BB
21:1001200078804FE27E0098E8001080E5142080E59A
22:10013000043080E5084080E5105080E50C6080E5E3
23:10014000CCE04FE2FF1F9EE812E3A0E3FF1F8EE822
24:1001500056E4A0E388004FE2002090E5041090E50B
25:1001600020208EE528108EE50000A0E30312A0E316
26:100170000136A0E30400B0E80400A1E8013043E246
27:10018000000053E3FAFFFFCA0302A0E3100F0DEED5
28:10019000101F1DEE5C009FE5DBF021E300D0A0E125
29:1001A000000040E2D7F021E300D0A0E1000040E2EF
30:1001B000D1F021E300D0A0E1000040E2D2F021E341
31:1001C00000D0A0E1800040E2D3F021E300D0A0E124
32:1001D000080040E210F021E300D0A0E101AB4DE2C5
33:1001E00014009FE510FF2FE11400004A20FF0F01CB
34:1001F0003C7C0000B80B0000080500010002000074
35:10020000000000EBE50000EB2C008FE2000C90E812
36:1002100000A08AE000B08BE001704AE20B005AE1D6
37:100220000000001ADD0000EB0F00BAE818E04FE212
38:10023000010013E303F0471003F0A0E1AC05000058
39:10024000BC050000102052E27800B0287800A128F8
40:10025000FBFFFF8A822EB0E13000B0283000A128D9
41:1002600000409045004081450EF0A0E104309FE53C
42:1002700003308FE003F0A0E1480500000C009FE58B
43:100280000C109FE504209FE508309FE51EFF2FE13D
44:1002900080000001800400018000000114009FE53F
45:1002A00014109FE510402DE94C0F81E5030000EB91
46:1002B000100000EBFEFFFFEA1C03000000F00F013E
47:1002C0009510A0E35104A0E3001080E53010A0E3F6
48:1002D000041080E500119FE5181080E50119A0E3E6
49:1002E0001C1080E50A1CA0E3081080E5091CA0E3AF
50:1002F000081080E51EFF2FE10010A0E34A04A0E3F0
51:10030000041080E5082090E57F10A0E3022BC2E3F3
52:10031000082080E50C1080E51EFF2FE13F502DE9FD
53:100320004A04A0E3001090E5021BA0E3001080E562
54:10033000102090E5101080E5A0409FE50010A0E39C
55:10034000041084E5000094E5000050E3C020A00301
56:100350000500000A010050E3A020A0030200000AEB
57:10036000020050E30100001A6020A0E3042084E5AD
58:10037000010080E2020050E3000084E5001084C523
59:10038000040094E55624A0E3240082E5080094E5E7
60:10039000640050E3081084A5080094E50A10A0E367
61:1003A0000050A0E10F0000EB34209FE50030D2E7C1
62:1003B0000203A0E31031C0E50110D2E71211C0E53D
63:1003C000010085E2080084E500000FE18000C0E341
64:1003D00000F021E13F50BDE804F05EE21F4E000056
65:1003E000000000010C00000101C090E12100004A62
66:1003F0000020A0E3A0C071E01A00003A20C271E022
67:100400000F00003A20C471E00100003A0030A0E380
68:10041000200000EAA0C371E0810340200220A2E096
69:1004200020C371E0010340200220A2E0A0C271E0DD
70:10043000810240200220A2E020C271E0010240209F
71:100440000220A2E0A0C171E0810140200220A2E0D0
72:1004500020C171E0010140200220B2E0A0C071E0A3
73:10046000810040200220A2E0011050E00010A031E5
74:100470000200A2E00EF0A0E1022111E200106142B0
75:10048000403032E00000602220C271E01D00003ADE
76:1004900020C471E00F00003A0113A0E120C471E014
77:1004A0003F2382E30B00003A0113A0E120C471E076
78:1004B0003F2682E30700003A0113A0E120C471E067
79:1004C0003F2982E30113A0213F2C822300C071E267
80:1004D0001D00002A2113A021A0C371E08103402048
81:1004E0000220A2E020C371E0010340200220A2E02C
82:1004F000A0C271E0810240200220A2E020C271E08F
83:10050000010240200220A2E0A0C171E08101402050
84:100510000220A2E020C171E0010140200220B2E0EF
85:10052000EBFFFF2AA0C071E0810040200220A2E082
86:10053000011050E00010A0310200A2E0C33FB0E182
87:1005400000006042001061220EF0A0E1C33FB0E164
88:100550000000604201402DE90000A0E30000A0E19E
89:100560000280BDE80EF0A0E10E40A0E11D0000EB0E
90:1005700004E0A0E10D402DE9320000EB0040B0E1C5
91:100580000D40BDE80210B0E10EF0A0E10020B0E1A6
92:1005900010402DE90000B0E30000A0E11080BDE8AC
93:1005A0000000A0E1EFFFFFEB03002DE9780000EB76
94:1005B0000300BDE8340000EB0F002DE9770000EBED
95:1005C0000F00BDE834FFFFEB2B0000EB01402DE9ED
96:1005D0000000A0E1680000EB0140BDE8000000EB76
97:1005E0000000E0E31B0000EB0E50A0E11F0000EB59
98:1005F00005E0A0E10050B0E10D10A0E10A30A0E15B
99:100600000700C0E300D0A0E160D08DE220402DE9DA
100:1006100019FFFFEB2040BDE80060A0E30070A0E3FD
101:100620000080A0E300B0A0E30710C1E305C0A0E193
102:10063000C009ACE8C009ACE8C009ACE8C009ACE846
103:1006400001D0A0E10EF0A0E104009FE50EF0A0E1D2
104:100650000EF0A0E12C0000010C109FE51800A0E3B3
105:10066000563412EF0EF0A0E1440100002600020013
106:1006700000009FE50EF0A0E11C0000010040A0E199
107:100680000000A0E10400A0E1CFFFFFEBC0432DE993
108:100690003E002DE90040A0E10150A0E14C0000EB3C
109:1006A00000408DE50000A0E304508DE50000A0E1CE
110:1006B00008008DE500008DE2EBFEFFEB0040A0E1BD
111:1006C0000150A0E103009DE80270A0E10360A0E1F9
112:1006D0000000A0E10000A0E10000A0E10010A0E304
113:1006E0000100A0E10000A0E10080A0E12F0000EBEC
114:1006F0000010A0E3008080E50090A0E10100A0E1EF
115:100700000000A0E1011080E2041089E50010A0E3E0
116:100710000100A0E10000A0E10010A0E3080089E5CD
117:100720000100A0E10000A0E10010A0E30C0089E5B9
118:100730000100A0E10000A0E1100089E50000A0E1B7
119:100740000000A0E10000A0E10000A0E10000A0E1A5
120:100750000000A0E10000A0E10000A0E10000A0E195
121:100760000CD08DE20400A0E10510A0E10720A0E17B
122:100770000630A0E1F001BDE80082BDE810402DE99F
123:100780000000A0E30000A0E10000A0E10000A0E163
124:100790001080BDE80000E0E30210E0E30EF0A0E10D
125:1007A00010402DE90000A0E11080BDE80EF0A0E1AE
126:1007B00004009FE50EF0A0E10EF0A0E13C00000176
127:1007C0000EF0A0E104009FE50EF0A0E10EF0A0E124
128:1007D0002000000110402DE9F9FFFFEB0010A0E31D
129:1007E000001080E51080BDE8F8070000000000015F
130:1007F0001C00000044020000000000000000000097
131:1008000000000000C0F9A4B0999282F8809088831B
132:04081000C6A1868E69
133:00000001FF
其中,行號(hào)是作者添加的。每行均以“:”開頭,其結(jié)構(gòu)樣式
如下:
:[AA][BBBB][CC][DD...DD][EE]
例如,對(duì)于第4行“:100010003CF09FE50000A0E13CF09FE53CF09FE54F”,
這里,
AA=10,表示該行有0x10(即16)個(gè)數(shù)據(jù)。
BBBB=0010,表示該行16個(gè)數(shù)據(jù)存入FLASH中的首地址為0x0010。
CC=00,表示該行中DD…DD位置處的數(shù)據(jù)類型,00表示寫入到FLASH中的數(shù)據(jù);如果CC=01,表示Hex文件的結(jié)尾,如第133行;CC=04表示數(shù)據(jù)為32位地址的高16位地址偏置,如第2行;CC=05,表示寫入地址的32位基地址,如第1行。
DD…DD為3CF09FE50000A0E13CF09FE53CF09FE5,為該行中的數(shù)據(jù)。
EE=4F表示該行所有字節(jié)數(shù)據(jù)的加校驗(yàn)和,滿足
0x10+0x00+0x10+0x00+0x3C+…+0xE5+0x4F
=0x00(只保留低8位)從第1行可知,32位基地址為0x00000000,從第2行知,高16位地址基址為0x0000,而第3行的16位地址為0x0000,即第3行的字節(jié)數(shù)據(jù)“3CF09FE53CF09FE53CF09FE53CF09FE5”寫入FLASH的首地址為“基地址+高16位地址:16位地址”,即為0x00000000;如果基地址為0x00000000,高16位地址基址為0x0010,則此處的首地址為0x00100000。因此,第1行16個(gè)數(shù)據(jù)依次寫入FLASH的地址0x0~0xF。同理,第2行數(shù)據(jù)依次寫入地址0x10~0x1F,依次類推。第132行字節(jié)數(shù)據(jù)只有0x04個(gè),即“C6A1868E”,將被寫入FLASH地址0x0810~0x0813。第133行中AA=00且CC=01表示該行為Hex文件的結(jié)尾。根據(jù)上面的介紹,把ex7_2.hex轉(zhuǎn)化為如下的頭文件flash.h,即建立一個(gè)無符號(hào)字符數(shù)組FlashDat存放寫入FLASH中的所有字節(jié)數(shù)據(jù),建立一個(gè)整型常量iDatN存放數(shù)組FlashDat的長度。flash.h代碼如下:
1unsignedcharFlashDat[2068]={
20x3C,0xF0,0x9F,0xE5,0x3C,0xF0,0x9F,0xE5,0x3C,
0xF0,0x9F,0xE5,0x3C,0xF0,0x9F,0xE5,
30x3C,0xF0,0x9F,0xE5,0x00,0x00,0xA0,0xE1,0x3C,
0xF0,0x9F,0xE5,0x3C,0xF0,0x9F,0xE5,
40x04,0xD0,0x4D,0xE2,0x00,0x03,0x2D,0xE9,0xB8,
0x91,0x9F,0xE5,0x00,0x90,0x99,0xE5,
50xB4,0x81,0x9F,0xE5,0x09,0x81,0x88,0xE0,0x00,
0x80,0x98,0xE5,0x08,0x80,0x8D,0xE5,
60x00,0x83,0xBD,0xE8,0x04,0x01,0x00,0x00,0x64,
0x00,0x00,0x00,0x68,0x00,0x00,0x00,
70x6C,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x74,0x00,0x00,0x00,
80x78,0x00,0x00,0x00,0xFE,0xFF,0xFF,0xEA,0xFE,0xFF,
0xFF,0xEA,0xFE,0xFF,0xFF,0xEA,
90xFE,0xFF,0xFF,0xEA,0xE9,0xFF,0xFF,0xEA,0xFE,
0xFF,0xFF,0xEA,0x10,0x11,0x11,0x22,
100x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,
0x07,0x00,0x00,0x00,0x07,0x00,0x00,
110x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x09
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 客運(yùn)站安全協(xié)管員招聘合同
- 濟(jì)南市物業(yè)租賃合同簽訂指南
- 城市橋梁建設(shè)管理協(xié)議
- 科技園區(qū)辦公室租賃合同范本
- 大學(xué)跨境貿(mào)易課程設(shè)計(jì)
- 醫(yī)療園區(qū)用地租賃協(xié)議
- 橋梁排水系統(tǒng)綠化養(yǎng)護(hù)合同
- 滑雪場(chǎng)餐廳租賃合同
- 醫(yī)院消防整改施工合同
- 2024年施工合同:甲方委托乙方進(jìn)行新辦公樓的建設(shè)
- 邏輯思維訓(xùn)練第三章命題
- 加油站設(shè)備及工藝管線安裝工程施工方案
- 升維:不確定時(shí)代的決策博弈
- 2023北京通州區(qū)初二上期末考生物試卷及答案
- 漁光互補(bǔ)光伏發(fā)電項(xiàng)目選址方案
- 《西式面點(diǎn)實(shí)訓(xùn)》課程標(biāo)準(zhǔn)
- 《旅游職業(yè)禮儀與交往》課程標(biāo)準(zhǔn)
- 咖啡學(xué)概論智慧樹知到答案章節(jié)測(cè)試2023年華南理工大學(xué)
- 造價(jià)咨詢公司組織機(jī)構(gòu)及人員崗位職責(zé)
- 《牛頓運(yùn)動(dòng)定律的應(yīng)用》說課課件
- 仁愛英語九年級(jí)上作文范文
評(píng)論
0/150
提交評(píng)論