arm嵌入式原理技術(shù)及應(yīng)用ch-5_第1頁
arm嵌入式原理技術(shù)及應(yīng)用ch-5_第2頁
arm嵌入式原理技術(shù)及應(yīng)用ch-5_第3頁
arm嵌入式原理技術(shù)及應(yīng)用ch-5_第4頁
arm嵌入式原理技術(shù)及應(yīng)用ch-5_第5頁
已閱讀5頁,還剩214頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

2010.12陳賾ARM嵌入式技術(shù)原理與應(yīng)用

clshust@1633/10/2024第五章ARM嵌入式系統(tǒng)軟件設(shè)計3/10/2024◆要求熟悉嵌入式系統(tǒng)開發(fā)的硬件與軟件環(huán)境;◆掌握ADS與AXD開發(fā)工具的使用方法;◆了解ARM的啟動過程分析;◆

理解存儲映射的機制;◆熟悉與掌握嵌入式軟件開發(fā)的一些常用技術(shù)3/10/20245.1開發(fā)平臺學(xué)習(xí)嵌入式技術(shù),必須要有硬件平臺作實踐,它不象其它的根底理論課,學(xué)懂理論就行了,而它主要在于實踐應(yīng)用,沒有在硬件平臺上實踐是很難學(xué)好嵌入式技術(shù)的。有了硬件平臺,就可以開始從理論到實踐交替進行。給初學(xué)者一些快速入門的方法:3/10/20241〕從宏觀上了解嵌入式系統(tǒng)的結(jié)構(gòu),要實現(xiàn)的功能;2〕利用一塊成熟的開發(fā)板,這里成熟的開發(fā)板是指硬件資源豐富,運行穩(wěn)定可靠,配套的學(xué)習(xí)資料齊全〔硬件與軟件開發(fā)工具以及實例〕;3〕熟悉開發(fā)板的主要功能;4〕在沒有操作系統(tǒng)的情況下,按模塊學(xué)習(xí)3/10/2024如:I/O口應(yīng)用的LED實驗、定時器實驗、中斷實驗等,在學(xué)習(xí)的過程中,首先是讀懂該模塊的硬件功能,從電路圖開始讀懂再對應(yīng)到該板卡的實際實物上。一個一個模塊搞懂,在學(xué)習(xí)模塊時要注意將硬件電路與配置存放器相結(jié)合,真正了解它們的含義,最后變成程序代碼。3/10/20245)當(dāng)模塊學(xué)習(xí)到一定數(shù)量后,要將它們組成一個小系統(tǒng)進行聯(lián)調(diào)。在嵌入式系統(tǒng)里用得最多的編程語言就是C語言。匯編語言主要用在系統(tǒng)的初始化局部。6)熟悉硬件后,為了開發(fā)出實用的嵌入式系統(tǒng),一般是在操作系統(tǒng)上進行開發(fā)的。所以要熟悉uc/os、linux和wince等操作系統(tǒng)。

3/10/20241.硬件開發(fā)環(huán)境下面以基于ARM9內(nèi)核的s3c2410的開發(fā)板為例,說明初學(xué)者要進行入門學(xué)習(xí)需要具備的一些開發(fā)條件:〔1〕基于ARM9內(nèi)核的s3c2410的開發(fā)板一套〔2〕常用的軟件開發(fā)工具〔3〕常用電子測試儀表,如萬用表、示波器等3/10/2024MY-2410-1開發(fā)板基于三星公司的ARM處理器S3C2410。是編者自主研制的一款A(yù)RM9實驗開發(fā)板。MY-2410開發(fā)板的實物與功能示意如以下圖所示。3/10/20243/10/20243/10/20243/10/2024開發(fā)板與PC機的連線如以下圖所示。下面分別介紹這些接口的主要作用。3/10/20241〕JTAG接口一般用來下載Bootloader。下載速度較慢。主要完成:〔1〕初始化CPU內(nèi)部所有存放器;〔2〕加載串口驅(qū)動;〔3〕加載USB驅(qū)動;〔4〕加載網(wǎng)卡驅(qū)動。3/10/2024

在進行嵌入式系統(tǒng)開發(fā)時,首先用到的接口就是JTAG接口,利用該接口對S3C2410X等開發(fā)板,配合sjf2410.exe燒寫監(jiān)控程序,如2410mons.bin監(jiān)控程序。

在以后的開發(fā)中,用該接口進行調(diào)試。3/10/20242〕USB接口利用開發(fā)板上的USB_DEVICE接口,一般用來配合DNW.exe來下載文件。下載速度較快。開發(fā)板上的USB_HOST可以外接應(yīng)用設(shè)備,如:USB移動硬盤,USB攝像頭等外設(shè)。3/10/20243〕串口串口一般配合DNW.exe或超級終端來監(jiān)控板子的運行情況,有時也可以用來下載文件。很多情況下主要用來調(diào)試,調(diào)試很方便,只需往串口存放器中填數(shù)據(jù),就可以輸出調(diào)試信息。4〕網(wǎng)口網(wǎng)口用來下載數(shù)據(jù),也完成網(wǎng)絡(luò)通信。3/10/20242.

軟件開發(fā)環(huán)境1〕交叉開發(fā)概念由于嵌入式系統(tǒng)硬件上的特殊性,一般不能安裝windows操作系統(tǒng)和發(fā)行版的linux系統(tǒng),因為它的CPU運行速度,F(xiàn)LASH的空間等都達(dá)不到通用PC系統(tǒng)的要求。所以在嵌入式系統(tǒng)上無法構(gòu)建其自己的開發(fā)環(huán)境,于是,人們采用了所謂的交叉開發(fā)模式。3/10/2024

交叉開發(fā)就是指在一臺通用計算機上進行軟件的編輯編譯,然后下載到嵌入式設(shè)備中進行運行調(diào)試的開發(fā)方式。

用來開發(fā)的通用計算機可以是PC機、工作站等,運行通用的Windows或Linux操作系統(tǒng)。開發(fā)計算機一般稱宿主機,嵌入式設(shè)備稱目標(biāo)機。在宿主機上編譯好程序,下載到目標(biāo)機上運行,交叉開發(fā)環(huán)境提供調(diào)試工具對目標(biāo)機上運行的程序進行調(diào)試。3/10/2024交叉編譯是指在宿主機——X86系統(tǒng)CPU的通用計算機上使用ADS,GCC等交叉開發(fā)軟件為目標(biāo)機開發(fā)程序,最后編譯成可以在ARM體系結(jié)構(gòu)的目標(biāo)機上運行目標(biāo)代碼。宿主機與目標(biāo)機的連接關(guān)系如以下圖所示。3/10/2024在宿主機上編譯好目標(biāo)代碼后,通過宿主機到目標(biāo)機的調(diào)試通道將代碼下載到目標(biāo)機,然后由運行于宿主機的調(diào)試軟件控制代碼在目標(biāo)機上進行調(diào)試。為了方便調(diào)試開發(fā),交叉開發(fā)軟件一般為一個整合編輯、編譯匯編鏈接、調(diào)試、工程管理及函數(shù)庫等功能模塊的集成開發(fā)環(huán)境IDE〔IntegratedDevelopmentEnvironment〕,如ADS就是一個比較好的ARM開發(fā)IDE。3/10/2024嵌入式系統(tǒng)開發(fā)的使用的主要工具之間的關(guān)系,如以下圖所示。開發(fā)工具分為不基于操作系統(tǒng)與基于操作系統(tǒng)兩大塊。在不基于操作系統(tǒng)的開發(fā)中,主要用到的是ADS集成開發(fā)環(huán)境,與IAR公司的IAREWARM開發(fā)軟件以及一些監(jiān)控與引導(dǎo)程序程序。3/10/20243/10/20242.ADS組成介紹

ADS全稱為ARMDeveloperSuite,是ARM公司推出的新一代ARM集成開發(fā)工具。現(xiàn)在ADS的最新版本是1.2,它取代了早期的ADS1.1和ADS1.0,該版本支持包括Windows和Linux在內(nèi)的多種操作系統(tǒng)。3/10/20241〕ADS組成介紹〔1〕編譯器ADS提供多種編譯器,以支持ARM和Thumb指令的編譯?!鬭rmcc是ARMC編譯器;◆tcc是ThumbC編譯器;◆armcpp是ARMC++編譯器;◆tcpp是ThumbC++編譯器;◆armasm是ARM和Thumb的匯編器。3/10/2024〔2〕鏈接器armlink是ARM鏈接器。該命令既可以將編譯得到的一個或多個目標(biāo)文件和相關(guān)的一個或多個庫文件進行鏈接,生成一個可執(zhí)行文件,也可以將多個目標(biāo)文件局部鏈接成一個目標(biāo)文件,以供進一步的鏈接。3/10/2024〔3〕符號調(diào)試器armsd是ARM和Thumb的符號調(diào)試器。它能夠進行源碼級的程序調(diào)試。用戶可以在用C或匯編語言寫的代碼中進行單步調(diào)試、設(shè)置斷點、查看變量值和內(nèi)存單元的內(nèi)容。3/10/2024〔4〕fromELF將ELF格式的文件轉(zhuǎn)換為各種格式的輸出文件,包括BIN格式映像文件、Motorola32位S格式映像文件、Intel32位格式映像文件和Verilog16進制文件。FromELF命令也能夠為輸入映像文件產(chǎn)生文本信息,例如,代碼和數(shù)據(jù)長度。3/10/2024〔5〕armararmar是ARM庫函數(shù)生成器,它將一系列ELF格式的目標(biāo)文件以庫函數(shù)的形式集合在一起。用戶可以把一個庫傳遞給一個鏈接器以代替幾個ELF文件。3/10/2024〔6〕CodeWarriorCodeWarrior集成開發(fā)環(huán)境〔IDE〕為管理和開發(fā)工程提供了簡單多樣化的圖形用戶界面,用戶可以使用ADS的CodeWarriorIDE為ARM和Thumb處理器開發(fā)用C、C++或者ARM匯編語言編寫的程序代碼。3/10/2024〔7〕調(diào)試器ADS中包含有3個調(diào)試器:第一個是AXD(ARMeXtendedDebugger),它是ARM擴展調(diào)試器;第二個是armsd(ARMSymbolicDebugger),它是ARM符號調(diào)試器;與老版本兼容的Windows或Unix下的ARM調(diào)試工具ADW/ADU。3/10/2024〔8〕C和C++庫ADS提供ANSIC庫函數(shù)和C++庫函數(shù),支持被編譯的C和C++代碼。用戶可以把C庫中的與目標(biāo)相關(guān)的函數(shù)作為自己應(yīng)用程序中的一局部,重新進行代碼的實現(xiàn)。針對自己的應(yīng)用程序的要求,對與目標(biāo)無關(guān)的庫函數(shù)進行適當(dāng)?shù)牟眉?。在C庫中有很多函數(shù)是獨立于其他函數(shù)的,并且與目標(biāo)硬件沒有任何依賴關(guān)系。對于這類函數(shù),用戶可以很容易地從匯編代碼中使用。3/10/20243.編寫應(yīng)用程序都要用到的文件利用下面的文件與程序,它們可以提高編程效率,節(jié)省時間,也使初學(xué)者能夠盡快入門。到達(dá)一定水平后,自己再在此文件與程序的根底上修改,或重新編寫自己的應(yīng)用程序,盡可能地到達(dá)系統(tǒng)最優(yōu)化的目的。3/10/20241〕INC目錄下的文件2410addr.h2410addr.inc2410lib.h2410slib.hDef.hMemcfg.incOption.incUart0.hmmu.hOption.h3/10/20242〕INC目錄下的文件說明Def.h根本數(shù)據(jù)類型重定義頭文件,在定義數(shù)據(jù)類型時盡量使用U32,U16,S32,S16,U8,S8等類型,以增強程序的可移植性,主要內(nèi)容如下:#ifndef__DEF_H__#define__DEF_H__;防止重復(fù)定義__DEF_H__#defineU32unsignedint#defineU16unsignedshort#defineS32int#defineS16shortint#defineU8unsignedchar#define S8char#defineTRUE 1#defineFALSE 0#endif/*__DEF_H__*/3/10/2024(2)Option.h

是硬件系統(tǒng)重要設(shè)置頭文件,如果要修改系統(tǒng)的工作頻率,總線寬度,一些重要地址的值可在本文件中修改,主要內(nèi)容如下://#defineFCLK101250000//SDRAM2.5Vuse#defineFCLK202800000//#defineHCLK(FCLK/2)//#definePCLK(FCLK/4)//#defineUCLKPCLK//BUSWIDTH:16,32#defineBUSWIDTH(32)3/10/2024//64MB//0x30000000~0x30ffffff:DownloadArea(16MB)Cacheable//0x31000000~0x33feffff:Non-CacheableArea//0x33ff0000~0x33ff47ff:Heap&RWArea//0x33ff4800~0x33ff7fff:FIQ~UserStackArea//0x33ff8000~0x33fffeff:NotUsedArea//0x33ffff00~0x33ffffff:Exception&ISRVectorTable#define_RAM_STARTADDRESS0x30000000#define_NONCACHE_STARTADDRESS 0x31000000#define_ISR_STARTADDRESS0x33ffff00#define_MMUTT_STARTADDRESS0x33ff8000#define_STACK_BASEADDRESS0x33ff8000#defineHEAPEND0x33ff00003/10/2024(3)2410addr.h是2410的存放器的地址宏定義頭文件,方便使用,主要內(nèi)容如下://存儲器控制器的配置存放器的起始地址是:0x48000000~0x48000030,由于ARM的存放器是32位的,而一個地址放一個字節(jié),所以需要4個地址。//Memorycontrol#definerBWSCON(*(volatileunsigned*)0x48000000)//Buswidth&waitstatus……//INTERRUPT的配置存放器的起始地址是:0x4a000000~0x4a00001c。//INTERRUPT#definerSRCPND(*(volatileunsigned*)0x4a000000)//Interruptrequeststatus……3/10/2024注意:在匯編語言中,用2410addr.inc文件。

volatile的本意為“暫態(tài)的”或.“易變的”,該說明符起到抑制編譯器優(yōu)化的作用。

如果在聲明時用“volatile”關(guān)鍵進行修飾,遇到這個關(guān)鍵字聲明的變量,編譯器對訪問該變量的代碼就不再進行優(yōu)化,從而可以提供特殊地址的穩(wěn)定訪問。3/10/2024

(4)2410lib.h

是調(diào)試時常用函數(shù),還有一些其它的常用函數(shù)的頭文件。

(5)2410slib.h

包含MMU相關(guān)函數(shù)的頭文件。3/10/20243〕SRC目錄下的文件(1)2410init.s是2410初始化啟動程序,由匯編語言寫成(2)2410lib.c是描述了2410的調(diào)試常用函數(shù)的原型,用C語言寫成。(3)2410slib.s包含匯編語言寫的MMU相關(guān)的程序代碼。(4)mmu.c包含MMU相關(guān)的程序代碼。(5)Uart0.c包含了串口的常用函數(shù)原型,用C語言寫成。3/10/2024主程序模板.c//===========================================

=//FileName:2410test.c//Function:S3C2410TestMainMenu//Program:Shin,OnPil(SOP)//Date:June13,2003//Version:0.0//History//==========================================

=====#include<stdlib.h>#include<string.h>#include"def.h"#include"option.h"#include"2410addr.h"#include"2410lib.h"#include"2410slib.h"#include"uart0.h"#include"mmu.h"3/10/2024voidIsr_Init(void);voidHaltUndef(void);voidHaltSwi(void);voidHaltPabort(void);voidHaltDabort(void);externvoid__rt_lib_init(void);voidTemp_Function(void){;}//=======================================

=voidMain(void){inti=0;

//Led_Display(15);

MMU_Init();//初始化MMU3/10/2024//=====================================================voidMain(void){inti=0;

//Led_Display(15);

MMU_Init();//初始化MMU

#ifADS10__rt_lib_init();//forADS1.0#endif

//ChangeClockDivider(0,0);//1:1:1//ChangeClockDivider(0,1);//1:1:2//rCLKDIVN|=(1<<2);//1:4:4//ChangeClockDivider(1,0);//1:2:2ChangeClockDivider(1,1);//1:2:4

ChangeMPllValue(0xa1,0x3,0x1);//FCLK=202.8MHz3/10/2024

Port_Init(); //IO端口初始化Isr_Init();

//設(shè)中斷Uart_Init(0,115200);

//COM口初始化

//SavethewastedpowerconsumptiononGPIO.rIISPSR=(2<<5)|(2<<0);//IIS_LRCK=44.1Khz@384fs,PCLK=50Mhz.rGPHCON=rGPHCON&~(0xf<<18)|(0x5<<18);//CLKOUT0,1=OUTPUTtoreducethepowerconsumption.Uart_Printf("\n\nhellodenggs\n"); while(1) {

Uart_Printf("hello\n");//串口返回調(diào)試信息

Delay(2000);//延時

i++; if(i>15)i=0; Led_Display(i);//控制四個LED顯示

}3/10/2024voidIsr_Init(void){pISR_UNDEF=(unsigned)HaltUndef;pISR_SWI=(unsigned)HaltSwi;pISR_PABORT=(unsigned)HaltPabort;pISR_DABORT=(unsigned)HaltDabort;

rINTMOD=0x0;//All=IRQmode//rINTCON=0x5;//Non-vectored,IRQenable,FIQdisablerINTMSK=BIT_ALLMSK;//Allinterruptismasked.rINTSUBMSK=BIT_SUB_ALLMSK;//Allsub-interruptismasked.<-April01,2002SOP//rINTSUBMSK=~(BIT_SUB_RXD0);//EnableRx0Defaultvalue=0x7ff//rINTMSK=~(BIT_UART0);//EnableUART0Defaultvalue=0xffffffff

//pISR_UART0=(unsigned)RxInt;//pISR_FIQ,pISR_IRQmustbeinitialized}3/10/2024//==================

===============================voidHaltUndef(void){Uart_Printf("Undefinedinstructionexception.\n");while(1);}//=====================

================================voidHaltSwi(void){Uart_Printf("SWIexception.\n");while(1);}3/10/2024//===========================================================voidHaltPabort(void){Uart_Printf("Pabortexception.\n");while(1);}//============================================================voidHaltDabort(void){Uart_Printf("Dabortexception.\n");while(1);}//============================================================3/10/20244〕2410接口函數(shù)說明voidDelay(inttime); //WatchdogTimerisused.延時void*malloc(unsignednbyte);//分配內(nèi)存voidfree(void*pt); //釋放內(nèi)存voidPort_Init(void); //初始化端口voidUart_Select(intch); //選擇串口voidUart_TxEmpty(intch);voidUart_Init(intmclk,intbaud);//串口初始化charUart_Getch(void); //從串口讀取一個字符(阻塞)charUart_GetKey(void); //從串口讀取一個字符(非阻塞)intUart_GetIntNum(void); //從串口讀取一個數(shù)字voidUart_SendByte(intdata); //從串口發(fā)送一個字節(jié)voidUart_Printf(char*fmt,...); //從串口輸出的printf3/10/2024voidUart_SendString(char*pt);voidTimer_Start(intdivider);//WatchdogTimerisused.intTimer_Stop(void);

//WatchdogTimerisused.voidLed_Display(intdata);voidChangeMPllValue(intm,intp,ints);voidChangeClockDivider(inthdivn,intpdivn);voidChangeUPllValue(intm,intp,ints);3/10/20241.ADS的應(yīng)用首先通過“開始”->“程序”->“ARMDeveloperSuiteV1.2”->“CodewarriorforARMDeveloperSuite”翻開Codewarrior。如下圖。5.2ADS的使用簡介3/10/2024ADS為用戶提供了7個模板,分別是:1)ARMExecutableImage:用于由ARM指令的代碼生成一個ELF格式的可執(zhí)行映象文件;2〕ARMObjectLibrary:用于由ARM指令的代碼生成一個armar格式的目標(biāo)文件庫;3〕EmptyProject:用于創(chuàng)立一個不包含任何庫或者源文件的工程;4〕MakefileImporterWizard:用于將VC的nmake或者GNUmake文件轉(zhuǎn)入到CodeWarriorIDE工程文件;

3/10/2024

5〕ThumbARMExecutableImage:用于由ARM指令和Thumb指令的混合代碼生成一個可執(zhí)行的ELF格式的映象文件;6〕ThumbExecutableimage:用于由Thumb指令創(chuàng)立一個可執(zhí)行的ELF格式的映象文件;7〕ThumbObjectLibrary:用于由Thumb指令的代碼生成一個armar格式的目標(biāo)文件庫。3/10/2024

一般情況下均選擇“ARMExecutabelImage”,然后在“Projectname:”欄輸入工程名稱,在“Location:”欄指定路徑,本例子的工程名稱為“l(fā)edflash”,點擊確定后“l(fā)edflash”工程建立。注意路徑設(shè)置和工程名不要使用漢字。

3/10/2024工程建立以后將生成一個空的工程管理窗口,接下來就是向工程內(nèi)添加和建立目標(biāo)文件了。先通過點擊右鍵選擇“CreateGroup”,建立一個“SRC”文件夾,然后再右鍵選擇“AddFiles…”來添加文件,如下圖。3/10/2024

在添加文件的過程中你可能已經(jīng)發(fā)現(xiàn)了CodeWarriorIDE為用戶建立了三個Target,分別是“DebugRel”、“Realse”、“Debug”,這三個Target分別表示三種調(diào)試方式。

DebugRel

表示在生成目標(biāo)的時候會為每一個源文件生成調(diào)試信息;

Debug

表示為每一個源文件生成最完全的調(diào)試信息;

Release

表示不生成任何調(diào)試信息。

3/10/2024一般默認(rèn)選擇“DebugRel”。同樣的方法增加SRC文件的一些頭文件,這些頭文件可以加也可以不加,如果不加,那么最好放在當(dāng)前的目錄下。至此工程建立完畢。如下圖。3/10/2024工程建立完畢之后暫時還不能進行編譯和鏈接,還需要進行一些配置??梢酝ㄟ^“Edit”->“DebugRelSettings”或者“ALT+F7”或者點擊上圖中紅色小圈內(nèi)的快捷圖標(biāo)來進入“DebugRelSettings”。如下圖。3/10/2024“DebugRelSettings”里面包含了很多設(shè)置信息,“Post-Linker”用于對輸出文件進行操作,由于本例是需要最終寫入到硬件中并運行的,所以必須進行設(shè)置。選擇“ARMfromELF”,表示編譯后生成映象文件〔Image〕后再調(diào)用FromELF命令進行格式轉(zhuǎn)換,以轉(zhuǎn)換成.bin或者.hex等可以直接燒寫到目標(biāo)芯片執(zhí)行的文件。點擊Target里面的FileMappings即是文件映射,里面放有ADS調(diào)試時所支持的文件格式,如CPP、C++,C等,如下圖。3/10/20243/10/2024

“LanguageSettings”選項是調(diào)試程序時所支持的語言格式。

本例使用了“ARMAssembler”程序所對應(yīng)的.s文件和“ARMCCompiler”程序所對應(yīng)的是.c文件,所以請確保在這兩個選項內(nèi)的“Target”子選項內(nèi)為“ARM920T”,因為MY2410開發(fā)板的體系結(jié)構(gòu)為ARM920T,其他沒有用到的語言可以不選,因為下載到板上的程序使用了C語言和匯編語言。

3/10/2024設(shè)置“Linker”選項在該選項里面有和硬件緊密相關(guān)的設(shè)置,首先進入“ARMLinker”子選項,然后在選擇Output按鍵,再選中“simple”。在此,需要設(shè)置入口地址〔entry〕:RO地址、RW地址,ROBASE只讀基址,存放代碼段;RWBASE讀寫基址,存放數(shù)據(jù)段本例中可不設(shè)。

3/10/2024

首先設(shè)置R0/RW地址,RO表示ReadOnly,RW表示ReadWrite,RO欄默認(rèn)是0x8000,需要根據(jù)實際硬件進行更改,一般為RO表示本程序運行時SDRAM的起始地址,設(shè)0x30000000。

再選linktype(鏈接類型)選擇simple-簡單鏈接,partia(是否分塊),Scattered(是否分散),在“ARMLinker”->“Options”內(nèi)還需要設(shè)置一個“Imageentrypoint”,表示映象文件的入口點—就是SDRAM中的起始地址。3/10/2024設(shè)置“Layout”設(shè)置代碼中的哪一段置于IMAGE的起始位置:〔即是整個程序入口的函數(shù)調(diào)用,因為程序MAKE以后,整個程序生成的入口在2410init.s文件當(dāng)中〕,ENTER就是程序生成入口點,其中AREA表示段標(biāo)識,Init表示段名,CODE表示代碼段,READONLY表示只讀屬性,2410init.s文件要進行編譯生成相應(yīng)的.o文件,需要在object/smybol(目標(biāo)和記號)表上2410init.o表示程序執(zhí)行時候生成可執(zhí)行的.o文件,section(進入點-即入口的函數(shù)名,init函數(shù))就是init函數(shù)。通過上述設(shè)置后,然后進行編譯、鏈接,這樣產(chǎn)生的映像文件就有了唯一的程序入口點。3/10/20243/10/2024在“Linker”選項下還有一個子選項需要進行設(shè)置,即“ARMfromELF”,在“Target”的“Post-Linker”設(shè)置成“FromELF”后,才會有多種輸出文件格式的選擇:比方我們要生成plainbinary的二進制文件plainbinary,就選擇plainbinary,一般設(shè)置成“Plainbinary”或者“Intel32bithex”。如下圖。3/10/20243/10/2024

進行輸出文件名稱和路徑的設(shè)置,請帶上擴展名.bin或者.hex。當(dāng)工程文件是從別處copy過來的時候請記得對該路徑進行重新設(shè)置,不然將出現(xiàn)警告提示。

3/10/2024

如果你的工程文件是從別處copy過來的那么在編譯之前還有一件事情需要做,即“RemoveObjectCode”,在選項在“Project”菜單下面。如果紅圈內(nèi)的.c文件前面沒有勾的圖標(biāo)的話表示該工程已經(jīng)編譯鏈接通過,如果需要重新編譯那么需要先進行“RemoveObjectCode”操作以去除一些和路徑、目標(biāo)文件等有關(guān)聯(lián)的信息。3/10/2024到此為止已經(jīng)完成根本設(shè)置,接下來可以進行編譯和鏈接。進行“RemoveObjectCode”操作后,然后“Project”->“Make表示只編譯不鏈接”或者F7,如果一切設(shè)置正確,進行編譯。如果有錯誤和警告請一一改正,直至編譯通過。

3/10/2024

最終生成可執(zhí)行文件led.bin/led.hex〔因具體設(shè)置而異〕和調(diào)試文件led.axf〔映象文件〕。其中可執(zhí)行文件的路徑由用戶在“LINKER”->“ARMfromELF”中的設(shè)置所決定;而調(diào)試文件〔映象文件〕“l(fā)ed.axf“那么默認(rèn)生成在“..\led\led_Data\DebugRel”下。led.bin/led.hex可以通過工具軟件直接燒入目標(biāo)芯片運行。led.axf可以通過ADS里面集成的AXD調(diào)試工具進行調(diào)試,可以軟件仿真或者外部通過第三方JTAG調(diào)試工具進行調(diào)試。3/10/20242.AXD調(diào)試AXD是ADS軟件中獨立于CodeWarriorIDE的圖形軟件,翻開AXD軟件,默認(rèn)是翻開的目標(biāo)是ARMulator。這也是調(diào)試的時候最常用的一種調(diào)試工具,即軟件仿真。使用AXD必須首先要生成包含有調(diào)試信息的程序,在前面的led工程中,已經(jīng)生成的led.axf就是包含有調(diào)試信息的可執(zhí)行ELF格式的映像文件。

3/10/20241〕設(shè)置環(huán)境在做ADS調(diào)試之前,首先進行“ARMulator”仿真-就是配置好AXD的調(diào)試環(huán)境,“ARMulator”仿真一般是在不具備硬件條件的情況下進行軟件仿真,多用于學(xué)習(xí)狀態(tài),并不能完全反映實際硬件運行狀態(tài)。3/10/2024

方法一:

利用BANYANII軟件和Wiggler板JTAG調(diào)試。首先需要安裝BANYANII軟件,并在調(diào)試前先運行它。注意:BANYAN支持Wiggler和Predefined兩種簡易JTAG調(diào)試工具,由于我們使用的是兼容的簡易WigglerJTAG調(diào)試工具,所以在InterfaceDevice里面設(shè)置成“Wiggler”,一般默認(rèn)情況即為“Wiggler”,如果設(shè)置不正確將不能找到目標(biāo)芯片MY2410。3/10/2024在完成硬件設(shè)置后即可檢測JTAG工具能否連上目標(biāo)板上的了,請點擊Detect菜單項選擇項,如果連接正確將真正檢測ARM920T核,如果連接錯誤將出現(xiàn)錯誤提示。在AXD軟件里面通過“Option”->“ConfigureTarget”設(shè)置“TargetEnviroments”。

3/10/2024

安裝完Banyan后,在:開始->程序->Banyan中翻開Daemon,點出菜單欄下的DEBUG綠色箭頭圖標(biāo),翻開AXD調(diào)試器。接上Wiggler仿真器,翻開ARM開發(fā)板電源,點擊以下圖所示的‘AUTOCONFIGURE’圖標(biāo)。軟件會自動檢測到開發(fā)板上的CPU。3/10/20243/10/2024方法二:利用調(diào)試代理軟件H-JTAG進行調(diào)試。1)將wiggler小板(配件中標(biāo)注ARMWiggler的小板)與my2410板上的JTAG口〔標(biāo)注Jtag〕通過20芯帶線進行連接,wiggler25芯的那端直接接PC并口。2)開發(fā)板上電,翻開H-JTAG,將自動檢測到ARM920T,如果沒有檢測,點一下:Operations->DetectTarget,如以下圖所示。3/10/20243/10/20242〕在AXD中翻開調(diào)試文件可以有兩種方法翻開AXF文件:一是在make完成后通過“Project”->“Debug”或者F7進入AXD另外也可以通過“開始”->“程序”->“ARMDeveloperSuite”->“AXD”翻開AXD,然后再在菜單“File”中選擇“Loadimage…”選項,翻開LoadImage對話框,找到要裝載的.axf映像文件,點擊“翻開”按鈕,就把映像文件裝載到目標(biāo)內(nèi)存中了。在所翻開的映像文件中會有一個藍(lán)色的箭頭指示當(dāng)前執(zhí)行的位置。3/10/20243〕AXD環(huán)境設(shè)置翻開AXD,默認(rèn)沒有設(shè)置之前,是ARM7TDMI。點擊Options->ConfigureTarget,出現(xiàn)如下圖窗口。3/10/2024點擊“Add”按鈕,在電腦相關(guān)目錄下找到banyan.dll,然后添加它。選擇Banyan,點擊OK退出,發(fā)現(xiàn)AXD里面已經(jīng)找到ARM920T了。4〕開始調(diào)試點擊File->LoadImage,加載axf文件。再點擊Execute->Go〔或按F5按鍵〕,程序?qū)⑻D(zhuǎn)到整個程序的入口點ENTER處,就可以進行單步運行調(diào)試了。出現(xiàn)如下圖窗口。3/10/20243/10/2024常用調(diào)試工具條如下圖。接下來進行單步運行StepIn。3/10/20243/10/20243/10/2024系統(tǒng)的初始化

基于ARM的芯片多數(shù)為復(fù)雜的片上系統(tǒng),這種復(fù)雜系統(tǒng)里的多數(shù)硬件模塊都是可配置的,需要由軟件來設(shè)置其需要的工作狀態(tài)。

因此在用戶的應(yīng)用程序之前,需要由專門的一段代碼來完成對系統(tǒng)的初始化。

5.3ARM的啟動過程分析3/10/2024

由于這類代碼直接面對處理器內(nèi)核和硬件控制器進行編程,所以一般都是用匯編語言。系統(tǒng)的初始化局部包括兩個級別的操作:◆系統(tǒng)運行環(huán)境初始化◆應(yīng)用程序初始化。3/10/20241.系統(tǒng)運行環(huán)境初始化對于嵌入式應(yīng)用系統(tǒng)和具有操作系統(tǒng)支持的應(yīng)用系統(tǒng)來說,相同運行環(huán)境初始化局部的工作有時是不同的。對于有操作系統(tǒng)支持的應(yīng)用系統(tǒng)來說,在操作系統(tǒng)啟動時將會初始化系統(tǒng)的工作環(huán)境。操作系統(tǒng)在加載應(yīng)用程序后,將控制權(quán)轉(zhuǎn)交到應(yīng)用程序的main()函數(shù)。然后,C運行時庫的_main()初始化應(yīng)用程序。對于嵌入式應(yīng)用系統(tǒng)來說,由于沒有操作系統(tǒng)的支持,存放在ROM的代碼必須進行所有的初始化工作。因此,系統(tǒng)運行環(huán)境的初始化工作主要包括以下的內(nèi)容:3/10/20241〕設(shè)置初始入口點初始入口點是映象文件運行時的入口點,每個映像文件只有一個唯一的初始入口點,它保存在ELF頭文件中。如果映像文件是被操作系統(tǒng)加載的,操作系統(tǒng)正是通過跳轉(zhuǎn)到該初始入口點處執(zhí)行來加載該映像文件的。初始入口點必須滿足下面兩個條件:〔1〕初始入口點必須位于映像文件的可執(zhí)行區(qū)域?!?〕包含初始入口點的可執(zhí)行域不能被覆蓋,它的加載時地址和運行時地址必須是相同的〔這種域稱為固定域rootregion〕。3/10/20242〕設(shè)置中斷向量表如果系統(tǒng)運行時,地址0x00處為ROM,那么相同的異常中斷向量表是固定的,程序在運行過程中不能修改異常中斷向量表。如果系統(tǒng)運行時,地址0x00處為RAM,那么系統(tǒng)初始化時必須重建異常中斷向量表。3〕初始化存儲系統(tǒng)4〕初始化數(shù)據(jù)棧指針5〕初始化關(guān)鍵的IO設(shè)備指那些必須在使能IRQ和IFQ之前進行初始化的IO設(shè)備。3/10/20246〕設(shè)置中斷昔日需要的RAM變量7〕使能異常中斷通過清楚CPSR存放器的中斷禁止位實現(xiàn)。8〕切換處理器模式直到目前為止,系統(tǒng)還處于特權(quán)模式。如果下面要運行的應(yīng)用程序是在用戶模式下運行,就需要將處理器切換到用戶模式。9〕切換程序狀態(tài)所有的RAM內(nèi)核都是從ARM狀態(tài)開始執(zhí)行的。3/10/20242、應(yīng)用程序初始化1〕將已經(jīng)初始化的數(shù)據(jù)搬運到可寫的數(shù)據(jù)區(qū)。在嵌入式系統(tǒng)中,已經(jīng)初始化的數(shù)據(jù)在映像文件運行之前通常保存在ROM中,在程序運行過程中這些數(shù)據(jù)可能需要被修改。因而,在映像文件運行之前需要將這些數(shù)據(jù)搬運到可寫的數(shù)據(jù)區(qū)。這局部數(shù)據(jù)就是映像文件中的RW屬性的數(shù)據(jù)。2〕在可寫存儲區(qū)建立ZI屬性的可寫數(shù)據(jù)區(qū)。3/10/2024通常在映像文件運行之前,也就是保存在ROM時,映像文件中沒有包含ZI屬性的數(shù)據(jù)。在運行映像文件時,在系統(tǒng)的可寫的數(shù)據(jù)區(qū)建立ZI屬性的數(shù)據(jù)區(qū)。如果應(yīng)用程序中包含了函數(shù)main(),編譯器在編譯該函數(shù)時,將引用符號_main。這樣,連接器在連接時將包含C運行時庫中的相應(yīng)內(nèi)容。_main可以完成這局部應(yīng)用程序的初始化。如果應(yīng)用程序中沒有包含函數(shù)main(),應(yīng)用程序中需要包括進行這局部應(yīng)用程序的初始化。3/10/2024初始化程序分析

2410INIT.S是S3C2410的初始化啟動代碼程序,現(xiàn)在分析主要程序代碼如下:1.定義程序入口地址

初始化程序中必須指明入口地址,處理器復(fù)位后,PC要找到入口開始執(zhí)行代碼,當(dāng)各種異?;蛑袛喈a(chǎn)生時也要找到各個異常的入口開始執(zhí)行代碼。在2410INIT.S程序中,由AREA偽操作定義:

AREAInit,CODE,READONLYENTRY

3/10/20242.建立異常向量以及中斷處理

ARM要求中斷向量表必須放置在從0地址開始,連續(xù)8X4字節(jié)的空間內(nèi)。每當(dāng)一個中斷發(fā)生以后,ARM處理器便強制把PC指針置為向量表中對應(yīng)中斷類型的地址值。因為每個中斷只占據(jù)向量表中1個字的存儲空間,只能放置一條ARM指令,使程序跳轉(zhuǎn)到存儲器的其他地方,再執(zhí)行中斷處理。

3/10/20241)建立中斷向量入口AREAInit,CODE,READONLYENTRYBResetHandlerBUndefHandlerBSWIHandlerBPreAbortHandlerBDataAbortHandlerBBIRQHandlerBFIQHandler其中關(guān)鍵字ENTRY是指定編譯器保存這段代碼,因為編譯器可能會認(rèn)為這是一段亢余代碼而加以優(yōu)化。鏈接的時候要確保這段代碼被鏈接在0地址處,并且作為整個程序的入口。3/10/20242〕建立中斷效勞程序入口地址表下面這段程序是中斷效勞程序入口地址表。該程序段首先用偽指令A(yù)REA定義了一個可以讀寫的數(shù)據(jù)段,再用偽指令^〔MAP〕定義首地址為_ISR_STARTADDRESS的結(jié)構(gòu)化內(nèi)存表,最后用#〔FIELD〕定義內(nèi)存表中的數(shù)據(jù)域。ALIGN;字對齊AREARamData,DATA,READWRITE^_ISR_STARTADDRESS;_ISR_STARTADDRESS在option.inc中定義,其值為0x33ffff00。HandleReset#4HandleUndef#4HandleSWI#4HandlePabort#4HandleDabort#4HandleReserved#4HandleIRQ#4HandleFIQ#43/10/2024定義完成后,其它的指令通過引用#前的標(biāo)號〔如HandleEINT0等〕來寫入或讀出對應(yīng)的中斷效勞程序的入口地址。下面程序?qū)RQ中斷效勞程序的IsrIRQ標(biāo)號地址保存到內(nèi)存表的HandleIRQ數(shù)據(jù)域中。;SetupIRQhandlerldrr0,=HandleIRQ;Thisroutineisneededldrr1,=IsrIRQ;ifthereisn't'subspc,lr,#4'at0x18,0x1cstrr1,[r0]3/10/2024下面程序表示是從IRQ中斷入口〔0x18〕跳轉(zhuǎn)執(zhí)行的程序,它從內(nèi)存表的HandleIRQ數(shù)據(jù)域中讀取IRQ中斷效勞程序的入口地址〔IsrIRQ〕給PC,并執(zhí)行該中斷效勞程序。HandlerIRQsubsp,sp,#4;decrementsp(tostorejumpaddress)stmfdsp!,{r0};PUSHtheworkregistertostackldrr0,=HandleIRQ;loadtheaddressofHandleXXXtor0ldrr0,[r0];loadthecontents(serviceroutinestartaddress)ofHandleXXXstrr0,[sp,#4];storethecontents(ISR)ofHandleXXXtostackldmfdsp!,{r0,pc};POPtheworkregisterandpc(jumptoISR)

3/10/2024注意:①內(nèi)存表中的中斷源排列順序是固定的,不能隨便改,前面的8個〔HandleReset~HandleFIQ〕是由ARM處理器的中斷異常入口地址順序決定的,后面的32個〔HandleEINT0~HandleADC〕是由是s3c2410的INTOFFSET存放器偏移值對應(yīng)的中斷源順序決定的,這樣就可以根據(jù)INTOFFSET的值查找到產(chǎn)生中斷的中斷源在該表中的中斷處理函數(shù)入口地址。3/10/2024在上面的2410addr.h文件中進行了中斷向量地址定義://ISR#definepISR_RESET(*(unsigned*)(_ISR_STARTADDRESS+0x0))#definepISR_UNDEF(*(unsigned*)(_ISR_STARTADDRESS+0x4))......在上面的2410addr.inc文件中同樣進行了中斷向量地址定義:;ISR;=================pISR_RESETEQU(_ISR_STARTADDRESS+0x0)

pISR_UNDEFEQU(_ISR_STARTADDRESS+0x4)......

在2410INIT.S中是通過下面語句引用頭文件的。

GEToption.incGETmemcfg.incGET2410addr.inc3/10/2024②上面的程序是調(diào)用下面程序定義了一段宏程序由于各個中斷都有相同的處理代碼,后面程序中的語句“HandlerxxxHANDLERHandlexxx”都將被這段程序展開。這段程序把中斷效勞程序的首地址裝載到PC中。在宏位操作中,“$HandlerLabelHANDLER$HandleLabel”語句中,$HandlerLabel是標(biāo)號,HANDLER是宏名稱,$HandleLabel是宏的參數(shù)。3/10/2024

MACRO$HandlerLabelHANDLER$HandleLabel$HandlerLabelsubsp,sp,#4;decrementsp(tostorejumpaddress)stmfdsp!,{r0};PUSHtheworkregistertostackldrr0,=$HandleLabel;loadtheaddressofHandleXXXtor0ldrr0,[r0];loadthecontents(serviceroutinestartaddress)ofHandleXXXstrr0,[sp,#4];storethecontents(ISR)ofHandleXXXtostackldmfdsp!,{r0,pc};POPtheworkregisterandpc(jumptoISR)MEND

3/10/20243〕看門狗與中斷禁止當(dāng)系統(tǒng)復(fù)位后,看門狗與中斷要被首先禁止與被初始化,否那么,當(dāng)看門狗溢出產(chǎn)生的系統(tǒng)復(fù)位,引起中斷,其它中斷源產(chǎn)生中斷時,CPU會進入一個未知的狀態(tài),出現(xiàn)程序跑飛等現(xiàn)象。ResetHandlerldrr0,=WTCON;禁止看門狗的所有功能〔定時器定時、溢出中斷和溢出復(fù)位〕ldrr1,=0x0strr1,[r0]ldrr0,=INTMSKldrr1,=0xffffffff;禁止所有的中斷產(chǎn)生strr1,[r0]ldrr0,=INTSUBMSKldrr1,=0x7ff;禁止所有的子中斷產(chǎn)生strr1,[r0]3/10/20244〕系統(tǒng)時鐘初始化LOCKTIME是PLL(鎖相環(huán))鎖定時間計數(shù)存放器。重新設(shè)定分頻值時,PLL進入鎖定,輸出穩(wěn)定頻率的時鐘需要一定時間。下面程序設(shè)置LOCKTIME為0xffffff,MPLLCON為主時鐘鎖相環(huán)控制存放器,用于設(shè)置MPLL的分頻系數(shù)。

;ToreducePLLlocktime,adjusttheLOCKTIMEregister.ldrr0,=LOCKTIMEldrr1,=0xffffffstrr1,[r0][PLL_ON_START;ConfigureMPLLldrr0,=MPLLCONldrr1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV);Fin=12MHz,Fout=50MHzstrr1,[r0]]3/10/20245〕電源低功耗模式GSTATUS2為復(fù)位狀態(tài)存放器,它該存放器的0,1,2三位分別對應(yīng)上電復(fù)位,掉電模式和看門狗復(fù)位。下面程序通過判斷存放器的第2位來確定處理器是否從掉電模式喚醒,如果是從掉電模式喚醒那么跳到掉電喚醒模式處理程序。

;Checkifthebootiscausedbythewake-upfromPOWER_OFFmode.ldrr1,=GSTATUS2ldrr0,[r1]tstr0,#0x2;Incaseofthewake-upfromPOWER_OFFmode,gotoPOWER_OFF_WAKEUPhandler.bneWAKEUP_POWER_OFF3/10/2024;voidEnterPWDN(intCLKCON);EnterPWDNmovr2,r0;r2=rCLKCONtstr0,#0x8;POWER_OFFmode?bneENTER_POWER_OFF;判斷CLKCON的POWER_OFF來確定是否為掉電模式。3/10/2024下面是進入STOP模式,首先設(shè)定使SDRAM自刷新,再設(shè)置CLKCON使其進入STOP模式,其中的延時為等待確保進入STOP模式。當(dāng)從STOP模式喚醒后,退出SDRAM自刷新模式,然后將LR存放器的值傳給PC而返回到當(dāng)初調(diào)用的C語言程序中。3/10/2024ENTER_STOPldrr0,=REFRESHldrr3,[r0];r3=rREFRESHmovr1,r3orrr1,r1,#BIT_SELFREFRESHstrr1,[r0];EnableSDRAMself-refreshmovr1,#16;waituntilself-refreshisissued.maynotbeneeded.0subsr1,r1,#1bne%B0ldrr0,=CLKCON;enterSTOPmode.strr2,[r0]movr1,#320subsr1,r1,#1;1)waituntiltheSTOPmodeisineffect.bne%B0;2)OrwaithereuntiltheCPU&Peripheralswillbeturned-off;EnteringPOWER_OFFmode,onlytheresetbywake-upisavailable.ldrr0,=REFRESH;exitfromSDRAMselfrefreshmode.strr3,[r0]

MOV_PC_LR3/10/2024下面是進入POWER_OFF模式,和STOP模式根本相同。首先設(shè)定使SDRAM自刷新,再保護好SDRAM的時鐘,設(shè)置CLKCON使其進入掉電模式,再調(diào)用b.指令進行原地死循環(huán)。

ldrr0,=REFRESHldrr1,[r0];r1=rREFRESHorrr1,r1,#BIT_SELFREFRESHstrr1,[r0];EnableSDRAMself-refreshmovr1,#16;Waituntilself-refreshisissued,whichmaynotbeneeded.0subsr1,r1,#1bne%B0ldrr1,=MISCCRldrr0,[r1]orrr0,r0,#(7<<17);MakesurethatSCLK0:SCLK->0,SCLK1:SCLK->0,SCKE=Lduringboot-upstrr0,[r1]ldrr0,=CLKCONstrr2,[r0]b.;CPUwilldiehere.3/10/2024掉電喚醒處理,從掉電喚醒后,先要釋放SDRAM的時鐘SCLK0、SCLK1和SCKE。然后設(shè)置內(nèi)存控制存放器,初始化各個內(nèi)存bank的總線寬度、各種時序,SDRAM退出自刷新而轉(zhuǎn)成自動刷新。

WAKEUP_POWER_OFF;ReleaseSCLKnafterwake-upfromthePOWER_OFFmode.ldrr1,=MISCCRldrr0,[r1]bicr0,r0,#(7<<17);SCLK0:0->SCLK,SCLK1:0->SCLK,SCKE:L->Hstrr0,[r1]

;Setmemorycontrolregistersldrr0,=SMRDATAldrr1,=BWSCON;BWSCONAddressaddr2,r0,#52;EndaddressofSMRDATA0ldrr3,[r0],#4strr3,[r1],#4cmpr2,r0bne%B0movr1,#2560subsr1,r1,#1;1)waituntiltheSelfRefreshisreleased.bne%B0ldrr1,=GSTATUS3;GSTATUS3hasthestartaddressjustafterPOWER_OFFwake-upldrr0,[r1]movpc,r03/10/20246〕內(nèi)存控制器初始化存儲器端口的接口時序優(yōu)化是非常重要的,這會影響到整個系統(tǒng)的性能。因為一般系統(tǒng)運行的速度瓶頸都存在于存儲器訪問,所以存儲器訪問時序應(yīng)盡可能的快;而同時又要考慮到由此帶來的穩(wěn)定性問題。在不同的板子上處理芯片、存儲設(shè)備以及其接口差異很大,應(yīng)根據(jù)不同的情況來配置。

3/10/2024通常Flash和SRAM同屬于靜態(tài)存儲器類型,可以合用同一個存儲器端口;而DRAM因為有動態(tài)刷新和地址線復(fù)用等特性,通常配有專用的存儲器端口。下面程序是對S3C2410的存儲器Bank[7:0]進行設(shè)置,使其用CS[7:0]擴展的存儲器或外部設(shè)備能夠通過處理器的內(nèi)存控制器正確讀/寫。下面的程序是功能存放器數(shù)值的定義:3/10/2024

LTORGSMRDATADATA;Memoryconfigurationshouldbeoptimizedforbestperformance;Thefollowingparameterisnotoptimized.;Memoryaccesscycleparameterstrategy;1)ThememorysettingsissafeparametersevenatHCLK=75Mhz.;2)SDRAMrefreshperiodisforHCLK=75Mhz.DCD(0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))DCD((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC));GCS0DCD((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC));GCS1DCD((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))

;

GCS2

DCD((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))

;GCS3

DCD((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC));GCS4DCD((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))

;GCS5DCD((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN));GCS6DCD((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN));GCS7;DCD((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT);TchrnotusedbitDCD((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+REFCNT);DCD0x32;SCLKpowersavingmode,ARMcoreburstdisable,BANKSIZE128M/128MDCD0xb2;SCLKpowersavingmode,ARMcoreburstenable,BANKSIZE128M/128MDCD0x30;MRSR6CL=3clkDCD0x30;MRSR7;DCD0x20;MRSR6CL=2clk;DCD0x20;MRSR73/10/2024上述代碼中的參數(shù)在下面的memcfg.inc中定義。;NAME:MEMCFG.A;DESC :Memorybankconfigurationfile;Revision:02.28.2002ver0.0;MemoryArea;GCS616bit(16MB)SDRAM(0x0c000000-0x0cffffff);GCS716bit(16MB)SDRAM(0x0d000000-0x0dffffff);or;GCS632bit(32MB)SDRAM(0x0c000000-0x0dffffff)

;BWSCONDW8 EQU (0x0)DW16 EQU (0x1)DW32 EQU (0x2)WAIT EQU (0x1<<2)UBLB EQU (0x1<<3) ASSERT:DEF:BUSWIDTH[BUSWIDTH=16B1_BWSCON EQU(DW16)B2_BWSCON EQU(DW16)B3_BWSCON EQU(DW16)B4_BWSCON EQU(DW16)B5_BWSCON EQU(DW16)3/10/2024下面的程序?qū)⒐δ艽娣牌鞯臄?shù)值依次傳給實際的內(nèi)存控制器的每個特殊功能存放器中。;Setmemorycontrolregistersldrr0,=SMRDATAldrr1,=BWSCON;BWSCONAddressaddr2,r0,#52;EndaddressofSMRDATA0ldrr3,[r0],#4strr3,[r1],#4cmpr2,r0bne%B03/10/20247〕模式的堆棧初始化地址因為ARM有7種執(zhí)行狀態(tài),每一種狀態(tài)的堆棧指針存放器〔SP〕都是

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論