ADS下关于ARM程序的问题,望大家指教

[复制链接]
2507|7
 楼主| jdwang001 发表于 2012-11-29 13:40 | 显示全部楼层 |阅读模式
本帖最后由 jdwang001 于 2012-11-29 14:02 编辑

自己有单片机开发的经验,用过51,AVR。最近买了块友善之臂的的MINI2440开发板,打算开始学习ARM。已经有一个星期了,感觉还是不得其门而入,参照了许多书籍,可是一一对照还是没有完成想要的操作,真有王国维说的 “昨夜西风凋碧树,独上高楼,望尽天涯路”的感觉。在入门过程中发现不少问题,望大家指教一二。首先说ADS1.2的开发,买到板子后,就想先进行裸奔来玩点小实验,就依照最简单的对LED流水灯的操作开始吧,对IDE各个参数的配置见图。
引用代码:
  1. #include "def.h"
  2. #include "option.h"
  3. #include "2440addr.h"
  4. #include "2440lib.h"
  5. #include "2440slib.h"
  6. //================================

  7. void dely(U32 tt)
  8. {
  9. U32 i;
  10. for(;tt>0;tt--)
  11. {
  12. for(i=0;i<10000;i++){}
  13. }
  14. }


  15. int Main(int argc, char **argv)
  16. {
  17. int i;
  18. U8 key;
  19. U32 mpll_val=0;
  20. int data;

  21. mpll_val = (92<<12)|(1<<4)|(1);

  22. //init FCLK=400M, so change MPLL first


  23. ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);
  24. ChangeClockDivider(key, 12);


  25. //MMU_EnableICache();
  26. //MMU_EnableDCache();

  27. MMU_DisableICache();
  28. MMU_DisableDCache();

  29. rGPBCON = 0x155555;


  30. data = 0x06;
  31. while(1)
  32. {

  33. rGPBDAT = (data<<5);
  34. dely(120);
  35. data =~data;
  36. }

  37. return 0;
  38. }

ChangeClockDivider(key, 12); 这段语句注释后,系统程序不能正常运行,而根据数据手册来说,时钟若是开始没有设置的话,应该直接是外部时钟输入也就是板子上的12MHz,在2440init.s中发现操作MPLLCON的也只有这段:
  1. [ PLL_ON_START
  2. ; Added for confirm clock divide. for 2440.
  3. ; Setting value Fclk:Hclkclk
  4. ldr        r0,=CLKDIVN
  5. 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.
  6. str        r1,[r0]

  7. ;Configure UPLL
  8. ldr        r0,=UPLLCON
  9. ldr        r1,=((U_MDIV<<12)+(U_PDIV<<4)+U_SDIV)
  10. str        r1,[r0]

  11. nop        ; Caution: After UPLL setting, at least 7-clocks delay must be inserted for setting hardware be completed.
  12. nop
  13. nop
  14. nop
  15. nop
  16. nop
  17. nop
  18. ;Configure MPLL
  19. ldr        r0,=MPLLCON
  20. ldr        r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV)
  21. str        r1,[r0]
  22. ]

大家能解释下是什么原因吗?我感觉程序只需要包含必要的启动文件和头文件后,只需要在主函数中设置下端口输出电平就可以正常操作led的啊。关于keil调试ARM的方法也请大家帮忙指点下,我找的教程已经是很详细了但是依旧没有完成想要的操作。程序编译生成bin都没问题,可是软件仿真时就已经通不过。

板子主要参数SDRAM地址0x30000000大小为64M。
nond flash为256M,板载nor flash 2M。
也想大家推荐下快速入门的书,最好有实例教程解释的。
也打算直接开始学习linux系统,可是这底层没有非常熟悉,心里没底。感觉不好啊。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
阿南 发表于 2012-11-29 14:27 | 显示全部楼层
系统程序不能正常运行,是指什么?是程序直接死机了,还是没有得到你想得到结果。
 楼主| jdwang001 发表于 2012-11-29 14:51 | 显示全部楼层
2# 阿南 针对于ADS1.2编译器,将ChangeClockDivider(key, 12); 注释后,程序并没有按照自己想要的结果运行。增加上正常。
jlass 发表于 2012-11-29 15:26 | 显示全部楼层
将ChangeClockDivider(key, 12); 注释后,程序并没有按照自己想要的结果运行。

看上去像是配置时钟分频比的,应该不能随便去掉吧
 楼主| jdwang001 发表于 2012-11-29 15:40 | 显示全部楼层
是啊,可是数据手册上显示不应该有这个问题的。
dlliulu 发表于 2012-11-29 16:09 | 显示全部楼层
普遍存在这个问题,建议lz还是先把初始化程序那部分代码了解了解吧
阿南 发表于 2012-11-29 18:10 | 显示全部楼层
6楼说的有道理,要去深入理解时钟改了之后为什么引起你的那部分问题。
其实时钟改了之后,什么情况都有可能发生的,主要是看到底改成什么样了。
 楼主| jdwang001 发表于 2012-11-29 19:38 | 显示全部楼层
初始化部分就是按照数据手册上的推荐的方式来进行时钟的修改。
问题的话,等我把电脑并口弄好了仿真下看看,等我学会了ARM就写点小教程。和大家分享啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

316

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部