OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12001|回复: 13

ARM9/ARM11裸机开发笔记1之MDK开发环境和点亮LED

[复制链接]

58

主题

499

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1920
金钱
1920
注册时间
2013-11-18
在线时间
268 小时
发表于 2015-1-10 23:20:08 | 显示全部楼层 |阅读模式
        很多从单片机或者从CM3转到ARM9/ARM11的时候,一开始就讲得是Uboot,Linux,然后就是什么QT等高级玩意,不像单片机有什么裸机开发的概念,的确,这些高级ARM本来就是用来跑系统,谁用来它做裸机开发呢。但是如果我们要更好了解ARM的工作原理,,尤其是想进阶嵌入式中最难的一层,驱动层的话,甚至想把其它的非Linux系统移植到ARM9/ARM11上。我们就无法避免要跟ARM跟底层的寄存器打交道,要了解ARM的内核,时钟,GPIO,SPI,等等外设的工作原理和配置。通过裸机的一些实验,我们就可以像用STM32这样来写ARM9/ARM11代码,让我们更深入了解ARM的原理。
      我之前因为在做把MF这个系统移植到S3C2416上,基本上都靠MDK来完成调试,对ARM9/ARM11的认识有了进一步的认识。这里我就以S3C2416为例来讲怎么建立开发环境和点亮LED灯。
       1、裸机开发必要条件:玩过ARM9之上同学都知道,ARM9之类的ARM是没有内部Flash的话,我们不能直接用开发软件来对烧写代码来调试硬件,这点跟我们开发单片机是最大的区别,也是导致很多人不知道怎么来进行ARM9的裸机开发。有同学就说,没有Flash,还有RAM,没错S3C2416内部是有RAM,但是很小,S3C2416的内部RAM在用NAND启动时候,才8K而已,S3C2440的才4K,我们要在这8K的RAM既放存数据还要放代码,那我们写不了几行代码。所以最好的方法就是用Uboot,先把芯片的时钟,SDRAM都初始化好,那我们就可以用SDRAM来调试代码,一般都有64M的SDRAM,对我们来完全足够用了。这里我只在开发上烧写了Uboot,内核跟文件系统都没有烧,因为如果Uboot引导了Linux内核后,Linux内核接到CPU的控制权,Debug会被关掉,我们就无法再使用Jlink对开发进行调试。你可以进去Uboot上用nand erase来把内核擦掉,不然你每次要调试的时候要注意不要让Uboot引导内核。
       2、用MDK建立工程:新建工程大家都会,我这里只说要点。选择器件的话,选择我们对应ARM开发板上芯片,注意如果是MDK5.0以上,默认是没有安装有ARM7/ARM9有器件库的,我有发帖子共享给大家,如果用是用MDK5.0以上的同学翻翻帖子去下载。


      点确定后,然后是打开工程设置
 


     其中IROM就是代码区的地址,前面说了我们没法用NAND,只能通过SDRAM来调试。我的S3C2416的开发是64M的DDR,地址就是从0X30000000开始到0x34000000,这里我一半用做ROM,从0x32000000开始,另一半用做RAM。


      Debug设置,一样我们设置成J-Link。点OK就可以完成工程的建立。
      3、点亮LED灯:用过STM32的同学都知道,新工程后,要增加启动代码,然后才是C代码来写Main函数。这里我们没有启动代码,也不知道怎么找到Main函数。没关系,我们自己来写个最简单的启动代码,让它来转到我们的C代码。新建一个startup.s的汇编代码文件,然后加入到工程上来,代码如下

    IMPORT Main ;//c语言入口函数
     RESERVE8 ;//字节对齐
    CODE32 ;//ARM代码
    AREA RESET,CODE,READONLY ;//reset名,代码段,只读
    ENTRY    ;//程序入口
    bl Main 
    END
 IMPORT Main这里就引入我们C文件里的Main函数,ENTRY  表示的这里代码的开始,编译器就从这里开发编译代码。 bl Main这里就是跳转到我们的Main函数。END就是说这里代码的结尾。相关的汇编指令大家可以去找《DUI0204HC_rvct_assembler_guide 》这本书,里面就讲到MDK所有的汇编指令。这里我们就写出来最简单的启动代码。接着就是写我们的C代码了,增加Main.c文件到工程中,我的代码如下:

 #define GPBCON *(volatile unsigned int*)0x56000010
 #define GPBDAT *(volatile unsigned int*)0x56000014
 #define GPBUDP *(volatile unsigned int*)0x56000018
 int Main(void)
 {
unsigned int i;
   GPBCON = 1 << 2;//设置PB1为输出
GPBUDP = 2 << 2;//设置PB1为上拉
GPBDAT &= ~(1 << 1);//置PB1的输出为0
while(1)
{
}
 }
 点亮LED的原理大家都知道,就不用我再说了,我的开发的LED的控制脚对应的是PB1,这里我就要对GPIOB第一个引脚进去配置。代码的开头我定义了GPIOB口相关的寄存器。具体的自然也就是翻对应ARM的参考手册,下面是S3C2416手册相关GPIOB的寄存器



   这里就以GPBCON的寄存器来说,折腾寄存器的同学一看明白怎么做了。GPBCON是来控制GPIO的输入还是输出的,我们这里把GPB1设置成输出,然后设置GPBDAT寄存器让GPB1输出低电平,LED就会被点亮。
          接下就是编译,代码没写错就会编译成功,点调试之前要注意开发不要进去Linux,如果你没有擦除内核,就要让开发板进入Uboot,如下:


点调试,弹出下面对话框,提示Jlink不支持S3C2416,没关系,点Yes


然后我们选一个最接近S3C2416的S3C2410A。如果是用S3C2440的话应该就不会有这个问题。


然后点OK进去调试。进去调试后注意不要点运行。因为这时候的PC指针地址是0x0,而我们的代码并不是在0x0,而是在0x32000000。我们手工修改PC指针为0x32000000


然后我们单步执行,可以看代码跑起来了,代码执行于While(1)的时候,就可以看到LED灯亮起来了。


已经放下多年的FPGA,要重新再拾起来,却是如此的陌生
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

102

帖子

1

精华

高级会员

Rank: 4

积分
991
金钱
991
注册时间
2014-11-19
在线时间
357 小时
发表于 2015-3-20 11:55:17 | 显示全部楼层
正在学s3c2440,顶一个!!!
还不知道ARM9也能用keil开发调试了
专注一件事情并做到极致>>> https://shop275468129.taobao.com
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-3-20 23:12:24 | 显示全部楼层
不错啊,好东东.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

197

帖子

0

精华

高级会员

Rank: 4

积分
538
金钱
538
注册时间
2012-7-19
在线时间
63 小时
发表于 2015-4-8 12:55:50 | 显示全部楼层
最后修改pc指针,可以使用初始化文件,在mdk的debug标签里
回复 支持 反对

使用道具 举报

头像被屏蔽

65

主题

277

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2013-8-11
在线时间
29 小时
发表于 2015-4-8 13:45:13 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2014-11-24
在线时间
21 小时
发表于 2015-6-11 14:11:57 | 显示全部楼层
牛叉啊标记下 学习
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2016-4-7
在线时间
2 小时
发表于 2016-4-7 14:02:04 | 显示全部楼层
要试一试!
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2014-4-26
在线时间
14 小时
发表于 2016-5-12 16:40:38 | 显示全部楼层
mark!学习了
回复 支持 反对

使用道具 举报

13

主题

96

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3222
金钱
3222
注册时间
2016-5-7
在线时间
531 小时
发表于 2016-9-23 23:38:07 | 显示全部楼层
楼主,Keil5可以开发Samsung 的ARM11 OK6410不,我去keil官网么找到这个器件库
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2016-9-29
在线时间
0 小时
发表于 2016-9-29 22:31:52 | 显示全部楼层

我装了以后怎么没有三星的库文件呢,怎么装啊
回复 支持 反对

使用道具 举报

7

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2013-12-9
在线时间
17 小时
发表于 2016-10-13 14:10:58 | 显示全部楼层
一在在用keil裸奔arm9芯片,需要N32905和NUC972的可以联系我的,可以跑linux还可以裸奔,使用方便
https://yixinelectric.taobao.com/
QQ:562463654
回复 支持 反对

使用道具 举报

44

主题

298

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
209
金钱
209
注册时间
2016-9-9
在线时间
84 小时
发表于 2016-10-26 09:34:19 | 显示全部楼层

原子哥什么时候也整LINUX啊?
回复 支持 反对

使用道具 举报

3

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2015-12-3
在线时间
33 小时
发表于 2016-10-30 15:39:53 | 显示全部楼层
不同 发表于 2016-9-23 23:38
楼主,Keil5可以开发Samsung 的ARM11 OK6410不,我去keil官网么找到这个器件库

我也打算学习这个,不过不会,能否教下
回复 支持 反对

使用道具 举报

0

主题

26

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2017-4-6
在线时间
1 小时
发表于 2017-4-6 18:41:19 | 显示全部楼层
谢谢楼主分享!;
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 16:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表