mini2440----keil for ARM下的調試與下載環(huán)境的搭建
題外話:編譯環(huán)境選擇推薦
對于剛剛接觸ARM裸機編程的各位,我要特別的進行提醒一下,就是關于編譯環(huán)境的選擇問題。目前主流的有ADS+AXD,KEIL FOR ARM,IAR FOR ARM三種,我開始使用的ADS+AXD進行學習,因為光盤里面自帶,而且很多資料都是他的,但是個人感覺真心調試十分的不方便,而且各種容易死機,并且現(xiàn)在也已經(jīng)不更新了,北航一本講嵌入式的書出了一個第二版,就是把ADS換成了KEIL,而且以后KEIL會是主流,因此我推薦選擇KEIL進行學習。IAR聽我一個同學說也十分好用,但是在網(wǎng)上找有關方面的資料不是很多。而且我想北航一群教授編書都用KEIL進行,說明KEIL自有他的優(yōu)勢,書上這么說了,那以后會有更多學生用,這樣慢慢也會更加流行與主流。閑話就說這些。
正題:Keil for ARM的環(huán)境搭建
提醒一下各位就是在keil for ARM進行環(huán)境搭建的時候,要注意調試時環(huán)境搭建與下載環(huán)境的搭建是不同的,因為在下載環(huán)境搭建的時候是把程序下載到nor flash里面直接進行運行,而調試環(huán)境是把程序下載到RAM里面進行執(zhí)行。nor flash里面也可以進行調試環(huán)境的搭建,但是在nor flash里面只能建立兩個端點,而且flash擦寫次數(shù)有限對壽命有影響。所以不推薦。所以調試的時候推薦在RAM里面進行調試。
配置方法的測試環(huán)境:MDK 4.11 JLINK 4.08 開發(fā)板是mini2440 其他的環(huán)境配置類似,
首先介紹關于程序下載的方法
①建立一個project芯片選擇S3C2440(在SAMSUNG里面)并且加入啟動代碼。
②編輯自己的測試程序。
測試程序如下
#include
voiddelay()
{
inti,j;
for(i=0;i<10000;i++)
{
for(j=0;j<50;j++);
}
}
intmain()
{
GPBCON=0x155555;
while(1)
{
GPBDAT|=0x1E0;
GPBDAT&=0x1C0;
delay();
GPBDAT|=0x1E0;
GPBDAT&=0x1A0;
delay();
GPBDAT|=0x1E0;
delay();
}
}
實現(xiàn)的兩個LED循環(huán)間歇顯示。
③開始進行工程的配置,配置分為以下幾步(程序下載的配置)
第一步
也是非常要注意的一點就是:打開S3C3440.S這個文件夾,點擊configuration wizard
進入這個界面,把所有選項都勾上。
。
第二步現(xiàn)在進入Target的配置
現(xiàn)在點擊中的魔棒,出現(xiàn)配置環(huán)境。
第三部配置Target這個選項欄。配置如下
后面我會進行介紹為什么需要這樣去配置它。編譯器回根據(jù)這個環(huán)境生成一個.sct的文件與之對應,作為程序加載,執(zhí)行的一些信息。
第四步:進入output這個選項中勾選Creat HEX file,如下圖所示。
第五步:進入Utilities這個選擇中,選擇如下
因為在此我使用的是JLINK,再點擊setting進行設置,設置情況如下圖
對于flash算法的選擇可以選擇一個相近的,對于我的板子,nor flash是AM29LV160DB,因此我選擇了這個類型的nor flash,做完以上配置后,點擊OK,不斷OK就可以配置成功了。就可以編譯,沒有任何錯誤再進行下載。就可以看到LED循環(huán)點亮了。
下面是關于程序調試的配置方式。我們調試是在RAM里面進行的。
第一步:同樣需要對S3C2440.S進行configuration wizard進行勾選。如果開始已經(jīng)做了,這步略過。
第二步:進入到配置界面的Target選項欄。進行如下配置。
第三步,進入到output選項欄勾選Creat HEX file,如果已經(jīng)勾選可以略過。
第四步:進入Debug選項欄,進行如下的配置
Ext_RAM.ini(來自事例程序中)文件代碼如下并且要進行修改
FUNCvoidSetupForStart(void){
//
ProgramEntryPoint PC=0x30000000;
}
FUNCvoidInit(void){
_WDWORD(0x4A000008,0xFFFFFFFF);//DisableAllInterrupts
_WDWORD(0x53000000,0x00000000);//DisableWatchdogTimer
//ClockSetup
//FCLK=300MHz,HCLK=100MHz,PCLK=50MHz
_WDWORD(0x4C000000,0x0FFF0FFF);//LOCKTIME
_WDWORD(0x4C000014,0x0000000F);//CLKDIVN
_WDWORD(0x4C000004,0x00043011);//MPLLCON
_WDWORD(0x4C000008,0x00038021);//UPLLCON
_WDWORD(0x4C00000C,0x001FFFF0);//CLKCON
//MemoryControllerSetupforSDRAM
_WDWORD(0x48000000,0x22000000);//BWSCON
_WDWORD(0x4800001C,0x00018005);//BANKCON6
_WDWORD(0x48000020,0x00018005);//BANKCON7
_WDWORD(0x48000024,0x008404F3);//REFRESH
_WDWORD(0x48000028,0x00000032);//BANKSIZE
_WDWORD(0x4800002C,0x00000020);//MRSRB6
_WDWORD(0x48000030,0x00000020);//MRSRB7
_WDWORD(0x56000000,0x000003FF);//GPACON:EnableAddresslinesforSDRAM
}
//Resetchipwithwatchdog,becausenRSTlineisroutedonhardwareinaway
//thatitcannotbepulledlowwithULINK
_WDWORD(0x40000000,0xEAFFFFFE);//LoadRAMaddr0withbranchtoitself
CPSR=0x000000D3;//Disableinterrupts
PC=0x40000000;//PositionPCtostartofRAM
_WDWORD(0x53000000,0x00000021);//EnableWatchdog
g,0//WaitforWatchdogtoresetchip
Init();//Initializememory
LOAD.led.axfINCREMENTAL//Downloadprogram
SetupForStart();//SetupforRunning
g, main // Goto Main