版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第五章匯編語(yǔ)言程序設(shè)計(jì)及
系統(tǒng)初分別化5.1ARM匯編語(yǔ)言程序框架5.2浮點(diǎn)數(shù)據(jù)處理5.3系統(tǒng)初始化5.4中斷服務(wù)程序本章小結(jié)5.1ARM匯編語(yǔ)言程序框架
在MDK環(huán)境下,新建一個(gè)工程ex5_1,拷貝工程ex4_3中的文件S3C2410A.s和initmemcon.s,然后,編寫(xiě)一個(gè)新的匯編語(yǔ)言程序ledflash.s,其代碼如下:
1 AREALEDLIGHT,CODE,READONLY
2 EXPORT__main;LedFlash
3 EXPORT__use_two_region_memory
4GPCDAT_ADDR EQU0x56000024
5LED_ON EQU0x0000
6LED_OFF EQU0x00E0
7 ENTRY
8;LedFlash
9__main
10 LDR R0,=GPCDAT_ADDR
11 MOV R1,#LED_ON
12 STR R1,[R0] ;LEDON
13
14 BL Delay
15
16 MOV R1,#LED_OFF
17 STR R1,[R0];LEDOFF
18
19 BL Delay
20
21 B __main
22Delay
23 MOV R3,#0x0F0000
24 MOV R4,#0x0F0000
25subcycle1
26 SUB R3,R3,#1
27subcycle2
28
SUB R4,R4,#1
29 CMP R4,#0
30 BGE subcycle2
31
32 CMP R3,#0
33 BGE subcycle1
34 BX LR
35
36__use_two_region_memory;nowarning
37 END
將ledflash.s添加到工程ex5_1中,當(dāng)前工作主窗口如圖5-1所示。先不要編譯連接這個(gè)工程文件,在5.1.2小節(jié)時(shí)才能正確地編譯連接并執(zhí)行該工程。圖5-1工程ex5_1工作界面5.1.1通用輸入輸出C口配置
在圖5-1中,雙擊S3C2410A.s打開(kāi)它,保持其他設(shè)置不變(相對(duì)于工程ex4_3)的情況下,對(duì)I/OConfiguration進(jìn)行配置,如圖5-2所示。
圖5-2中將PC5、PC6和PC7配置為輸出特性(Output),對(duì)應(yīng)于S3C2410A.s的第0606~0608行代碼如下:
PIOC_SETUP EQU1
PCONC_Val EQU0xAAAA56AA
PUPC_Val EQU0x00000000圖5-2通用I/O口配置
PIOC_SETUP為1表示圖5-2中的PortC被勾選;當(dāng)設(shè)置PC0~PC15如圖5-2時(shí),端口C的控制寄存器的值為0xAAAA56AA;端口C所有上拉電阻都是使能的,端口C上拉控制寄存器的值為0x00000000。
圖5-2中的I/OConfiguration勾選,對(duì)應(yīng)于S3C2410A.s中的第0510行代碼如下:
PIO_SETUP EQU1
如圖5-2設(shè)置好之后,下面羅列出啟動(dòng)代碼文件S3C2410A.s中與通用I/O口配置相關(guān)的代碼,如表5-1所示。表5-1S3C2410A.s中與I/O口配置相關(guān)的代碼序號(hào)行號(hào)注釋或語(yǔ)句10488;I/OPortsdefinitions20489PIO_BASEEQU0x56000000;PIOBaseAddress30490PCONA_OFSEQU0x00;PCONAOffset40491PCONB_OFSEQU0x10;PCONBOffset50492PCONC_OFSEQU0x20;PCONCOffset60493PCOND_OFSEQU0x30;PCONDOffset70494PCONE_OFSEQU0x40;PCONEOffset80495PCONF_OFSEQU0x50;PCONFOffset90496PCONG_OFSEQU0x60;PCONGOffset100497PCONH_OFSEQU0x70;PCONHOffset110498PCONJ_OFSEQU0xD0;PCONJOffset120499PUPB_OFSEQU0x18;PUPBOffset130500PUPC_OFSEQU0x28;PUPCOffset140501PUPD_OFSEQU0x38;PUPDOffset150502PUPE_OFSEQU0x48;PUPEOffset160503PUPF_OFSEQU0x58;PUPFOffset170504PUPG_OFSEQU0x68;PUPGOffset180505PUPH_OFSEQU0x78;PUPHOffset190506PUPJ_OFSEQU0xD8;PUPJOffset200509;//<e>I/OConfiguration210510PIO_SETUPEQU1220512~0536A口注釋230537PIOA_SETUPEQU0240538PCONA_ValEQU0x000003FF250540~0565B口注釋260566PIOB_SETUPEQU0270567PCONB_ValEQU0x000007FF280568PUPB_ValEQU0x00000000290570~0605C口注釋300606PIOC_SETUPEQU1310607PCONC_ValEQU0xAAAA56AA320608PUPC_ValEQU0x00000000330610~0645D口注釋340646PIOD_SETUPEQU0350647PCOND_ValEQU0x00000000360648PUPD_ValEQU0x00000000370650~0685E口注釋380686PIOE_SETUPEQU0390687PCONE_ValEQU0x00000000序號(hào)行號(hào)注釋或語(yǔ)句400688PUPE_ValEQU0x00000000410690~0709F口注釋420710PIOF_SETUPEQU0430711PCONF_ValEQU0x0000511A440712PUPF_ValEQU0x00000000450714~0749G口注釋460750PIOG_SETUPEQU0470751PCONG_ValEQU0x00000000480752PUPG_ValEQU0x00000000490754~0779H口注釋500780PIOH_SETUPEQU0510781PCONH_ValEQU0x000007FF520782PUPH_ValEQU0x00000000530922;I/OConfiguration540923IFPIO_SETUP<>0550924PIOA_CFG560925DCDPCONA_Val570926PIOB_CFGDCDPCONB_Val580927DCDPUPB_Val590928PIOC_CFGDCDPCONC_Val600929DCDPUPC_Val610930PIOD_CFGDCDPCOND_Val620931DCDPUPD_Val630932PIOE_CFGDCDPCONE_Val640933DCDPUPE_Val650934PIOF_CFGDCDPCONF_Val660935DCDPUPF_Val670936PIOG_CFGDCDPCONG_Val680937DCDPUPG_Val690938PIOH_CFGDCDPCONH_Val700939DCDPUPH_Val710940ENDIF720981~1038S3C2410A.s有誤,將在下面說(shuō)明。
S3C2410A.s中的第0981~1038行原始代碼如下:
IF
PIO_SETUP<>0
LDRR14,=PIO_BASE
IFPIOA_SETUP<>0
ADR R0,PIOA_CFG
STR R0,[R14,#PCONA_OFS]
ENDIF
IF PIOB_SETUP<>0
ADRR0,PIOB_CFG
LDR R1,[R0,#4]
STR R0,[R14,#PCONB_OFS]
STR R1,[R14,#PUPB_OFS]
ENDIF
IF PIOC_SETUP<>0
ADR R0,PIOC_CFG
LDR R1,[R0,#4]
STR R0,[R14,#PCONC_OFS]
STR R1,[R14,#PUPC_OFS]
ENDIF
IF PIOD_SETUP<>0
ADR R0,PIOD_CFG
LDR R1,[R0,#4]
STR R0,[R14,#PCOND_OFS]
STR R1,[R14,#PUPD_OFS]
ENDIF
IF
PIOE_SETUP<>0
ADR R0,PIOE_CFG
LDR R1,[R0,#4]
STR R0,[R14,#PCONE_OFS]
STR R1,[R14,#PUPE_OFS]
ENDIF
IF PIOF_SETUP<>0
ADR R0,PIOF_CFG
LDR R1,[R0,#4]
STR R0,[R14,#PCONF_OFS]
STR R1,[R14,#PUPF_OFS]
ENDIF
IF PIOG_SETUP<>0
ADR R0,PIOG_CFG
LDR R1,[R0,#4]
STR R0,[R14,#PCONG_OFS]
STR R1,[R14,#PUPG_OFS]
ENDIF
IF PIOH_SETUP<>0
ADR R0,PIOH_CFG
LDR R1,[R0,#4]
STR R0,[R14,#PCONH_OFS]
STR R1,[R14,#PUPH_OFS]
ENDIF
ENDIF
修正后的代碼如下,其中,添加了注釋的為補(bǔ)充和修正的代碼行:
IF
PIO_SETUP<>0
LDRR14,=PIO_BASE
IFPIOA_SETUP<>0
ADR R0,PIOA_CFG
LDR R2,[R0];AddedbyZY
STR R2,[R14,#PCONA_OFS];ChangedbyZY
ENDIF
IFPIOB_SETUP<>0
ADR R0,PIOB_CFG
LDRR2,[R0];AddedbyZY
LDRR1,[R0,#4]
STR R2,[R14,#PCONB_OFS];ChangedbyZY
STR R1,[R14,#PUPB_OFS]
ENDIF
IFPIOC_SETUP<>0
ADR R0,PIOC_CFG
LDR R2,[R0];AddedbyZY
LDR R1,[R0,#4]
STR R2,[R14,#PCONC_OFS]
;R0,[R14,#PCONC_OFS]ChangedbyZY
STR R1,[R14,#PUPC_OFS]
ENDIF
IFPIOD_SETUP<>0
ADR R0,PIOD_CFG
LDR R2,[R0]
;AddedbyZY
LDR R1,[R0,#4]
STR R2,[R14,#PCOND_OFS]
;ChangedbyZY
STR R1,[R14,#PUPD_OFS]
ENDIF
IFPIOE_SETUP<>0
ADR R0,PIOE_CFG`
LDR R2,[R0];AddedbyZY
LDR R1,[R0,#4]
STR R2,[R14,#PCONE_OFS]
;
ChangedbyZY
STR R1,[R14,#PUPE_OFS]
ENDIF
IFPIOF_SETUP<>0
ADR R0,PIOF_CFG
LDR
R2,[R0];AddedbyZY
LDR R1,[R0,#4]
STR R2,[R14,#PCONF_OFS]
;ChangedbyZY
STR R1,[R14,#PUPF_OFS]
ENDIF
IFPIOG_SETUP<>0
ADR R0,PIOG_CFG
LDR R2,[R0];AddedbyZY
LDR R1,[R0,#4]
STR R2,[R14,#PCONG_OFS];ChangedbyZY
STR R1,[R14,#PUPG_OFS]
ENDIF
IFPIOH_SETUP<>0
ADR R0,PIOH_CFG
LDR R2,[R0] ;AddedbyZY
LDR R1,[R0,#4]
STR R2,[R14,#PCONH_OFS];ChangedbyZY
STR R1,[R14,#PUPH_OFS]
ENDIF
ENDIF
MDK軟件雖然是個(gè)極其優(yōu)秀的軟件包,但是,此處的錯(cuò)誤是很明顯的,由于具有8個(gè)IO口,相同的錯(cuò)誤連續(xù)出現(xiàn)了8次以上。例如對(duì)于C口,代碼如下:
IF PIOC_SETUP<>0
ADR R0,PIOC_CFG
LDR R1,[R0,#4]
STR R0,[R14,#PCONC_OFS]
STR R1,[R14,#PUPC_OFS]
ENDIF結(jié)合第二章,可知條件滿(mǎn)足,執(zhí)行完ADR指令后,R0裝入的是PIOC_CFG的標(biāo)號(hào),即一個(gè)地址,這個(gè)地址內(nèi)的值為配置字,但是這個(gè)地址本身不能作為配置字,所以,后面的“STRR0,[R14,#PCONC_OFS]”語(yǔ)句就是完全錯(cuò)誤的了。改正的方法很簡(jiǎn)單,代碼如下:
IF PIOC_SETUP<>0
ADR R0,PIOC_CFG
LDR R2,[R0] ;AddedbyZY
LDR R1,[R0,#4]
STR R2,[R14,#PCONC_OFS]
;R0,[R14,#PCONC_OFS]ChangedbyZY
STR R1,[R14,#PUPC_OFS]
ENDIF像上述代碼一樣,將R0值指向的地址處的值賦給R2,然后,再使用“STRR2,[R14,#PCONC_OFS]”就可以了。對(duì)于一個(gè)商業(yè)軟件,其評(píng)估版的S3C2410芯片啟動(dòng)代碼出現(xiàn)問(wèn)題,一方面說(shuō)明了這部分代碼沒(méi)有經(jīng)過(guò)嚴(yán)格測(cè)試,另一方面也警告我們,匯編語(yǔ)言編程相對(duì)于C語(yǔ)言來(lái)說(shuō),確有一些劣勢(shì)。
下面解釋一下表5.1和啟動(dòng)代碼中關(guān)于IO口配置的方法。
序號(hào)2~19:定義了IO口存儲(chǔ)器映射寄存器的基地址0x56000000,然后定義了A~H口的偏移地址,這些IO口寄存器的地址可參考附表1-1。例如,C口的控制寄存器地址為0x56000020,相當(dāng)于基址0x56000000+偏移地址PCONC_OFS(0x20)。這里沒(méi)有J口,可以刪除。序號(hào)21:當(dāng)勾選了圖5-2中I/OConfiguration后,此處,PIO_SETUP為1;否則,不勾選時(shí),PIO_SETUP為0,將不初始化IO口。
序號(hào)23~24:由于圖5-2中沒(méi)有勾選PortA,則PIOA_SETUP為0,A口只有控制寄存器,沒(méi)有上拉寄存器,這里只有PCONA_Val,當(dāng)然,這個(gè)值由于PIOA_SETUP為0而不會(huì)被用到。
序號(hào)26~28:由于圖5-2中沒(méi)有勾選PortB,則PIOB_SETUP為0;符號(hào)PCONB_Val和PUPB_Val的值表示B口的控制寄存器和上拉寄存器的配置字,這些值隨著圖形配置向?qū)Ф詣?dòng)變化。序號(hào)30~32:由于圖5-2中勾選了PortC,則PIOC_SETUP為1;同時(shí),根據(jù)圖形配置向?qū)ё詣?dòng)設(shè)置了控制寄存器和上拉寄存器的值PCONC_Val和PUPC_Val,這兩個(gè)值代表的含義請(qǐng)參考圖5-2和“S3C2410AUser’sManual”第九章第10頁(yè),把GPC[7:5]設(shè)為輸出口。
序號(hào)34~52:介紹端口D~H,與上述含義相近,不再
重述。
序號(hào)54~71:如果PIO_SETUP不為0,則開(kāi)辟存儲(chǔ)空間存放端口A(yíng)~H的配置字,其中,A口只有一個(gè)配置字,B~H口均有兩個(gè)配置字。5.1.2工程ex5_1的注解及運(yùn)行情況
在前面5.1.1小節(jié)對(duì)S3C2410A.s進(jìn)行修正之后,可以編譯連接并下載這個(gè)工程了,在編譯時(shí)會(huì)報(bào)告一條警告信息,即“ex5_1.sct(8):warning:L6314W:Nosectionmatchespattern*(InRoot$$Sections)”,這里的ex5_1.sct是根據(jù)工程選項(xiàng)(像圖4-15那樣)的設(shè)置編譯工程時(shí)自動(dòng)產(chǎn)生的存儲(chǔ)器配置文件,也稱(chēng)Scatter文件,以?.sct結(jié)尾;“InRoot$$Section”是指為連接庫(kù)里的段分配的空間,用于C語(yǔ)言程序設(shè)計(jì)中。
雙擊該警告信息,則彈出ex5_1.sct文件內(nèi)容,如圖5-3所示,在“*(InRoot$$Sections)”前面加上“;”號(hào)將其注釋掉,并保存文件。圖5-3ex5_1.sct文件這時(shí)先不要編譯工程,打開(kāi)工程選項(xiàng),選中“Linker”頁(yè)簽,設(shè)置如圖5-4所示,即使用ScatterFile:ex5_1.sct。
說(shuō)明:工程選項(xiàng)中的其他頁(yè)簽保持不變(相對(duì)于工程ex4_3)。
點(diǎn)擊圖5-4的“OK”按鈕后,可以重新編譯工程ex5_1,此時(shí)沒(méi)有錯(cuò)誤,也沒(méi)有警告信息了,如圖5-5所示。
在圖5-5上,點(diǎn)擊“Flash|Download”菜單(或單擊工具欄上的快捷按鈕)則把ex5_1.axf下載到UP-NETARM2410實(shí)驗(yàn)箱N(xiāo)and型Flash上。下載完畢后,程序?qū)?dòng),可以看到三個(gè)LED燈在閃爍!也可以在線(xiàn)仿真調(diào)試(一般地,要把程序下載到Flash中后再仿真),或者把ULINK2仿真器從實(shí)驗(yàn)箱上取下來(lái),重新給實(shí)驗(yàn)箱上電,則程序會(huì)從Flash中啟動(dòng)執(zhí)行。圖5-4工程選項(xiàng)卡設(shè)置圖5-5完整的工程ex5_1本節(jié)還有兩個(gè)問(wèn)題沒(méi)有解決,其一為Scatter文件如何編寫(xiě),其二為匯編語(yǔ)言程序ledflash.s的解釋。
筆者認(rèn)為Scatter文件的內(nèi)容及如何編寫(xiě)該文件方面的知識(shí),除了一些ARM官方的文檔之外,最好的資料是MDK軟件的幫助菜單。這個(gè)幫助菜單和它的內(nèi)容做得相當(dāng)出色!本書(shū)中,筆者幾乎無(wú)一例外地使用工程選項(xiàng)卡配置存儲(chǔ)器,因此,對(duì)Scatter文件內(nèi)容的介紹也不會(huì)很多。
現(xiàn)在,解釋一下5.1節(jié)開(kāi)頭給出的程序段,即ledflash.s文件,該文件內(nèi)容如圖5-6所示,在圖5-6中給出語(yǔ)句的行號(hào),下面按行號(hào)解釋。圖5-6ledflash.s文件內(nèi)容行號(hào)01:定義名為L(zhǎng)EDLIGHT的只讀代碼段。
行號(hào)02:標(biāo)號(hào)__main在外部可見(jiàn)。
行號(hào)03:標(biāo)號(hào)__use_two_region_memory在外部可見(jiàn)。這句和行號(hào)36處沒(méi)有實(shí)際意義,僅是為了編譯時(shí)不出現(xiàn)警告或錯(cuò)誤,因?yàn)樵赟3C2410A.s的第1095行(修正后的文件行號(hào))有一句“IMPORT__use_two_region_memory”。
行號(hào)04:定義C口數(shù)據(jù)寄存器地址。
行號(hào)05:定義LED燈亮的常量。
行號(hào)06:定義LED燈滅的常量。行號(hào)07:ENTRY指程序入口點(diǎn),一般的匯編程序只需要有一個(gè)入口點(diǎn),而且這個(gè)入口點(diǎn)常被用作上電復(fù)位后的執(zhí)行入口點(diǎn)。需要說(shuō)明的是,這里的ENTRY入口點(diǎn),并不是上電復(fù)位的執(zhí)行入口點(diǎn),在本程序中,由于RESET段是存儲(chǔ)在地址0x00000000處的,所以,RESET是上電復(fù)位入口點(diǎn)(RESET在S3C2410A.s文件中)。
行號(hào)09:定義標(biāo)號(hào)__main。
行號(hào)10:R0=0x56000024。
行號(hào)11:R1=0。
行號(hào)12:向地址0x56000024處賦值0,即使GPC5、GPC6和GPC7為0(低電平),由第二章圖2-26可知,將點(diǎn)亮三個(gè)LED燈。行號(hào)14:跳轉(zhuǎn)到延遲子程序,這個(gè)程序段不作介紹。
行號(hào)16:R1=0xE0。
行號(hào)17:向地址0x56000024處賦值1,即使GPC5、GPC6和GPC7為1(高電平),由第二章圖2-26可知,將熄滅三個(gè)LED燈。
行號(hào)19:跳轉(zhuǎn)到延遲子程序。
行號(hào)21:跳轉(zhuǎn)到__main,循環(huán)執(zhí)行。
程序功能:點(diǎn)亮三個(gè)LED燈后,等待約(0xF0000*0xF0000*指令周期)后,熄滅LED燈,再等待一段時(shí)間后,重新點(diǎn)亮LED燈,循環(huán)執(zhí)行,給人LED燈閃爍的感覺(jué)。5.1.3匯編語(yǔ)言語(yǔ)法
ARM匯編語(yǔ)言的語(yǔ)法內(nèi)容豐容,本書(shū)的重點(diǎn)不在于匯編語(yǔ)言,匯編語(yǔ)言主要用于初始化系統(tǒng)。因此,這里簡(jiǎn)單地介紹一些常用的匯編語(yǔ)言語(yǔ)法。
1)?AREA
AREA已出現(xiàn)在ledflash.s中,用于定義匯編語(yǔ)言代碼段或數(shù)據(jù)段,例如:
AREALEDLIGHT,CODE,READONLY
AREALEDSHINE,DATA,?READWRITE上述代碼段定義一個(gè)名為L(zhǎng)EDLIGHT的只讀代碼段和一個(gè)名為L(zhǎng)EDSHINE的讀寫(xiě)代碼段。DATA用得較少。
在S3C2410A.s中有如下語(yǔ)句:
AREASTACK,NOINIT,READWRITE,ALIGN=3
該語(yǔ)句中,NOINIT偽關(guān)鍵字表示該段代碼只分配空間,不初始化(用0填充),ALIGN=3表示按雙字對(duì)齊方式(23=8B)。
2)?SPACE
在S3C2410A.s中有如下語(yǔ)句:
Stack_MemSPACEStack_Size這里Stack_Mem為標(biāo)號(hào),Stack_Size為常量,SPACE表示為Stack_Mem分配大小為Stack_Size的連續(xù)空間,單位為字節(jié)。
3)?DCD
DCD已出現(xiàn)在initmemcon.s中,表示分配字大小的連續(xù)空間,并用其他的值初始化該空間,例如:
Mem_Val_ConfDCD0x22111110,0x700
表示為標(biāo)號(hào)Mem_Val_Conf分配兩個(gè)字空間,并初始化這個(gè)字的值為0x22111110和0x700。此外,還有DCDU表示不按字對(duì)齊方式存儲(chǔ),慎用!!
除了DCD之外,還有DCB、DCW、DCQ、DCFS、DCFD等,分別表示為字節(jié)、半字、雙字、單精度浮點(diǎn)數(shù)(即字)、雙精度浮點(diǎn)數(shù)(即字)分配空間,并使用指定的數(shù)據(jù)初始化。
4)?EQU
EQU是匯編語(yǔ)言的相等偽指令,用得較多。例如在initmemcon.s中有:
Mem_Addr_BaseEQU0x48000000
5)?PRESERVE8
PRESERVE8指定當(dāng)前文件的堆棧采用8字節(jié)對(duì)齊方式,出現(xiàn)在S3C2410A.s中第0789行,要求每個(gè)棧的長(zhǎng)度的最低3位為0,且棧底地址的最低3位也應(yīng)為0。
6)?ARM
ARM指示符出現(xiàn)在S3C2410A.s中第0796行,指示編譯器生成32位指令的ARM代碼;而THUMB指示符表示生成16位指令的Thumb代碼。另外,THUMBX用于生成Thumb-2EE代碼。
7)?NOP
NOP即Nooperation,表示空操作。
8)?IF語(yǔ)句
IF語(yǔ)句格式為:
IF條件表達(dá)式
語(yǔ)句組1
ELSE
語(yǔ)句組2
ENDIF當(dāng)條件表達(dá)式為真時(shí),執(zhí)行語(yǔ)句組1;否則,執(zhí)行語(yǔ)句組2。出現(xiàn)在條件表達(dá)式中的“<>”(例如S3C2410A.s中的第0923行)表示不等于。表示等于、大于、小于、大于等于、小于等于的關(guān)系操作符為=、>、<、>=、<=。
9)?IMPORT
IMPORT后面跟標(biāo)識(shí)符,表明該標(biāo)識(shí)符是在該文件外部定義的,標(biāo)識(shí)符后可以加可選項(xiàng)[WEEK],則引用的標(biāo)識(shí)符沒(méi)有定義時(shí),編譯時(shí)也不會(huì)出錯(cuò)。而該文件中定義的標(biāo)識(shí)符需要被工程中的其他文件引用時(shí),使用EXPORT關(guān)鍵字。同時(shí),GLOBAL可以聲明一個(gè)全局標(biāo)識(shí)符。此外,EXTERN的功能與IMPORT相似,當(dāng)該文件中沒(méi)有實(shí)際引用這個(gè)標(biāo)識(shí)符時(shí),EXTERN下編譯器不會(huì)添加該標(biāo)識(shí)符到符號(hào)表中。
10)邏輯操作
S3C2410A.s的第1054行出現(xiàn)了“:OR:”,表示按位取或,還有以下偽操作符:
:AND:表示按位取與;:EOR:表示按位取異或;:NOT:表示取反。
同時(shí),還有:MOD:?表示取模,:SHL:、:SHR:、:ROL:?和:?ROR:?分別表示左移、右移、循環(huán)左移、循環(huán)右移,還可以使用+、-、*、/算符,其中“+”出現(xiàn)在S3C2410A.s的第
1100行。
表示邏輯操作的有:LNOT:、:LAND:、:LOR:和:LEOR:,依次為邏輯取反、邏輯與、邏輯或、邏輯異或。
11)?END
匯編語(yǔ)言每個(gè)程序段均以END結(jié)尾。
匯編語(yǔ)言程序是由AREA定義的一個(gè)個(gè)代碼段組成的,每個(gè)代碼段由匯編指令語(yǔ)句組成,完成某項(xiàng)特定的功能,最后以END結(jié)尾。不同的代碼段之間可以通過(guò)引用標(biāo)號(hào)的方式相互調(diào)用。工程ex5_1包含了匯編語(yǔ)言程序的基本特征,可以視為匯編語(yǔ)言程序的學(xué)習(xí)框架程序。在5.4節(jié)中還將添加中斷處理進(jìn)一步完善該程序。
5.2浮點(diǎn)數(shù)據(jù)處理
浮點(diǎn)數(shù)即小數(shù),使用ARM匯編語(yǔ)言表示和處理小數(shù),需要借助于IEEE-754標(biāo)準(zhǔn)或者DSP定標(biāo)的方法。DSP定標(biāo)方法在定點(diǎn)DSP芯片進(jìn)行浮點(diǎn)數(shù)據(jù)處理時(shí)經(jīng)常使用,相關(guān)內(nèi)容可參考《TMS320C5000系列DSP匯編語(yǔ)言程序設(shè)計(jì)》第六章,在這一章中,作者指出,“匯編語(yǔ)言是公認(rèn)的硬件操作最好的語(yǔ)言,并且用它來(lái)編寫(xiě)算法對(duì)編程者的思維也是一個(gè)很好的啟迪過(guò)程?!笔聦?shí)上,由于匯編語(yǔ)言語(yǔ)法簡(jiǎn)單明了,用來(lái)實(shí)現(xiàn)算法時(shí),沒(méi)有現(xiàn)成的算法庫(kù)來(lái)調(diào)用,因此,編程者必須親自編寫(xiě)算法的每個(gè)函數(shù)和每個(gè)細(xì)節(jié),從而要求編程者對(duì)算法非常熟悉才行。本節(jié)內(nèi)容將介紹ARM920T下的數(shù)值定標(biāo)和正余弦函數(shù)的計(jì)算。5.2.1計(jì)算基礎(chǔ)
計(jì)算正弦和余弦函數(shù)的值,需要借助于泰勒級(jí)數(shù)展開(kāi)式,如下:例如,取x=0.45,則(1)(2)上兩式為本節(jié)程序采用的算法。5.2.2數(shù)值定標(biāo)
匯編語(yǔ)言中的32位操作數(shù)只能為0或1組成的碼字。所謂“碼字”,是指CPU只能把存儲(chǔ)器的內(nèi)容視為二進(jìn)制數(shù)碼符號(hào)(實(shí)際上是電平信號(hào)),而不是數(shù)字。人們習(xí)慣把二進(jìn)制碼字之間的運(yùn)算關(guān)系稱(chēng)為二進(jìn)制數(shù)(二進(jìn)制補(bǔ)碼)之間的運(yùn)算,所以常常給人一種存儲(chǔ)器存儲(chǔ)的是數(shù)的假象。但是,在碼和數(shù)之間的確有一種一一映射的關(guān)系,并且,在這個(gè)映射關(guān)系上可以將數(shù)的運(yùn)算映射為碼間的運(yùn)算。同時(shí),由于十六進(jìn)制表示的整數(shù)和碼字之間這種映射關(guān)系非常直觀(guān),以至于人們會(huì)忽略這種映射的存在。例如,給定一個(gè)十六進(jìn)制碼字0x00000055,人們會(huì)不加思考地認(rèn)為它等于十進(jìn)制數(shù)85。這種相等是有條件的,即0x00000055碼字的小數(shù)定標(biāo)點(diǎn)位于第0位以后(或認(rèn)為沒(méi)有小數(shù)定標(biāo)點(diǎn)),這個(gè)定標(biāo)點(diǎn)是思想中添加的、用于碼和數(shù)之間映射的一種關(guān)系。對(duì)于整數(shù)的處理,人們可以很直觀(guān)地認(rèn)為這個(gè)定標(biāo)點(diǎn)不存在。對(duì)于小數(shù)處理,就不能忽視這個(gè)定標(biāo)點(diǎn)了。定標(biāo)的方法就是通過(guò)加定標(biāo)的方法將小數(shù)轉(zhuǎn)化為十六進(jìn)制數(shù)(碼)的方法,ARM是32位定點(diǎn)處理器,定標(biāo)點(diǎn)可設(shè)為0~32。定標(biāo)點(diǎn)確定后,32位的存儲(chǔ)字存儲(chǔ)的數(shù)據(jù)大小也就確定了。一個(gè)小數(shù)a的n定標(biāo)值為取整(a×2n),0≤n≤32。根據(jù)這種方法,小數(shù)0.45的31定標(biāo)值為0.45×231=966367641.6d≈966367641d=
0x39999999,即設(shè)置定標(biāo)點(diǎn)為31后,十六進(jìn)制值0x39999999不再是整數(shù)966367641,而是小數(shù)0.45。定標(biāo)有一種記號(hào)法,即Q(32-n).n,定標(biāo)點(diǎn)為31時(shí),記作Q1.31,有時(shí)簡(jiǎn)記為Q31,是最常用的一種定標(biāo)方法。但是,Q31定標(biāo)只能表示[-1,1)區(qū)間的小數(shù),如果表示更大范圍內(nèi)的小數(shù),例如區(qū)間[-2,2),則需要采用定標(biāo)Q2.30。小數(shù)定標(biāo)后的值往往是小數(shù)的近似值,這說(shuō)明計(jì)算機(jī)采用定標(biāo)方法只能不精確地表示小數(shù),例如,小數(shù)0.1就不能精確定標(biāo)。小數(shù)的定標(biāo)值可參與加、減和乘等運(yùn)算,由于定標(biāo)值表示的數(shù)據(jù)范圍有限,所以定標(biāo)值間的運(yùn)算不能有溢出,否則計(jì)算結(jié)果錯(cuò)誤。特別是乘法運(yùn)算,乘法結(jié)果為64位,定標(biāo)點(diǎn)位置移動(dòng)到62位,必須取高32位(同時(shí)向左移一位)進(jìn)行定標(biāo)點(diǎn)的還原(為31位);加法和減法運(yùn)算不改變定標(biāo)點(diǎn)。常用的做法為:在十進(jìn)制數(shù)條件下進(jìn)行小數(shù)的算法處理,找到所有參與運(yùn)算的小數(shù)、中間結(jié)果和最終結(jié)果的絕對(duì)值最大值,按照這個(gè)最大值確定定標(biāo)點(diǎn)位置。然后,將小數(shù)轉(zhuǎn)換為定標(biāo)值,編寫(xiě)匯編語(yǔ)言程序?qū)Χ?biāo)值進(jìn)行處理,得到定標(biāo)值表示的最終結(jié)果。最后,用去定標(biāo)的方法,即最終結(jié)果除去2n后得到真實(shí)的小數(shù)形式結(jié)果。在這個(gè)過(guò)程中,只有上一行的陰影部分是ARM匯編語(yǔ)言程序完成的。計(jì)算0.45的正弦和余弦值匯編語(yǔ)言程序,由于輸入數(shù)據(jù)、中間結(jié)果和最終結(jié)果都不可能超過(guò)1,可以采用Q31定標(biāo)方法。
需要指出的是,上述介紹的是有符號(hào)的定標(biāo),即定標(biāo)值的最高位31位為符號(hào)位,這種定標(biāo)方法用得較多。關(guān)于無(wú)符號(hào)定標(biāo)方法,由于與有符號(hào)定標(biāo)方法相似,故本書(shū)不作介紹。
下面把公式(1)和(2)中出現(xiàn)的常數(shù)按Q31定標(biāo)方法計(jì)算的定標(biāo)值列于表5-2中。表5-2公式(1)和(2)中常數(shù)的Q31定標(biāo)值小數(shù)0.451/3!1/5!1/7!定標(biāo)值0x399999990x155555550x11111110x68068小數(shù)11/2!1/4!1/6!定標(biāo)值0x7FFFFFFF0x400000000x55555550x2D82D8這里的定標(biāo)點(diǎn)和小數(shù)點(diǎn)是完全不同的概念,請(qǐng)注意區(qū)分。5.2.3程序代碼及結(jié)果分析
本小節(jié)的內(nèi)容不是本書(shū)的重點(diǎn),因此對(duì)本小節(jié)中的匯編程序不作深入分析,但是我們還是給出了完整的程序示例和源代碼(注釋清晰),供感興趣的讀者參考。
在工程ex5_1的基礎(chǔ)上,新建工程ex5_2,修改ledflash.s文件,其代碼如下所示:
1 AREALEDLIGHT,CODE,READONLY
2 EXPORT__main;LedFlash
3 EXPORT__use_two_region_memory
4
5 IMPORTSin0p45;forSincos0.45
6GPCDAT_ADDR EQU0x56000024
7LED_ON EQU0x0000
8LED_OFF EQU0x00E0
9 ENTRY
10;LedFlash
11__main
12 BL Sin0p45;forSincos0.45
13ledflash
14 LDR R0,=GPCDAT_ADDR
15 MOV R1,#LED_ON16 STR R1,[R0] ;LEDON
17
18 BL Delay
19
20 MOV R1,#LED_OFF
21 STR R1,[R0]
;LEDOFF
22
23 BL Delay
24
25 B ledflash
26Delay
27 MOV R3,#0x0F0000
28 MOV R4,#0x0F0000
29subcycle1
30 SUB
R3,R3,#1
31subcycle2
32
SUB
R4,R4,#1
33 CMP R4,#0
34 BGE subcycle2
35
36 CMP R3,#0
37 BGE subcycle1
38 BX LR
39
40__use_two_region_memory;nowarning
41 END
上述代碼中后跟注釋“;forSincos0.45”的語(yǔ)句為新添加的語(yǔ)句,即先進(jìn)行求正余弦值的運(yùn)算,然后再作使LED燈閃爍的處理。
新建匯編語(yǔ)言文件sincos0p45.s,并添加到工程ex5_2中,工程ex5_2的主界面如圖5-7所示。圖5-7工程ex5_2的工作界面文件sincos0p45.s的完整代碼如下:
1AREASINCOS,CODE,READONLY
2 ?EXPORTSin0p45
3Sin0p45
4 STMFDSP!,{R0-R9,R14}
5
6 ;calculatesin0.45
7 ;R0-R1loadaddress
8 ;R3-R8loadvalue
9 ADRR0,x_q ;R0isaddrofx
10 LDRR4,[R0] ;R4=x
11
12 SMULL R5,R6,R4,R4
13 MOV R7,R6,LSL#1
14 ADD R7,R7,R5,LSR#31;R7=x*x
15
16
SMULL R5,R6,R4,R7
17 MOV R8,R6,LSL#1
18 ADD R8,R8,R5,LSR#31;R8=x*x*x
19
20 ADR R1,cof_3
21 LDR
R3,[R1]
;R3=cof3
22
23 SMULL
R5,R6,R3,R8
24 MOV
R2,R6,LSL#1
25 ADD
R2,R2,R5,LSR#31
;R2=x^3/3!
26
27 MOV
R9,R4
28 SUB
R9,R9,R2
;R9=x-x^3/3!
29
30 SMULL R5,R6,R7,R8
31 MOV R8,R6,LSL#1
32 ADD R8,R8,R5,LSR#31
;R8=x^5
33
34 ADR R1,cof_5
35 LDR R3,[R1];R3=cof5
36
37 SMULL R5,R6,R3,R8
38 MOV R2,R6,LSL#1
39 ADD R2,R2,R5,LSR#31
;R2=x^5/5!
40
41 ADD R9,R9,R2;R9=x-x^3/3!+x^5/5!
42
43 SMULL R5,R6,R7,R8
44 MOV R2,R6,LSL#1
45 ADD R2,R2,R5,LSR#31 ;R2=x^7
46
47 ADR R1,cof_7
48 LDR R3,[R1] ;R3=cof7
49
50SMULL R5,R6,R3,R2
51 MOV R2,R6,LSL#1
52
ADDR2,R2,R5,LSR#31;R2=x^7/7!
53
54
SUBR9,R9,R2;R9=x-x^3/3!+x^5/5!-x^7/7!
55
56LDRR1,=sin_x
57STRR9,[R1]
58
59;calculatecos0.45
60ADR R0,x_q ;R0isaddrofx
61LDR R4,[R0] ;R4=x
62
63 SMULL R5,R6,R4,R4
64 MOV R7,R6,LSL#1
65 ADD R7,R7,R5,LSR#31;R7=x*x
66
67
SMULL R5,R6,R7,R7
68 MOV R8,R6,LSL#1
69 ADD R8,R8,R5,LSR#31;R8=x^4
70
71 ADR R1,cof_2
72 LDR R3,[R1];R3=cof2
73
74 SMULL R5,R6,R3,R7
75 MOV R2,R6,LSL#1
76 ADD R2,R2,R5,LSR#31 ;R2=x^2/2!
77
78 ADR R0,cof_1
79 LDR R9,[R0]
80 SUB
R9,R9,R2;R9=1-x^2/2!
81
82 ADR
R1,cof_4
83 LDR
R3,[R1];R3=cof4
84
85 SMULL R5,R6,R3,R8
86 MOV R2,R6,LSL#1
87 ADD R2,R2,R5,LSR#31 ;R2=x^4/4!
88
89 ADD R9,R9,R2;R9=1-x^2/2!+x^4/4!
90
91 SMULL
R5,R6,R7,R8
92 MOV R2,R6,LSL#1
93 ADD R2,R2,R5,LSR#31;R2=x^6
94
95 ADRR1,cof_6
96 LDRR3,[R1];R3=cof6
97
98 SMULLR5,R6,R3,R2
99 MOVR2,R6,LSL#1
100 ADDR2,R2,R5,LSR#31;
R2=x^6/6!
101
102 SUB R9,R9,R2;R9=1-x^2/2!+x^4/4!-x^6/6!
103
104 LDRR1,=cos_x
105 STR R9,[R1]
106
107 ;BX LR
;return
108 LDMFD SP!,{R0-R9,PC};return
109
110x_q DCD0x39999999;0.45
111cof_1 DCD0x7FFFFFFF ;1
112cof_2 DCD0x40000000 ;1/2!
113cof_3 DCD0x15555555 ;1/3!
114cof_4 DCD0x05555555 ;1/4!
115cof_5 DCD0x01111111 ;1/5!
116cof_6 DCD0x002D82D8 ;1/6!
117cof_7 DCD0x00068068;1/7!
118
119 AREASINCOSRES,DATA,READWRITE
120sin_x DCD0 ;sin0.45
121cos_x DCD0 ;cos0.45
122 END
編譯連接下載工程ex5_2,然后調(diào)試工程,如圖5-8所示。圖5-8工程ex5_2的調(diào)試窗口工程ex5_2的計(jì)算結(jié)果sin0.45和cos0.45保存在標(biāo)號(hào)sin_x和cos_x處,即圖5-8右側(cè)Memory的0x30000000和0x30000004處,計(jì)算結(jié)果數(shù)值為0x37ACF357和0x7341D96B,去定標(biāo)后的值(即轉(zhuǎn)化為十進(jìn)制數(shù),再除以231后的值)為:
計(jì)算值sin0.45=0.4349655318073928356170654296875
計(jì)算值cos0.45=0.9004470608197152614593505859375而真實(shí)值為:
真實(shí)值sin0.45=0.4349655341112302104208442462319
真實(shí)值cos0.45=0.90044710235267692166884061148645
計(jì)算值和真實(shí)值的誤差在10-7數(shù)量級(jí)上,可見(jiàn),計(jì)算結(jié)果是正確的。(數(shù)學(xué)角度上,還要考慮級(jí)數(shù)的截?cái)嗾`差!)
5.3系統(tǒng)初始化
系統(tǒng)初始化是指上電復(fù)位后ARM芯片級(jí)程序首先要進(jìn)行的處理,即配置工作時(shí)鐘、看門(mén)狗電路、存儲(chǔ)器空間、通用IO口、中斷向量表及堆棧等,這些工作都可以借助MDK軟件的啟動(dòng)代碼可視化配置向?qū)瓿?,生成相關(guān)的啟動(dòng)代碼文件。這里選用了S3C2410芯片,所以啟動(dòng)代碼文件為S3C2410A.s。下面將介紹這個(gè)啟動(dòng)代碼文件中還沒(méi)有講述的部分,并編制一個(gè)替換掉該啟動(dòng)代碼文件的初始化代碼文件。5.3.1啟動(dòng)代碼S3C2410A.s
啟動(dòng)代碼文件S3C2410A.s中已經(jīng)講述的部分為存儲(chǔ)器控制器、通用IO口配置以及堆和棧等四部分,本小節(jié)中介紹的內(nèi)容為看門(mén)狗定時(shí)器(WatchdogTimer)、時(shí)鐘管理器(ClockManagement)和中斷向量表(InterruptVectorTable)三部分,其中,中斷向量表在5.4節(jié)還要深入講述。
1.時(shí)鐘管理器
初始化時(shí)鐘管理器往往是初始化工作的第一步(例如DSP中),而在啟動(dòng)文件S3C2410A.s中,第一步是初始化看門(mén)狗定時(shí)器,第二步是初始化時(shí)鐘管理器。結(jié)合“S3C2410AUser’sManual”第七章“Clock&PowerManagement”,可知時(shí)鐘管理器如圖5-9所示。
S3C2410A有四種工作模式,即正常模式、慢速模式、空閑模式和掉電模式,正常模式下由圖5-9所示模塊向CPU和所有外設(shè)提供時(shí)鐘源,外設(shè)時(shí)鐘源可以通過(guò)軟件打開(kāi)或關(guān)閉,當(dāng)所有外設(shè)時(shí)鐘都工作時(shí),芯片功耗達(dá)到最大。這里僅討論正常模式下的時(shí)鐘管理器配置。
從UP-NETARM2410實(shí)驗(yàn)箱原理圖上可以查到,S3C2410A的OM3和OM2腳均接地,即OM[3:2]=0b00,則由S3C2410A芯片資料手冊(cè)可以查到,此時(shí)上電復(fù)位后時(shí)鐘配置為MPLL有效、UPLL有效、主時(shí)鐘源和USB時(shí)鐘源均來(lái)自外部的晶體。再查UP-NETARM2410實(shí)驗(yàn)箱原理圖,可以查到PLL時(shí)鐘源頻率為12?MHz,RTC時(shí)鐘源為32.768?kHz。圖5-9S3C2410A時(shí)鐘管理器從附錄一的附表1-1可以查到與時(shí)鐘管理器相關(guān)的映射寄存器共有6個(gè),即LOCKTIME、MPLLCON(必須初始化)、UPLLCON、CLKCON、CLKSLOW和CLKDIVN,基地址為0x4C000000,偏移量依次為0、0x4、0x8、0xC、0x10和0x14。這些寄存器的含義請(qǐng)參考S3C2410A芯片資料手冊(cè)第七章。這些寄存器統(tǒng)稱(chēng)為時(shí)鐘控制寄存器,配置好這些寄存器后,輸入到芯片的時(shí)鐘將按圖5-10進(jìn)行分配,其中,F(xiàn)CLK給CPU,HCLK給AHB總線(xiàn)外設(shè)(例如ARM920T、存儲(chǔ)控制器、中斷控制器、LCD控制器、DMA和USB主機(jī)等),PCLK給APB總線(xiàn)外設(shè)(例如WDT、IIS、IIC、PWM定時(shí)器、MMC接口、ADC、UART、GPIO、RTC和SPI等),UCLK為USB服務(wù)。圖5-10S3C2410A時(shí)鐘分配方案現(xiàn)在看一下啟動(dòng)代碼S3C2410A.s中與配置6個(gè)時(shí)鐘控制寄存器相關(guān)的語(yǔ)句,如表5-3所示,其中,行號(hào)以工程ex5_1中的S3C2410A.s為準(zhǔn)。表5-3S3C2410A.s中與時(shí)鐘控制器相關(guān)的代碼序號(hào)行號(hào)注釋或語(yǔ)句10068~0076;ClockManagementdefinitionsCLK_BASE EQU 0x4C000000 ;ClockBaseAddressLOCKTIME_OFS EQU 0x00 ;LOCKTIMEOffsetMPLLCON_OFS EQU 0x04 ;MPLLCONOffsetUPLLCON_OFS EQU 0X08 ;UPLLCONOffsetCLKCON_OFS EQU 0x0C ;CLKCONOffsetCLKSLOW_OFS EQU 0x10 ;CLKSLOWOffsetCLKDIVN_OFS EQU 0X14 ;CLDKIVNOffsetCAMDIVN_OFS EQU 0X18 ;CAMDIVNOffset20080~0140;時(shí)鐘控制器寄存器注釋30141~0147CLK_SETUP EQU 1MPLLCON_Val EQU 0x0005C080UPLLCON_Val EQU 0x00028080CLKCON_Val EQU 0x0007FFF0CLKSLOW_Val EQU 0x00000004LOCKTIME_Val EQU 0x00FFFFFFCLKDIVN_Val EQU 0X00000000序號(hào)行號(hào)注釋或語(yǔ)句40909~0918;ClockManagementConfigurationIFCLK_SETUP<>0CLK_CFGDCD LOCKTIME_ValDCD CLKDIVN_ValDCD MPLLCON_ValDCD UPLLCON_ValDCD CLKSLOW_ValDCD CLKCON_ValENDIF50958~0968IFCLK_SETUP<>0LDR R0,=CLK_BASEADR R8,CLK_CFGLDMIA? R8,{R1-R6}STR? R1,[R0,#LOCKTIME_OFS]STR? R2,[R0,#CLKDIVN_OFS]STR? R3,[R0,#MPLLCON_OFS]STR? R4,[R0,#UPLLCON_OFS]STR? R5,[R0,#CLKSLOW_OFS]STR? R6,[R0,#CLKCON_OFS]ENDIF表5-3中序號(hào)1一行表示定義時(shí)鐘控制寄存器的基地址和偏移量;序號(hào)3一行中,CLK_SETUP為1表示在配置向?qū)е小癈lockManagement”勾選,即使用S3C2410A.s初始化時(shí)鐘寄存器,其他的為6個(gè)寄存器的配置值;序號(hào)4中為時(shí)鐘控制寄存器配置字分配空間;序號(hào)5一行為初始化時(shí)鐘控制寄存器。(這段代碼寫(xiě)得不錯(cuò)!)下面理解一下表5-3中序號(hào)3一行中各配置字的含義,如表5-4所示,表5-4中也列出筆者擬配置的值,其中,“MDK值”表示MDK軟件啟動(dòng)代碼中配置的值,“筆者值”為筆者擬定的值。表5-4時(shí)鐘控制寄存器配置值及含義寄存器名MDK值筆者值含義LOCKTIME0x00FFFFFF0x00FFFFFF
LOCKTIME的位[23:12]為UPLL的鎖定時(shí)間,位[11:0]為MPLL的鎖定時(shí)間,位[31:24]保留。這里采用復(fù)位值,也是最大值,MPLL和UPLL穩(wěn)定(鎖住)前的計(jì)數(shù)值均為0xFFFMPLLCON0x0005C0800x00058011
MPLLCON和UPLLCON結(jié)構(gòu)相同,第[19:12]位為MDIV,第[9:4]位為PDIV,第[1:0]位為SDIV,其他位保留。Mpll時(shí)鐘值=[輸入時(shí)鐘*(MDIV+8)]/[(PDIV+2*2SDIV],MDK的設(shè)置值為默認(rèn)值,表示Mpll為120?MHz,筆者的設(shè)置值為192?MHz。注意:雖然這款S3C2410A芯片最大工作頻率為200?MHz,但是配置PLL值應(yīng)使用推薦的配置,不要任意設(shè)置UPLLCON0x000280800x00078023
MDK的配置值為57.6?MHz,筆者的設(shè)定值為48?MHz寄存器名MDK值作者值含義CLKCON0x0007FFF00x0007FFF0
CLKCON寄存器從第18位至第4位依次管理SPI、IIS、IIC、ADC(含觸摸屏)、TRC、GPIO、UART2、UART1、UART0、SDI、PWMTIMER、USB設(shè)備、USB主機(jī)、LCDC、NandFlash的時(shí)鐘源。當(dāng)各位取1時(shí)有效;取0時(shí)無(wú)效。第3位至第0位依次為POWER_OFF模式、空閑模式、保留、SM_BIT(推薦為0)的設(shè)置位,均需取0。采用的是缺省設(shè)置CLKSLOW0x000000040x00000004
CLKSLOW寄存器第7位為1表示UCLK開(kāi),為0表示UCLK關(guān)(UPLL終始有效)。第5位為1表示PLL開(kāi),為0表示PLL關(guān)。第4位為0表示FCLK=Mpll,為1表示SLOW模式(此時(shí)時(shí)鐘大小計(jì)算請(qǐng)參考S3C2410A手冊(cè))。第[2:0]位為慢時(shí)鐘分頻值,缺省為0x4。這里采用缺省值即可CLKDIVN0x000000000x00000003
CLKDIVN寄存器第1位為0,則HCLK時(shí)鐘為FCLK;第1位為1,則HCLK時(shí)鐘為FCLK/2。第0位為0,表示PCLK時(shí)鐘為HCLK;第0位為1,表示PCLK時(shí)鐘為HCLK/2。第2位為0,保留;如果第2位設(shè)為1,表示HCLK和PCLK均為FCLK./4,此時(shí)位[1:0]無(wú)效,且必須設(shè)為0b00結(jié)合圖5-9和圖5-10,配置時(shí)鐘寄存器后,Mpll時(shí)鐘穩(wěn)定前,CPU直接使用外部時(shí)鐘;當(dāng)PLL穩(wěn)定后,CPU時(shí)鐘FCLK將使用Mpll時(shí)鐘,即工作在192MHz下。
在工程ex5_1的基礎(chǔ)上新建工程ex5_3(此時(shí),與工程ex5_1完全相同),然后,按表5-4中的“作者值”設(shè)置S3C2410A.s,如圖5-11所示。圖5-11
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 堆假山合同范例
- 瀝青清包工合同范例
- 豬買(mǎi)賣(mài)合同范例
- 2025勞動(dòng)合同續(xù)簽期限
- 照顧獨(dú)居老人合同范例
- 工程營(yíng)銷(xiāo)合同范例
- 住宿 會(huì)議 用餐合同范例
- 工地木材合同范例
- 肯德基假期兼職合同范例
- 溝渠維修合同范例
- 9歲兒童智商測(cè)試題
- 大鎖孫天宇小品《時(shí)間都去哪了》臺(tái)詞劇本完整版-一年一度喜劇大賽
- 消防立管永臨結(jié)合施工方案
- 人教版八年級(jí)物理下冊(cè) 實(shí)驗(yàn)題02 壓力壓強(qiáng)實(shí)驗(yàn)(含答案詳解)
- 抖音快手短視頻創(chuàng)業(yè)項(xiàng)目融資商業(yè)策劃書(shū)
- 滬教版英語(yǔ)八年級(jí)上冊(cè)知識(shí)點(diǎn)歸納匯總
- 裝飾裝修工程售后服務(wù)具體措施
- 軟件設(shè)計(jì)說(shuō)明書(shū)通用模板
- 酒店治安安全培訓(xùn)
- 糖皮質(zhì)激素類(lèi)藥物臨床應(yīng)用指導(dǎo)原則(2023年)
- 我的家鄉(xiāng)-東營(yíng)
評(píng)論
0/150
提交評(píng)論