您的位置:首页 > 其它

Realview MDK第一个程序

2012-06-07 01:07 183 查看
在mini2440(S3C2440)的板子上运行点亮LED 的程序,使GPB5输出低电平,会点亮LED.

  1.Led_on.S的完整程序如下

程序代码:

  -----------------------------led_on.S----------------------------------------------------

  PRESERVE8    ;保持堆栈8字节对齐,符合新的ARM ABI标准,所以压入堆栈的数据寄存器也必须是偶数个

  AREA    LED, CODE, READONLY

  ENTRY 

START1 

            LDR     R0,=0x56000010      ;@ R0设为GPBCON寄存器。此寄存器

                                        ;@ 用于选择端口B各引脚的功能:

                                        ;@ 是输出、是输入、还是其他

            MOV     R1,#0x00000400       

            STR     R1,[R0]             ;@ 设置GPB5为输出口, 位[10:9]=0b01

            LDR     R0,=0x56000014      ;@ R0设为GPBDAT寄存器。此寄存器

                                        ;@ 用于读/写端口B各引脚的数据

            MOV     R1,#0x00000000      ;@ 此值改为0x00000020,

                                        ;@ 可让LED1熄灭

            STR     R1,[R0]             ;@ GPB5输出0,LED1点亮

MAIN_LOOP

            B       MAIN_LOOP

  END

 ---------------------------------------------------------------------------------------------  

 2.使用分散加载文件GPIO.sct

 ; *************************************************************

; *** Scatter-Loading Description File generated by uVision ***

; *************************************************************

      ;LR_IROM1结尾地址不能超过4KB

      ;因为S3C2440的内部Stepingstone只有4KB,如果超过了4KB ,就必须从NAND搬移代码到SDRAM里,

;而主程序里并没有搬移的程序,也就是保证装载的程序必须在4KB以内的flash里。

;其实还有个隐形的条件。LR_IROM1 0x00000FE0 最大也只能为0x00000FE0,因为第一条指令的反汇编是

LDR       R0,[PC,#0x0014],要保证PC+0X0014是小于0x1000,当设置为0x00000fe0,这条指令的是把

地址0x00000fe8+0x0014=0x00000FFC的内容装载到R0里,仔细看代码,果真如此。

;PC指针是指向下两条指令的位置:(执行A,取指B,译码C),当执行A指令,PC已经指向C指令位置了。

如果设置成0x00000fe4,那么地址是0x00000fec+0x0014=0x1000,已经不小于0x1000,所以不能设置成0x000000FE4。

------------------------------disassembly----------------------------------------------------

     6:             LDR     R0,=0x56000010      ;@ R0设为GPBCON寄存器。此寄存器

     7:                                         ;@ 用于选择端口B各引脚的功能:

     8:                                         ;@ 是输出、是输入、还是其他

0x00000FE0  E59F0014  LDR       R0,[PC,#0x0014]

     9:             MOV     R1,#0x00000400        

0x00000FE4  E3A01B01  MOV       R1,#0x00000400

    10:             STR     R1,[R0]             ;@ 设置GPB5为输出口, 位[10:9]=0b01

0x00000FE8  E5801000  STR       R1,[R0]

    11:             LDR     R0,=0x56000014      ;@ R0设为GPBDAT寄存器。此寄存器

    12:                                         ;@ 用于读/写端口B各引脚的数据

0x00000FEC  E59F000C  LDR       R0,[PC,#0x000C]

    13:             MOV     R1,#0x00000000      ;@ 此值改为0x00000020,

    14:                                         ;@ 可让LED1熄灭

0x00000FF0  E3A01000  MOV       R1,#0x00000000

    15:             STR     R1,[R0]             ;@ GPB5输出0,LED1点亮

    16: MAIN_LOOP

0x00000FF4  E5801000  STR       R1,[R0]

    17:             B       MAIN_LOOP

0x00000FF8  EAFFFFFE  B         0x00000FF8

0x00000FFC  56000010  ???PL    

0x00001000  00000000  ANDEQ     R0,R0,R0

     -------------------------------------------------------------------

---------------GPIO.sct-----------------------------------------

LR_IROM1 0x00000FE0 0x04000000  {    ; load region size_region

  ER_IROM1 0x00000FE0 0x04000000  {  ; load address = execution address

   led_on.o (LED, +First)    

   ;*(InRoot$$Sections)

   .ANY (+RO)

  }

  RW_RAM1 0x30000000 UNINIT 0x04000000  {  ; RW data

   .ANY (+RW +ZI)

  }

}

--------------------------------------------------------------------------------

3.实际操作发现进入调试,程序pc会首先跑到0x00000000,而不是我们装载的地方0x00000FE0,

所以我们必须另写一个keildebug的启动脚本文件,并载keil 里设置

-------------------------GPIO.ini--------------------------------------------

FUNC void Setup(void) {

PC = 0x00000FE0;

}

Setup();

---------------------------------------------------------------------------------

代码都准备好了,剩下的工作是在Keil里设置了

在Option for Target “Target1”,或者点击工具栏的魔法棒



 





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  汇编 flash 脚本 c 工具 file