Chinaunix首页 | 论坛 | 博客
  • 博客访问: 282490
  • 博文数量: 60
  • 博客积分: 2501
  • 博客等级: 少校
  • 技术积分: 774
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-16 13:27
文章分类

全部博文(60)

文章存档

2011年(1)

2010年(1)

2009年(58)

我的朋友

分类: 嵌入式

2009-07-26 22:44:43

    陈明计先生写的启动代码,真的是挺好的。看得出来,为了让我们用的放心,用的舒心,陈先生很费了一番心思。各反面都为我们考虑的很好,很周全。对用户来说,只要直接拿来开发用户程序就行了。
    可这对我刚开始学ARM7的时候,影响还是很大的(感觉让我兜了个圈一样)。开始我就想自己弄明白ARM及ARM开发,不想满足与开发用户程序,就是想多了解点东西。所以在我刚开始看的时候,发现LPC2200工程模板里面的很多东西,我都很不明白启动代码到底是个啥样子的。前段时间,我花了几天时间,专门找了些关于启动代码的资料。找到的好资料,我都放在前面的文章,那里面的文章讲到了启动代码,我才发现启动代码原来可以很简单(我一开始以为模板里面,除了main.c之外的全是启动代码。。。)。通过这些资料,我发现我原来的很多困惑都是跟ADS编译器有关(例如import(__use_no_semihosting_swi) 和import(__use_two_region_memory)还有.scf 还有 Image$$RO$$Limit Image$$RW$$Base等等之类的)。上网找到了ADS的手册,却发现全是英文的(傻眼了),如果时间的充裕的话,我还可以去看看英文手册,可时间不够,没这个耐心。。。。。。
    看了这些资料后,我就感觉,陈先生启动代码模板有点杂乱(可能是因为为用户考虑的太多),所以开始有了修改的念头,把一些妨碍原来我理解启动代码的东东去掉,留一个比简单一个启动代码。
    今天心情不太好,不太想看书,所以就试着修改了下陈先生的启动代码。
    我修改后启动代码的总体结构如下所述:
    工程名MY.mcp
    工程里,我自己添加了7个文件(还好吧,也不是太多),都是直接放在工程文件夹下面 (这样感觉比较爽,呵呵)  
    依次是
    (1)mem.scf 分散加载文件(我是要把程序加载到外部的FLASH中,我前面的关于ADS开发环境下的文章里面有提到);
    (2)startup.s异常向量表,堆栈初始化,还有地址重映射,时钟初始化,中断初始化等等;
    (3)LPC2294,这个不用多说了;
    (4)接下来是 config.h,和config.c,最主要的是 IRQ_Exception(void) FIQ_Exception(void)TargetInit(void) TargetResetInit(void)这几个函数。
    (5)还有个文件是main.c不多说,给用户自己添加程序的;
    (6)我还加上了irq.s,这个文件的作用,可以看我日志里面的这篇文章http://blog.chinaunix.net/u3/101120/showart.php?id=2004239,最后摘抄的那篇文章讲到了这个文件。
   
    现在来回忆下,我建这个工程的过程吧(整个工程文件见附件)。
    首先,进入ADS,新建工程,工程名字随便取。
    然后,新建文件,我新建的第一个文件是mem.scf,把陈先生的mem_a.scf拷贝过来。
    新建个startup.s,把周立功的Startup.s代码拷过来,多余的内容都去掉,我喜欢简单的东西,所以能砍的,我都砍掉了。
    新建个config.h和config.c,再把陈先生的LPC2294.h头文件也拷过来。LPC2294.h的作用大家都知道吧。
    陈先生的模板里面有target.h 里面还有些很多
      #ifdef __cplusplus
      extern "C" {
      #endif
    这类的东东,感觉实在是很妨碍那时初学者的我对ADS的理解。
    我把 target.h 和 config.h整到一起了。详细内容如下:
#ifndef __CONFIG_H 
#define __CONFIG_H
 
   #include    "LPC2294.h"
   #define TRUE  1
   #define FALSE 0
   typedef unsigned char  uint8;                /* 无符号8位整型变量  */
   typedef signed   char  int8;                 /* 有符号8位整型变量  */
   typedef unsigned short uint16;               /* 无符号16位整型变量 */
   typedef signed   short int16;                /* 有符号16位整型变量 */
   typedef unsigned int   uint32;               /* 无符号32位整型变量 */
   typedef signed   int   int32;                /* 有符号32位整型变量 */
   typedef float          fp32;                 /* 单精度浮点数(32位长度) */
   typedef double         fp64;                 /* 双精度浮点数(64位长度) */
   #define Fosc            11059200                 //应当与实际一至晶振频率,10MHz~25MHz,应当与实际一至
   #define Fcclk           (Fosc*4)                 
//系统频率,必须为Fosc的整数倍(1~32),且<=60MHZ
   #define Fcco            (Fcclk*4)              
 //CCO频率,必须为Fcclk的2、4、8、16倍,范围为156MHz~320MHz
   #define Fpclk           (Fcclk / 4) * 1            
//VPB时钟频率,只能为(Fcclk / 4)的1、2、4倍

   extern void Reset(void);
   extern void TargetInit(void);
#endif
   这样一看,爽多了,很符合我写.h文件的习惯,
   config.c 实际上就是原来的target.c的删减版。
   接下来,就是main.c用来编写用户自己的程序啦,我试了个led循环显示的程序。
   最后,考虑到将来可能要用到中断,把陈先生的IRQ.S文件也加进了这个工程。
   编完后,我把程序通过AXD下进bank0的FLASH里面,测试了下,OK。脱机运行也OK。
   如果用户要把程序下载到RAM里面运行,可修改mem.scf了。
   用户程序比较简单,如果用户程序大点,不知道还可不可靠。我比较菜,也看不出来,哪有错误,我就先假设它是可行的吧,整个工程文件我放上来了,有兴趣的可以下下,有错误的地方,还望诸位指正。
文件: MY.rar
大小: 56KB
下载: 下载
阅读(1803) | 评论(0) | 转发(0) |
0

上一篇:状态不佳唉

下一篇:轩,你听我说

给主人留下些什么吧!~~