历史上的今天
返回首页

历史上的今天

今天是:2025年03月02日(星期日)

2020年03月02日 | s3c2440 ads程序移植到keil中(二) 初步完成

2020-03-02 来源:eefocus

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

然后再一次编译 要包错误

如下所示

错误如下

这个错误解决不了

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

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

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

网友编写的地址

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

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

 

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

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

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

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

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

三个文件内容分别为

Main.c


  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


  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


  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  


 

现在来看下文件结构如下


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

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

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

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

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

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

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

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

 

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

接着编译,如下

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

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

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

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

解决方法:将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这句即可

推荐阅读

史海拾趣

GE Oil & Gas Digital Solutions公司的发展小趣事
在电子技术教学实验中,作为演示电阻测量原理的教具。
爱特姆(ATOM)公司的发展小趣事

爱特姆在国内市场取得一定成绩后,开始积极拓展国际市场。通过与欧洲、美国等国家的知名企业建立合作关系,爱特姆的产品逐渐打入国际市场,并赢得了良好的口碑。同时,公司还积极参加国际电子展会,与全球同行交流学习,不断提升自身的国际竞争力。

Amphenol Piher公司的发展小趣事

在快速发展的同时,爱特姆也积极履行企业社会责任。公司始终坚持绿色生产、环保经营的理念,通过采用环保材料和节能技术,降低生产过程中的能耗和排放。此外,爱特姆还积极参与社会公益事业,为社会的可持续发展贡献自己的力量。

这五个故事从不同角度展现了爱特姆(ATOM)在电子行业发展的历程和成就。通过持续创新、市场拓展、人才引进和社会责任等方面的努力,爱特姆逐渐成长为一家具有全球影响力的电子企业。

GSG公司的发展小趣事
具备自动校准、自动补偿、自动报警等智能化功能,降低了人工干预的需求。
Bkc Semiconductors Inc公司的发展小趣事

随着技术的成熟和产品的不断完善,Bkc开始积极拓展市场。公司不仅加强了与国内外知名电子厂商的合作,还积极参与国际半导体展会和技术交流,不断提升品牌知名度。同时,Bkc还通过战略投资和并购等方式,进一步扩大了自身的业务规模和市场份额。

Burr-Brown公司的发展小趣事

随着公司规模的扩大,Burr-Brown开始寻求海外市场的发展。1961年,公司首次进入国际市场,开启了全球化的发展道路。十年后,英国子公司的设立进一步巩固了公司在欧洲的市场地位。四年后,日本分公司的创建则标志着Burr-Brown在亚洲市场的深入拓展。到1979年,公司的销售额已经有50%来自于美国以外的国家,显示出其强大的国际竞争力。

问答坊 | AI 解惑

靠车吃饭,靠油生存,现在车贵,油贵,疯了!

如今燃油税又涨了,最苦的就是我们这些靠车吃饭的普通车主,每天靠车运货、拉生意,现在油价涨了,真不知到将来怎么讨生活。…

查看全部问答>

2-60V可调

最近打算做一个2-60V可调电源,最大电流为10A,纹波<100mv,不知大家有什么建议给我吗?虽然做过电源但是还没有做过这么大功率的,第一次尝试,不知该考虑些什么? 希望各位大虾多给提点意见 …

查看全部问答>

自己的4*4键盘扫描实现

本人刚开始学弹片,对C语言也是刚刚接触,看了 对于入门还不错. 在这里贴出自己写的键盘扫描实现,小弟初学者,也没考虑那么多,如效率之类的 有不足之处 欢迎大家讨论 #include #include #define uint unsigned int #define uchar unsigned char s ...…

查看全部问答>

请教等效阻抗

在网上下载的电路相关学习资料,学习到电路短路判断这一块时。遇到等效阻抗这一概念。根据学习资料上给出的电阻值,其等效阻抗=并联电路的电阻值。但是我看电路图上给出的量电阻的位置处于一条直线上,很矛盾。所以发帖请教各位老师。希望能得到等 ...…

查看全部问答>

求一个 vs2005 下 C# 写的适用于 2440+wince5.0 的串口通讯程序

求一个 vs2005 下 C# 写的适用于 2440+wince5.0 的串口通讯程序 越详细越好 我刚接触这一块 C#的语法还没学全 以前也从没在win下编过程 但是头儿要求的特别急 想找个例程边看边学 希望有大侠能指点一下 同时希望有这种例程的能给我 ...…

查看全部问答>

请教高手 jffs2_get_inode_nodes(): Data CRC failed on node...问题

/bin/mount -n -t jffs2 /dev/mtdblock/3 -o rw,noatime /app jffs2: Erase block size too small (16KiB). Using virtual blocks size (32KiB) instead Empty flash at 0x02407104 ends at 0x02407200 set hw ether and ip of eth0 eth0: Sett ...…

查看全部问答>

ST给的Demo中的STM3210E-EVAL如何产生的?

IAR编译器下本来的工程应该是Debug,Release,但是ST给的Demo中的 TM3210E-EVAL如何产生的?属于Debug呢还是Release呢?…

查看全部问答>

1602显示问题

我的电路和程序如下,按照郭天祥教程做的,为什么仿真不了??             感谢各路大侠指导     [ 本帖最后由 sphshine 于 2011-10-29 20:29 编辑 ]…

查看全部问答>

P1REN没有定义?

我刚开始学430在编译下面代码的时候,IAR报错 Error[Pe020]: identifier \"P1REN\" is undefined E:\\workspace\\main.c 12 #include \"io430.h\"#include \"intrinsics.h\" int main( void ){  // Stop watchdog timer to prevent time out ...…

查看全部问答>

用LM Flash Programmer通过串口给LM 3S800下载程序时,包长的确定

在boot_serial工程中有config.h配置文件,其中有一个变量为BUFFER_SIZE,原文件中默认为20,当把这样配置的引导程序下载到芯片中后,用LM Flash Programmer通过串口下载程序时,LM Flash Programmer中在“Configation”下的“Transfer Size”最大只 ...…

查看全部问答>