本帖最后由 jdwang001 于 2012-11-29 14:02 编辑
自己有单片机开发的经验,用过51,AVR。最近买了块友善之臂的的MINI2440开发板,打算开始学习ARM。已经有一个星期了,感觉还是不得其门而入,参照了许多书籍,可是一一对照还是没有完成想要的操作,真有王国维说的 “昨夜西风凋碧树,独上高楼,望尽天涯路”的感觉。在入门过程中发现不少问题,望大家指教一二。首先说ADS1.2的开发,买到板子后,就想先进行裸奔来玩点小实验,就依照最简单的对LED流水灯的操作开始吧,对IDE各个参数的配置见图。
引用代码:#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
//================================
void dely(U32 tt)
{
U32 i;
for(;tt>0;tt--)
{
for(i=0;i<10000;i++){}
}
}
int Main(int argc, char **argv)
{
int i;
U8 key;
U32 mpll_val=0;
int data;
mpll_val = (92<<12)|(1<<4)|(1);
//init FCLK=400M, so change MPLL first
ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);
ChangeClockDivider(key, 12);
//MMU_EnableICache();
//MMU_EnableDCache();
MMU_DisableICache();
MMU_DisableDCache();
rGPBCON = 0x155555;
data = 0x06;
while(1)
{
rGPBDAT = (data<<5);
dely(120);
data =~data;
}
return 0;
}
将ChangeClockDivider(key, 12); 这段语句注释后,系统程序不能正常运行,而根据数据手册来说,时钟若是开始没有设置的话,应该直接是外部时钟输入也就是板子上的12MHz,在2440init.s中发现操作MPLLCON的也只有这段:
[ PLL_ON_START
; Added for confirm clock divide. for 2440.
; Setting value Fclk:Hclkclk
ldr r0,=CLKDIVN
ldr r1,=CLKDIV_VAL ; 0=1:1:1, 1=1:1:2, 2=1:2:2, 3=1:2:4, 4=1:4:4, 5=1:4:8, 6=1:3:3, 7=1:3:6.
str r1,[r0]
;Configure UPLL
ldr r0,=UPLLCON
ldr r1,=((U_MDIV<<12)+(U_PDIV<<4)+U_SDIV)
str r1,[r0]
nop ; Caution: After UPLL setting, at least 7-clocks delay must be inserted for setting hardware be completed.
nop
nop
nop
nop
nop
nop
;Configure MPLL
ldr r0,=MPLLCON
ldr r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV)
str r1,[r0]
]
大家能解释下是什么原因吗?我感觉程序只需要包含必要的启动文件和头文件后,只需要在主函数中设置下端口输出电平就可以正常操作led的啊。关于keil调试ARM的方法也请大家帮忙指点下,我找的教程已经是很详细了但是依旧没有完成想要的操作。程序编译生成bin都没问题,可是软件仿真时就已经通不过。
板子主要参数SDRAM地址0x30000000大小为64M。
nond flash为256M,板载nor flash 2M。
也想大家推荐下快速入门的书,最好有实例教程解释的。
也打算直接开始学习linux系统,可是这底层没有非常熟悉,心里没底。感觉不好啊。 |