陈明计先生写的启动代码,真的是挺好的。看得出来,为了让我们用的放心,用的舒心,陈先生很费了一番心思。各反面都为我们考虑的很好,很周全。对用户来说,只要直接拿来开发用户程序就行了。
可这对我刚开始学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不多说,给用户自己添加程序的;
现在来回忆下,我建这个工程的过程吧(整个工程文件见附件)。
首先,进入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) |