搜索
bottom↓
回复: 30

Zhb2000 的ARM7 SAMSUNG S3C44B0X 学习笔记

[复制链接]

出0入0汤圆

发表于 2006-8-4 13:52:38 | 显示全部楼层 |阅读模式
今年7月刚接触ARM,希望有初学者和我一起进步。

前言:

    以前玩过C51,后来玩了AVR 它们都是很好的芯片,我从中学到了很多东西,并且一直在用它们。前年听说了32位的单片机ARM (呵呵,我知道的比较晚)。一直者觉得暂时用不上,第二个由于是贴片的,脚又多,所以没办法搞来试一试,玩一玩。今年7月总算有了一个机会,托朋友买来了两块ARM7的学习版:一块SAMSUNG S3C44B0X 另一块是AT91SAM74S64。现在又刚好有一点点时间,不想把它用在游戏上。由于一直在用,也喜欢用ATMEL 公司的芯片。所以决定先试一下其它公司的芯片。就决定先玩一下Samsung的了。(呵呵,喜欢的先收起来)



    到网上找了一些ARM的入门资料。都是先了解ARM的基础知识,再了解一款芯片。没单片机基础的要1年,有单片机基础的要1个月左右。好说干就干,我买了一本《从C51到ARM》的书 (自已认为过渡会容易些)。花了两天把书中自己认为有用的知识过了一遍,才发现ARM不是单片机,而且自己好象什么也没学到。没关系,凭着原来学习单片机的经验,先了解了ARM的寄存器,中断的种类,看完后感觉和AVR类似。



    第一次使用S3C44B0X学习板。装好了串口线,打开超极终端。学习板一上电,发出嘀嘀声,吓了我一跳 (呵呵,没见过这种大场面)。这时超极终端上收到了相应的信息,证明板子是好的。看着板上的三个灯闪着,心想:“第一次用了ARM”。




-----此内容被zhb2000于2006-08-04,14:09:16编辑过

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2006-8-4 13:53:16 | 显示全部楼层
学习:

    <1>先接好了并口的JTAG并连上实验板。先装好ARM调试代理。(实验配置手册 44b0.pdf上写的有) 运行CodeWarrior 打开第一个例程LEDBLINK 注意照着配置手册中的说明设好ARM like 中的 RO Base 为 0xc000000 ,RW Base 为 0xc100000 ,Image entry point 为 0xc000000  (只知道 RO 是 flash的开始地址,RW 是 SRAM的开始地址。Image entry point是主程序入口地址,为什么是这些地址,现在还没搞清。:) )。这个例子的作用是LED闪烁,扬声器发出声音。灯闪烁还好。发出声音来太吵人了。想办法改一下,(由于对芯片控制还一无所知) 只好在调试时跟踪进去。发现了在44BLIB.C文件中的 void Port_Init(void)函数中(也就是端口初使化函数)rPDATE=0x1ff 这句一运行,扬声器就发声,于是把它加上注释,好了。现在走马灯成了。也没有发声。目前我连一个脚的电平也不会控制,呵呵看来还要了解很多知识。

    <2>第一个例子运行成功了,看来我还是要能控制它的引脚才行。仔细看了一下S3C44B0X的DataSheet 它的引脚和AVR的有一点相同 (还只了解了一点) 除了A口和B口没有上拉电阻外,其它IO口都有。现在它的口是不规则的了。有8、9、10、11、16位的口。原来AVR最多是8位的口。PDATn 数据寄存器,读数和置数都在这里。PCONn 这个是设置IO口的状态的。可设为 Input 或 Output 还有其它的,而且每个IO引脚的设置也不是固定的位数,有2位的,3位的。(可能8个脚设置前三个用2bit 后5个用 3bit,也不一定)具体要看芯片的DataSheet 。PUPn 上拉电阻开关 (和AVR控制方法刚好相反) 。我又仔细看了一下S3C44B0X 实验板的电路图。 找到了 led0 接在 PC1口 , led1 接在PC2口,led3接在PC3口。

出0入0汤圆

 楼主| 发表于 2006-8-4 13:54:10 | 显示全部楼层
<3>先新建一个工程 t01。把例程LEDBLINK的头文件copy过来用:)。通过网上和实验板CD上的资料发现ARM还须要一段汇编代码才能跳转到 C中的main()函数。还没了解,先用原来的吧 44BINIT.S 把它加到新建的工程中。再建一个t02.c从44BLIB.C中找到 void Port_Init(void) 函数,改为 void init(void),加到t02.c文件中。这时写上 main()函数如下。



#include "44b.h"

#define  led0 1

#define  led1 2

#define  led2 3

void init(void);

int Main(void)

{

  init();

  rPDATC&=~(1<<led1);

  rPDATC&=~(1<<led2);

       

        while(1)

        {

                rPDATC^=(1<<led0);

                delay(2000);

        }

        return 0;

}



void init()

{

  rPCONA=0x1ff;       

  rPDATB=0x3ff;

  rPCONB=0x3ff;

  rPDATC=0xffff;        //All I/O Is High

  rPCONC=0x0f05ff55;       

  rPUPC=0x30f0;        //PULL UP RESISTOR should be enabled to I/O

  rPDATD=0xff;

  rPCOND= 0x0;

  rPUPD = 0x0;

  //我改了这里

  rPDATE=0x1df;          //All I/O Is High

  rPCONE=0x25568;        //All NC is INPUT       

  rPUPE=0x0df;        //PE8 do not have programmable pull-up resistor.  

  //这里是原来的

  //rPDATE=0x1ff;          //All I/O Is High

  //rPCONE=0x25568;        //All NC is INPUT       

  //rPUPE=0x0df;        //PE8 do not have programmable pull-up resistor.  

  rPDATF=0x1ff;        //All I/O Is High

  rPCONF=0x20900a;//All NC is INPUT

  rPUPF=0x163;

  rPDATG=0xff;

  rPCONG=0x00ff;        //KEY0~KEY3定义为I/O,采用查询方式

  rPUPG=0x0;                //should be enabled  

  rSPUCR=0x7;         //D15-D0 pull-up disable

  rEXTINT=0x0;        //All EXTINT0-7 Low level interrupt

  //Define the Non_Cache area

  rNCACHBE0=(((Non_Cache_End)>>12)<<16)|((Non_Cache_Start)>>12);

}       



    本来以为led0会一闪一闪的。结果三个灯都闪和原来的bois代码一样。搞了几次都是这样。后来一想,看看它的汇编代码。晕,一开始程序并没有停在 Main 上而是 Init上跟踪过去,当Init函数返回时 mov pc,r14 而R14中的值是c0000ef3 并不是 Main函数的地址 0xc000093 。想起了设置CodeWarrior时有个 image entry point 改为 0xc000093 ,再调试,灯一闪一闪的了。呵呵。我试了下,再建一个函数那么 Main函数地址又变大了一点。我试着建了两个文件 t01.c 中只有 Main函数。Porc.c 中为其它子函数。这时 Main函数的地址为0xc000000了。是什么原因?汇编中的代码明明跳到 Main 上,为什么没有效果。现在还不知道。 不过我已成功的控制了 S3C44B0X的一个IO引脚 :) 。

出0入0汤圆

发表于 2006-8-4 13:59:21 | 显示全部楼层
<font color=blue>以下蓝色文字由版主:testcode 于:2006-08-04,13:59:21 加入。
请发贴人注意:本贴放在这分区不合适,即将移走
原来分区:[1000]“我们的AVR”技术论坛
即将移去的分区:[1032]atmel ARM 论坛 (OurARM.com)
移动执行时间:自本贴发表0小时后

出0入0汤圆

发表于 2006-8-4 20:34:24 | 显示全部楼层
不错,这样的贴子对入门最好

出0入0汤圆

发表于 2006-8-4 22:50:24 | 显示全部楼层
很希望 zhb2000 写下去。、顶

出0入0汤圆

发表于 2006-8-4 23:13:17 | 显示全部楼层
写得很不错。

能否提供更详细介绍,例如:

1.  所选用的编译器;

2. 电路图等等

出0入0汤圆

发表于 2006-8-5 07:04:54 | 显示全部楼层
与楼上的有同感

深盼楼主继续......

出0入0汤圆

 楼主| 发表于 2006-8-5 11:35:53 | 显示全部楼层
<4>昨天晚上骑车去街上兜了一下风,晚上下了一个Game的补丁,结果电脑中了木马,害我搞到23点多,最后还是用系统还原才搞好。关了电脑倒在床上想着明天要从哪里学起。想着,想着就睡着了。。。

    今天一大早就起来了。7:15的样子。打开电脑,准备接着昨天的搞,整理了一下昨天的思路。一看电脑才发现有很多我现在要用的文件被还原了。 :( 没办法只有接着从CD上Copy到我的电脑中,浪费了很多的时间。可见Game (由于game才中的木马) 真是消磨时间的好办法啊。

    还是决定先从初使化进入C 的那个汇编先搞起。打开了例子中的44BINIT.S文件,一看,呵呵。有好些不认识的指令,不要紧,主要结构我还是看懂了。说干就干,打开CodeWarrior 新建了一个项目t03 ,再新建了一个 t3asm.S文件。文件的内容如下:



AREA EXAMPLE,CODE,READONLY

CODE32

ENTRY

B START                ;ARM的跳转指令

NOP

NOP

NOP

START                 ;突然发现 ARM 的标号后不用冒号

NOP

END



    这是我大部分照抄 44BINIT.S中的 (这点也要抄,没办法,ARM的伪指令不会。)

    一点        Compile 结果出错:

Error : All63E: Unknown opcode t3asm.s line 1

1 00000000 AREA EXAMPLE,CODE,READONLY ……

    以为是有哪个字母打错了,仔细看了3遍完全一样, 又把它copy 到记事本中,把44BINIT.S中的那一句也copy 过来,一比还是完全一样。这是为什么呢?又把44BINIT.S前的代码好好看了一下,未果。 怎么办? 想了一下,又看了一下,44BINIT.S 这些语句前都向右退了两格。不可能是这个吧,不过我还在第一句前按了一下TAB键让它向右退了两格。奇迹出现了(对我来说是有点神奇) Compile 出错跳到了下几行上了 :) 。索性把所有句子全退了格。一 Compile 出错停在了 START 句子上,又比较了一下 44BINIT.S 发现所有标号没有退格,于是将 START 移到了最左边。这下总算 Compile过了。呵呵。DEBUG一下,很正常,查一下汇编的地址是0xc000000 很正常。呵呵,我又向前了走了一步。

出0入0汤圆

 楼主| 发表于 2006-8-5 12:28:11 | 显示全部楼层
<5>想自己试着从汇编中跳到C的main() 中,于是又写了一个 t03.C文件。

#include "44b.h"

int main(void)

{

        while(1)

        {

        }

        return 0;

}



这时将 t3asm.S文件改为如下内容:

    IMPORT main                ;表示引用外部函数

    AREA EXAMPLE,CODE,READONLY

    CODE32

    ENTRY

    B main                   ;ARM的跳转指令

START                                ;加这个标号是为了看出其它句子向右移动了两格

    END

    点Compile后编译通过。点DEBUG发现 程序停在了 0xc000000 处,但我发现这里并不是我写的 t3asm.S 的内容,也不是 t03.C的内容。取而代之的是一个 __main 入口。一看有好长一段。而我的 t03.C 中的 main函数在 0xc000098处。而我的 t3asm.S 再也没找到,不知道它到哪里去了。 试从工程中去掉 t03.C 只留下 t3asm.S Compile后DEBUG进去,发现 t3asm.S的内容在 0xc000000处。为什么我加了 t03.C 后什么都变了。怪啊。我试着去掉 t3asm.S 只留下 t03.C Compile后DEBUG进去。发现 main() 还是在 0xc000098处,而0xc000000处还是原来的那个 __main 入口。肯定是编译器生成的,这是怎么回事呢? 晕哦。

出0入0汤圆

发表于 2006-8-5 13:06:08 | 显示全部楼层
这才叫新手教程!

出0入0汤圆

 楼主| 发表于 2006-8-6 13:30:02 | 显示全部楼层
今天 (2006.08.06) 一大早就起来了。吃早饭前先在电脑上接上S3C44B0X开发板,端着饭碗打开电脑,上网看看我昨天发的贴子,呵呵,没什么人看。先且不管它。利用吃饭的时间到网上逛了一圈。

    吃完饭了,还是开始我的研究。经过努力我已成功地解决了原来遇到的__main Main main 问题,思路清晰的控制了S3C440B0X的几个引脚,真正地对ARM有了一点点了解。

    以上就是我这一个星期学习ARM的经历,其间磕磕碰碰也算走过来了。算一下,看书用了三 天,边试验边写这遍文章用了三天,由于暂时找不到应用,不知道还会不会让我的ARM继续下去。看来以前学习单片机的经验对我帮助很大。写这篇文章是对我学习ARM过程的一个记载。我要感谢C51、感谢AVR、还要感谢网上的朋友们,你们的很多资料使我受益很深,谢谢!



                                                            作者:zhb2000            

                                                            2006年8月6日
-----此内容被zhb2000于2006-08-06,14:01:57编辑过

出0入0汤圆

发表于 2006-8-7 01:14:26 | 显示全部楼层
强顶 学ARM看来是很有趣啊

出0入0汤圆

发表于 2006-8-8 07:59:00 | 显示全部楼层
正在学习start.s 的启动代码!好多都看不明白!

出0入0汤圆

发表于 2006-8-8 10:01:09 | 显示全部楼层
楼主是直接写的,没有用到嵌入式系统?

感觉玩ARM主要是玩ulinux

出0入0汤圆

发表于 2007-9-4 14:27:42 | 显示全部楼层
人心不足蛇吞象!虽然LS的结果是学习ARM的比较关键技术,但是一下子对初学者是很难的,我到现在都在设计PCB中,还好参考方案很多!

出0入54汤圆

发表于 2007-9-20 17:56:13 | 显示全部楼层
顶顶。。过段时间也买这个开发板。谢谢楼主。。

出0入0汤圆

发表于 2007-9-28 13:17:16 | 显示全部楼层
顶顶,想学ARM的新手看了都会支持的,嘿嘿!期盼着楼主继续发贴!

出0入0汤圆

发表于 2007-10-5 21:16:45 | 显示全部楼层
赞一个先!不过,我还是建议要学的先去买本书什么的,先理论一点,在实践,再理论。这样学起来心里踏实!

出0入0汤圆

发表于 2007-10-10 09:20:02 | 显示全部楼层
请问LZ,你的3C44B0X的在ADS里的启动文件(或工程摸版)在那里搞到的,能不能传上来分享一下?

出0入0汤圆

 楼主| 发表于 2007-10-10 23:07:43 | 显示全部楼层
to:19楼 zhang_mike2000:
   你好,没有启动文件或工程模板.(那个_main()是ADS自己生成的).

出0入328汤圆

发表于 2007-10-10 23:21:40 | 显示全部楼层
to:19楼 zhang_mike2000:

     我这有个点亮led的,希望对你有点帮助
点击此处下载ourdev_176110.rar(文件大小:86K)

出0入0汤圆

发表于 2008-4-3 21:55:25 | 显示全部楼层
顶一下..

出0入0汤圆

发表于 2008-4-3 22:29:51 | 显示全部楼层
好贴!是学习ARM入门的好资料!希望楼主继续发帖!继续关注!

出0入0汤圆

发表于 2010-2-22 19:44:21 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-9-9 17:46:26 | 显示全部楼层
不错

出0入0汤圆

发表于 2010-12-20 14:53:22 | 显示全部楼层
天杀的国民党门头沟党委替资本家当狗,万恶的蒋介石门头沟Z.F.为人民币服务!

出0入0汤圆

发表于 2011-4-14 22:55:13 | 显示全部楼层
很好!学学

出0入0汤圆

发表于 2011-4-27 19:47:28 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-4-28 15:30:53 | 显示全部楼层
我现在才做楼主那个时候做的事情……

出0入0汤圆

发表于 2011-5-2 15:56:53 | 显示全部楼层
那个楼主 你那个裸机是不是直接烧入flash的?要想像单片机一样运行的话 应该怎么设置啊? 期待中..........
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 23:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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