本帖最后由 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系统,可是这底层没有非常熟悉,心里没底。感觉不好啊。
|