s3c2440 ads程序移植到keil中(二) 初步完成

时间:2024-05-21 16:27:23

如果我把参数配置发生改变呢

s3c2440 ads程序移植到keil中(二) 初步完成

s3c2440 ads程序移植到keil中(二) 初步完成

然后再一次编译 要包错误

如下所示

s3c2440 ads程序移植到keil中(二) 初步完成

错误如下

这个错误解决不了

最后查看了网上网友的方法 又可以修改 但是引入了nand文件

最后反正知道了2440init.s文件要修改许多 所以我就不再这里继续整了 浪费时间

直接运用网上网友的东西即可

网友编写的地址

https://blog.****.net/hannibaychty/article/details/44873327

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

 

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

s3c2440 ads程序移植到keil中(二) 初步完成

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

s3c2440 ads程序移植到keil中(二) 初步完成

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

s3c2440 ads程序移植到keil中(二) 初步完成

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

s3c2440 ads程序移植到keil中(二) 初步完成

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

s3c2440 ads程序移植到keil中(二) 初步完成

三个文件内容分别为

Main.c

[cpp] view plaincopy

  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 plaincopy

  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 plaincopy

  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  


 

现在来看下文件结构如下


s3c2440 ads程序移植到keil中(二) 初步完成

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

s3c2440 ads程序移植到keil中(二) 初步完成

s3c2440 ads程序移植到keil中(二) 初步完成

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

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

s3c2440 ads程序移植到keil中(二) 初步完成

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

s3c2440 ads程序移植到keil中(二) 初步完成

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

s3c2440 ads程序移植到keil中(二) 初步完成

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

s3c2440 ads程序移植到keil中(二) 初步完成

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

s3c2440 ads程序移植到keil中(二) 初步完成

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

s3c2440 ads程序移植到keil中(二) 初步完成

 

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

s3c2440 ads程序移植到keil中(二) 初步完成

接着编译,如下

s3c2440 ads程序移植到keil中(二) 初步完成

下面说说这三个错误,第一个提示未定义的符号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文件夹下,如下

s3c2440 ads程序移植到keil中(二) 初步完成

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

s3c2440 ads程序移植到keil中(二) 初步完成

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

s3c2440 ads程序移植到keil中(二) 初步完成

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

s3c2440 ads程序移植到keil中(二) 初步完成

解决方法:将2440init.s文件中所有 Image

Base 换成ImageBase,将所有 ImageBase 换成ImageBase,所有 ImageBase 换成ImageBase

 

接着继续

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

 

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

THIS IS THE SUMMARY

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

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

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

修改所有的Image

Base 换成ImageBase,将所有 ImageBase 换成ImageBase,所有 ImageBase 换成ImageBase,

 

修改第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.****.net/detail/googlemi/5176844

转载自:http://blog.****.net/googlemi/article/details/8836609

查看 s3c2440 ads程序移植到keil中(三) 初步完成