歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

S3C2440 GPIO例子在ISRAM內仿真分析

在mini2440(S3C2440)的板子上運行LED 的程序,使GPB5輸出低電平,點亮LED.

將代碼在ISRAM 內仿真

  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以內的nand flash裡。

;其實還有個隱形的條件。LR_IROM10x00000FE0 最大也只能為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 0x00000FE00x04000000  {    ; load region size_region
  ER_IROM1 0x00000FE0 0x04000000  {  ; load address = executionaddress
   led_on.o (LED, +First)    
   ;*(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_RAM1 0x30000000 UNINIT 0x04000000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

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

Copyright © Linux教程網 All Rights Reserved