《ARM原理與C程序設(shè)計(jì)》課件第七章_第1頁
《ARM原理與C程序設(shè)計(jì)》課件第七章_第2頁
《ARM原理與C程序設(shè)計(jì)》課件第七章_第3頁
《ARM原理與C程序設(shè)計(jì)》課件第七章_第4頁
《ARM原理與C程序設(shè)計(jì)》課件第七章_第5頁
已閱讀5頁,還剩168頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論