第三章 裸机_第一个裸机程序(下)

1.在上一讲中,已经可以用make生成我们自己的二进制文件,现在需要将二进制文件下载到S3C2440中去运行。首先需要做的就是连接J-link,然后配置AXD。

2.首先启动AXD Debugger:在XP的开始菜单中选择 程序->ARM Developer Suite ->AXD Debugger.

启动AXD Debugger后,在AXD Debugger主界面上打开主菜单的options-》ConfigureTarget,在弹出的ChooseTarget对话框中,电机Add,将会弹出文件选择对话框,在文件打开对话框中,定位到J-Link的安装目录(默认的是C:\ProgramFiles\SEGGER\JLinkARM-V410i),在目录中选择JLinkRDI.dll打开即可。

这样添加之后,AXD可能会提示找不到JLinkARM.dll,如下图所示,

解决的办法是:先不管这个对话框,打开我的电脑,再次定位到J-Link的安装目录,将其中的JLinkARM.文件拷贝到ADS的安装目录下的Bin目录下,默认是C:\ProgramFiles\ARM\ADSv1_2\Bin),再在上面的对话框上点击确定即可。

3.使用AXD Debugger调试时的注意事项

在使用AXD Debugger调试时,需要对CPU进行基本的初始化,标准的初始化方法用AXDDebugger的初始化脚本来设置相关寄存器,相关的配置项位于AXD Debugger主菜单Options-》configureInterface-》Session File-》Run ConfigureScript下,不过,这种方式比较麻烦,它需要使用setmem命令设置相关寄存器。

更为简洁的办法是直接使用u-boot来进行初始化。

4.使用JLink来进行在线调试,点击Debugger之后,点击File-》loadimage,打开选择对话框,这时,在选择对话框中进入到工程文件夹选择后缀为.axf的文件(用于在线调试的文件)。

下载完成之后,点击AXD的中的go按钮,即可进行在线调试,在线调试实际上是将文件烧写到RAM,并没有烧写到Flash中去。

S3C2440内部是没有Flash的,如果要下载程序,只能下载到外接的nor flash或者nand flash中去。

5.裸机调试中关于时钟分频函数的疑惑

void ChangeClockDivider(int hdivn,int pdivn)

{

    // hdivn,pdivn FCLK:HCLK:PCLK

    //    0,0        1:1:1

    //    1,1        1:2:4

    //    3,1        1:3:6

    //    2,1        1:4:8   

    rCLKDIVN= (hdivn<<1) |pdivn;   

 

   if(hdivn)

       MMU_SetAsyncBusMode();

    else

       MMU_SetFastBusMode();

}

这里根据hdivn的值会选择调用相应的函数,刚接触时实在是想不通,其实这个做法在S3C2440的数据手册上是有根据的,在数据手册上Clock&PowerManagement一章中:

1. CLKDIVN should be set carefully not to exceedthe limit of HCLK and PCLK.

2. If HDIVN is not 0, the CPU bus mode has to bechanged from the fast bus mode to the asynchronous

bus mode using following instructions(S3C2440 doesnot support synchronous bus mode).

MMU_SetAsyncBusMode

mrc p15,0,r0,c1,c0,0

orr r0,r0,#R1_nF:OR:R1_iA

mcr p15,0,r0,c1,c0,0

If HDIVN is not 0 and the CPU bus mode is the fastbus mode, the CPU will operate by the HCLK.

This feature can be used to change the CPUfrequency as a half or more without affecting the HCLK

and PCLK.

6.裸机调试中关于中断初始化的疑惑

//初始化中断服务程序。当中断产生时,处理相应的程序

void Isr_Init(void)

{

pISR_UNDEF=(unsigned)HaltUndef;

pISR_SWI =(unsigned)HaltSwi;

pISR_PABORT=(unsigned)HaltPabort;

pISR_DABORT=(unsigned)HaltDabort;

rINTMOD=0x0;   // All=IRQ mode

rINTMSK=BIT_ALLMSK;   // All interrupt is masked.

}

//pISR_UNDEF=(unsigned)HaltUndef;  就是将函数HaltUndef的地址强制转换为unsigned类型,赋给指针pISR_UNDEF。由pISR_UNDEF定义知,

  

//#definepISR_UNDEF       (*(unsigned *)(_ISR_STARTADDRESS+0x4))

  

//pISR_UNDEF为相应的异常中断地址。 

//函数名称代表函数的地址,即将HaltUndef函数的地址赋值到_ISR_STARTADDRESS+0x4中。 

//当发生中断时,系统会去pISR_UNDEF定义的地址里取出中断函数的地址也就是HaltUndef的地址,然后执行. 

//就相当于当发生中断时,执行HaltUndef函数. 

  

void HaltUndef(void)

{

Uart_Printf("Undefined instruction exception!!!n");

while(1);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值