mini2440上一步步实现将ADS工程移植到keil MDK(附移植好的完整代码)

          从买板子到现在,想想也有2个月啦,开始就想跑裸奔的,可是工程都是在ADS下,win7系统根本不能用,于是就想着怎么在MDK跑,可是 MDK上s3c2440的启动文件 不完整的,因此不推荐使用,为此蛋疼聊好长一段时间,查了很多资料都不成功,可能是我太笨啦,为此,今天把我自己的方法写给和我一样的想用MDK的童靴们吧。


首先新建一个文件夹,然后在里面新建startcode和source两个文件夹,如下

mini2440上一步步实现将ADS工程移植到keil MDK(附移植好的完整代码)_第1张图片

接着打开MDK新建工程,启动文件不选,如下

mini2440上一步步实现将ADS工程移植到keil MDK(附移植好的完整代码)_第2张图片

接着复制光盘中的启动文件2440init.s  option.inc  memcfg.inc   2440addr.inc到startcode,如下

mini2440上一步步实现将ADS工程移植到keil MDK(附移植好的完整代码)_第3张图片

然后在MDK左侧栏新建两个文件夹,分别命名为startcode和source,然后将开始的两个文件进来,如下

mini2440上一步步实现将ADS工程移植到keil MDK(附移植好的完整代码)_第4张图片

接着在source下新建三个文件,分别命名为Main.c   led.c   led.h

mini2440上一步步实现将ADS工程移植到keil MDK(附移植好的完整代码)_第5张图片

三个文件内容分别为

Main.c

[cpp] view plain copy print ?
  1. #include"led.h"  
  2.   
  3. int Main()  
  4. {  
  5.     led_init();  
  6.     while(1)  
  7.     {  
  8.         led1_on;  
  9.         led2_on;  
  10.         led3_on;  
  11.         led4_on;  
  12.     }  
  13.     return 0;  
  14. }  

led.c
[cpp] view plain copy print ?
  1. #include"2440addr.h"  
  2.   
  3. void led_init(void)  
  4. {  
  5.     rGPBCON&=~((3<<10)|(3<<12)|(3<<14)|(3<<16));   //清零GPB5,6,7,8  
  6.     rGPBCON|=(1<<10)|(1<<12)|(1<<14)|(1<<16);     //设置GPB5,6,7,8为输出状态  
  7.     rGPBUP&=~((1<<5)|(1<<6)|(1<<7)|(1<<8));         //上拉电阻为0使能  
  8.     rGPBDAT|=(1<<5)|(1<<6)|(1<<7)|(1<<8);                   //初始化,注意用高电平1  
  9. }  

led.h
[cpp] view plain copy print ?
  1. #ifndef _LED_H  
  2. #define _LED_H  
  3.   
  4. #include"2440addr.h"  
  5.   
  6. #define led1_on  {rGPBDAT&=~(1<<5);}  
  7. #define led1_off {rGPBDAT|=(1<<5);}  
  8. #define led2_on  {rGPBDAT&=~(1<<6);}  
  9. #define led2_off {rGPBDAT|=(1<<6);}  
  10. #define led3_on  {rGPBDAT&=~(1<<7);}  
  11. #define led3_off {rGPBDAT|=(1<<7);}  
  12. #define led4_on  {rGPBDAT&=~(1<<8);}  
  13. #define led4_off {rGPBDAT|=(1<<8);}  
  14.   
  15. extern void led_init(void);  
  16.       
  17. #endif  


现在来看下文件结构如下


mini2440上一步步实现将ADS工程移植到keil MDK(附移植好的完整代码)_第6张图片

接着开始工程的配置,如下

mini2440上一步步实现将ADS工程移植到keil MDK(附移植好的完整代码)_第7张图片

mini2440上一步步实现将ADS工程移植到keil MDK(附移植好的完整代码)_第8张图片

其中第一个用于配置ROM和RAM地址,具体参考s3c2440芯片手册,第二个用于产生bin文件,默认是没有此选项的,更多可在dos下cd C:\Program Files (x86)\keil\ARM\ARMCC\bin进入到文件夹,然后输入fromelf help查看帮助

下面点击编译选项开始编译,左边的按钮,接着应该会看到这个错误,

mini2440上一步步实现将ADS工程移植到keil MDK(附移植好的完整代码)_第9张图片

这是因为我们没把MDK启动文件路径加入到编译程序路径,先把光盘中的2440addr.h复制到startcode,然后加入文件路径

mini2440上一步步实现将ADS工程移植到keil MDK(附移植好的完整代码)_第10张图片

同理吧asm此处也添加此选项,完成后如下

mini2440上一步步实现将ADS工程移植到keil MDK(附移植好的完整代码)_第11张图片

接着重新编译,出现如下错误

mini2440上一步步实现将ADS工程移植到keil MDK(附移植好的完整代码)_第12张图片

还是和上面一样,复制光盘目录下的opnion.h到startcode,如下

mini2440上一步步实现将ADS工程移植到keil MDK(附移植好的完整代码)_第13张图片

接着编译,会出现如下错误,如下

mini2440上一步步实现将ADS工程移植到keil MDK(附移植好的完整代码)_第14张图片


打开地2440init.s第87行,修改为RESET,如下

mini2440上一步步实现将ADS工程移植到keil MDK(附移植好的完整代码)_第15张图片

接着编译,如下

mini2440上一步步实现将ADS工程移植到keil MDK(附移植好的完整代码)_第16张图片

下面说说这三个错误,第一个提示未定义的符号CopyProgramFromNand (referred from 2440init.o).,这个文件适用于初始化nand flash,以便实现从nand拷贝大于4K程序从sdram,从而让程序运行,此文件在nand.c定义

第二个和第三个没有MMU_SetAsyncBusMode (referred from 2440init.o).和MMU_SetFastBusMode (referred from 2440init.o).,查看光盘目录可知这个定义位于mmu.c,而mmu.c又要依赖244lib.c实现,因此拷贝nand.c nand.h mmu.c mmu.h 2440lib.c到startcode文件夹下,如下

mini2440上一步步实现将ADS工程移植到keil MDK(附移植好的完整代码)_第17张图片

再次重新编译又出现啦下列错误,

mini2440上一步步实现将ADS工程移植到keil MDK(附移植好的完整代码)_第18张图片

同上面一样,拷贝光盘的def.h到startcode下,完成后再次重新编译,会出现如下错误,在2440init.s加入如下两行,如图

mini2440上一步步实现将ADS工程移植到keil MDK(附移植好的完整代码)_第19张图片

再次重新编译,会出现如下错误

mini2440上一步步实现将ADS工程移植到keil MDK(附移植好的完整代码)_第20张图片

解决方法:将2440init.s文件中所有 Image$$RO$$Base 换成Image$$ER_ROM1$$Base,将所有 Image$$RW$$Base 换成Image$$RW_RAM1$$Base,所有 Image$$ZI$$Base 换成Image$$RW_RAM1$$Base

接着继续

编译会通过,打开suppervivi下载到nor flash发现可以运行,同样的下载到nand也运行OK


。。。。。。。。。。。。。。。。。。。。。。

THIS IS THE SUMMARY

。。。。。。。。。。。。。。。。。。。。。。

《一》切记MDK默认给的s3c24400.h和s3c2440.s启动文件是不完整的,带有中断的程序不可以使用,推荐使用光盘里自带的启动文件2440init.s,不过个人认为最好还是能看懂启动代码后自己重新编写一个,比如使用C实现,而汇编中只实现跳转到C的功能,关于2440init.s修改的地方如下

①MDK和ADS的入口编号不一致:

修改所有的Image$$RO$$Base 换成Image$$ER_ROM1$$Base,将所有 Image$$RW$$Base 换成Image$$RW_RAM1$$Base,所有 Image$$ZI$$Base 换成Image$$RW_RAM1$$Base,

修改第87行附近的    AREA    Init,CODE,READONLY为    AREA    RESET,CODE,READONLY

③声明8字节数据:

在AREA    RESET,CODE,READONLY后面加上一句PRESERVE8

④提示找不到entry:

在PRESERVE8后面加上一句  

EXPORT    __ENTRY
__ENTRY

⑤包含的头文件错误(即memory.inc声明的Tsrc在2440init.s被用成了Trc)

修改第667行附近的Trc为Tsrc

《二》如果使用nor flash启动运行程序,记得在所有程序的Main.c加入mmu.h和MMU_Init(),以便为提供必需的内存管理,用于初始化内存,实现内存映射,具体有2440slib.s来实现,而用nand的话可以无视之,不过个人不推荐加MMU,因为这段程序让人难以理解程序,看起来比较古怪,而且加MMU运行不如直接下载到nand flash运行

《三》如果需要对nandflash进行相关操作(不包括启动代码的从NAND复制到SDRAM),记得在所有程序的Main.c加入nand.h,特别注意启动代码中的从nand flash拷贝数据到SDRAM区不能省略(即2440init.s中的IMPORT  CopyProgramFromNand这一句),他是nand能启动的关键所在(当然stepping stone(SRAM)也很重要)

《三》程序的主函数不一定是Main,因为可以改成任意你想写成的名字,比如改成usercode也可以,具体可以修改bl Main这句即可

   最后,附上我修改好的完整版启动代码,这个是一劳永逸的,以后可以一直用

mini2440在MDK上完整启动代码

下载地址 http://download.csdn.net/detail/googlemi/5176844

你可能感兴趣的:(mini2440上一步步实现将ADS工程移植到keil MDK(附移植好的完整代码))