keil调试环境下S3C2440.s的分析

本文详细分析了S3C2440处理器中不同模式的设置,包括用户模式、快速中断模式、外部中断模式等,并介绍了程序状态寄存器(PSRs)的角色,如CPSR和SPSR。同时,讲解了中断屏蔽位I_Bit和F_Bit的使用,以及堆栈和栈配置的相关细节。
摘要由CSDN通过智能技术生成

; Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs ;向量中断模式/非向量中断模式设置

;通过PSRs(程序状态寄存器)来设置

; 系统工作模式设定

; CPSR是当系统前程序状态寄存器,SPSR是备份程序状态寄存器。其中CPSR共用一个物理寄存器,而SPSR一共有5个物理寄存器

; CPSR寄存器设定:CPSR[4..0] 为M4-M0,通过它可以设定处理器的工作模式

 

Mode_USR        EQU     0x10 ; 用户模式

Mode_FIQ        EQU     0x11 ; 快速中断模式

Mode_IRQ        EQU     0x12 ; 外部中断模式

Mode_SVC        EQU     0x13 ; 超级用户模式

Mode_ABT        EQU     0x17 ; 数据访问终止模式

Mode_UND        EQU     0x1B ; 未定义指令终止模式

Mode_SYS        EQU     0x1F ; 系统模式

 

I_Bit           EQU     0x80            ; when I bit is set, IRQ is disabled 外部中断屏蔽位,置1,关闭中断,置0,打开中断

F_Bit           EQU     0x40            ; when F bit is set, FIQ is disabled 快速中断屏蔽位,置1,关闭中断,置0,打开中断

 

 

;----------------------- Stack and Heap Definitions ----------------------------

 

;// <h> Stack Configuration (Stack Sizes in Bytes)

;//   <o0> Undefined Mode      <0x0-0xFFFFFFFF:8>

;//   <o1> Supervisor Mode     <0x0-0xFFFFFFFF:8>

;//   <o2> Abort Mode          <0x0-0xFFFFFFFF:8>

;//   <o3> Fast Interrupt Mode <0x0-0xFFFFFFFF:8>

;//   <o4> Interrupt Mode      <0x0-0xFFFFFFFF:8>

;//   <o5> User/System Mode    <0x0-0xFFFFFFFF:8>

;// </h>

 

; 栈配置,系统的栈空间设定

 

UND_Stack_Size  EQU     0x00000000 ; 未定义模式的栈大小

SVC_Stack_Size  EQU     0x00000008 ; 超级用户模式的栈大小

ABT_Stack_Size  EQU     0x00000000 ; 数据访问终止模式的栈大小

FIQ_Stack_Size  EQU     0x00000000 ; 快速中断模式的栈大小

IRQ_Stack_Size  EQU     0x00000080 ; 外部中断模式的栈大小

USR_Stack_Size  EQU     0x00000400 ; 用户模式的栈大小

 

ISR_Stack_Size  EQU     (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + /

                         FIQ_Stack_Size + IRQ_Stack_Size) ; 所有模式的堆栈相加得到总堆栈的大小

 

; ARM的汇编程序由段组成,段是相对独立的指令或数据单位,每个段由AREA伪指令定义,并定义段的属性。----READWRITE(读写)、READONLY(只读)  

 

                AREA    STACK, NOINIT, READWRITE, ALIGN=3 ; 开辟一个堆栈段,段名字为STACK,定义为可读可写,

; 不初始化内存单元,或将内存单元初始化为0

 

Stack_Mem       SPACE   USR_Stack_Size ; 

__initial_sp    SPACE   ISR_Stack_Size ; 汇编代码的地址标号

Stack_Top ; 堆栈段内容结束, 在这里放个标号,用来获得堆栈顶部地址

 

 

;// <h> Heap Configuration

;//   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF>

;// </h>

 

Heap_Size       EQU     0x00000000 ; 堆大小设置

 

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3 ; 开辟一个段,名字为HEAP可读可写,不初始化内存单元,或者初始化为0

__heap_base

Heap_Mem        SPACE   Heap_Size

__heap_limit

 

 

;----------------------- Memory Definitions ------------------------------------

 

; Internal Memory Base Addresses ; 片上SRAM的基地址,即内存基地址

IRAM_BASE       EQU     0x40000000

 

 

;----------------------- Watchdog Timer Definitions ----------------------------

 

WT_BASE         EQU     0x53000000      ; Watchdog Timer Base Address 看门狗定时器基地址

WTCON_OFS       EQU     0x00            ; Watchdog Timer Control Register Offset 看门狗控制寄存器偏移地址,相对于基址

WTDAT_OFS       EQU     0x04            ; Watchdog Timer Data Register    Offset 看门狗数据寄存器偏移地址,相对于基址

WTCNT_OFS       EQU     0x08            ; Watchdog Timer Count Register   Offset 看门狗计数寄存器偏移地址,相对于基址

 

;// <e> Watchdog Timer Setup

;//   <h> Watchdog Timer Control Register (WTCON)

;//     <o1.8..15>  Prescaler Value <0-255>

;//     <o1.5>      Watchdog Timer Enable

;//     <o1.3..4>   Clock Division Factor

;//       <0=> 16   <1=> 32  <2=> 64  <3=> 128

;//     <o1.2>      Interrupt Generation Enable

;//     <o1.0>      Reset Enable

;//   </h>

;//   <h> Watchdog Timer Data Register (WTDAT)

;//     <o2.0..15>  Count Reload Value <0-65535>

;//   </h>

;// </e> Watchdog Timer Setup

WT_SETUP        EQU     1 ; 看门狗设置

WTCON_Val       EQU     0x00000000 ; 看门狗控制寄存器设置,关闭看门狗

WTDAT_Val       EQU     0x00008000 ; 看门狗数据寄存器设置,初始值即为0x8000

 

 

;----------------------- Clock and Power Management Definitions ----------------

 

CLOCK_BASE      EQU     0x4C000000      ; Clock Base Address ; 时钟基地址

LOCKTIME_OFS    EQU     0x00            ; PLL Lock Time Count Register   Offset ; 锁相环锁定时间计数寄存器偏移地址,相对于基址

MPLLCON_OFS     EQU     0x04            ; MPLL Configuration Register    Offset ; MPLL配置寄存器偏移地址,相对于基址,主时钟源PLL

UPLLCON_OFS     EQU     0x08            ; UPLL Configuration Register    Offset ; UPLL配置寄存器偏移地址,相对于基址,USB时钟源PLL

CLKCON_OFS      EQU     0x0C            ; Clock Generator Control Reg    Offset ; 时钟控制寄存器偏移地址,相对于基址

CLKSLOW_OFS     EQU     0x10            ; Clock Slow Control Register    Offset ; 时钟减慢控制寄存器偏移地址,相对于基址

CLKDIVN_OFS     EQU     0x14            ; Clock Divider Control Register Offset ; 时钟分频器控制寄存器偏移地址,相对于基址

CAMDIVN_OFS     EQU     0x18            ; Camera Clock Divider Register  Offset ; 摄像头时钟分频器控制寄存器偏移地址,相对于基址,UPLL提供

 

;// <e> Clock Setup

;//   <h> PLL Lock Time Count Register (LOCKTIME)

;//     <o1.16..31> U_LTIME: UPLL Lock Time Count Value for UCLK <0x0-0xFFFF>

;//     <o1.0..15>  M_LTIME: MPLL Lock Time Count Value for FCLK, HCLK and PCLK <0x0-0xFFFF>

;//   </h>

;//   <h> MPLL Configuration Register (MPLLCON)

;//     <i> MPLL = (2 * m * Fin) / (p * 2^s)

;//     <o2.12..19> m: Main Divider m Value <9-256><#-8>

;//       <i> m = MDIV + 8

;//     <o2.4..9>   p: Pre-divider p Value <3-64><#-2>

;//       <i> p = PDIV + 2

;//     <o2.0..1>   s: Post Divider s Value <0-3>

;//       <i> s = SDIV 

;//   </h>

;//   <h> UPLL Configuration Register (UPLLCON)

;//     <i> UPLL = ( m * Fin) / (p * 2^s)

;//     <o3.12..19> m: Main Divider m Value <8-263><#-8>

;//       <i> m = MDIV + 8

;//     <o3.4..9>   p: Pre-divider p Value <2-65><#-2>

;//       <i> p = PDIV + 2

;//     <o3.0..1>   s: Post Divider s Value <0-3>

;//       <i> s = SDIV 

;//   </h>

;//   <h> Clock Generation Control Register (CLKCON)

;//     <o4.20>     AC97 Enable

;//     <o4.19>     Camera Enable

;//     <o4.18>     SPI Enable

;//     <o4.17>     IIS Enable

;//     <o4.16>     IIC Enable

;//     <o4.15>     ADC + Touch Screen Enable

;//     <o4.14>     RTC Enable

;//     <o4.13>     GPIO Enable

;//     <o4.12>     UART2 Enable

;//     <o4.11>     UART1 Enable

;//     <o4.10>     UART0 Enable

;//     <o4.9>      SDI Enable

;//     <o4.8>      PWMTIMER Enable

;//     <o4.7>      USB Device Enable

;//     <o4.6>      USB Host Enable

;//     <o4.5>      LCDC Enable

;//     <o4.4>      NAND FLASH Controller Enable

;//     <o4.3>      SLEEP Enable

;//     <o4.2>      IDLE BIT Enable

;//   </h>

;//   <h> Clock Slow Control Register (CLKSLOW)

;//     <o5.7>      UCLK_ON: UCLK ON

;//     <o5.5>      MPLL_OFF: Turn off PLL

;//     <o5.4>      SLOW_BIT: Slow Mode Enable

;//     <o5.0..2>   SLOW_VAL: Slow Clock Divider <0-7>

;//   </h>

;//   <h> Clock Divider Control Register (CLKDIVN)

;//     <o6.3>      DIVN_UPLL: UCLK Select

;//       <0=> UCLK = UPLL clock

;//       <1=> UCLK = UPLL clock / 2

;//     <o6.1..2>   HDIVN: HCLK Select

;//       <0=> HCLK = FCLK

;//       <1=> HCLK = FCLK / 2

;//       <2=> HCLK = FCLK / 4 if HCLK4_HALF = 0 in CAMDIVN, else HCLK = FCLK / 8

;//       <3=> HCLK = FCLK / 3 if HCLK3_HALF = 0 in CAMDIVN, else HCLK = FCLK / 6

;//     <o6.0>      PDIVN: PCLK Select

;//       <0=> PCLK = HCLK

;//       <1=> PCLK = HCLK / 2

;//   </h>

;//   <h> Camera Clock Divider Control Register (CAMDIVN)

;//     <o7.12>     DVS_EN: ARM Core Clock Select

;//       <0=> ARM core runs at FCLK

;//       <1=> ARM core runs at HCLK

;//     <o7.9>      HCLK4_HALF: HDIVN Division Rate Change Bit

;//       <0=> If HDIVN = 2 in CLKDIVN then HCLK = FCLK / 4

;//       <1=> If HDIVN = 2 in CLKDIVN then HCLK = FCLK / 8

;//     <o7.8>      HCLK3_HALF: HDIVN Division Rate Change Bit

;//       <0=> If HDIVN = 3 in CLKDIVN then HCLK = FCLK / 3

;//       <1=> If HDIVN = 3 in CLKDIVN then HCLK = FCLK / 6

;//     <o7.4>      CAMCLK Select

;//       <0=> CAMCLK = UPLL

;//       <1=> CAMCLK = UPLL / CAMCLK_DIV

;//     <o7.0..3>   CAMCLK_DIV: CAMCLK Divider <0-15>

;//       <i> Camera Clock = UPLL / (2 * (CAMCLK_DIV + 1))

;//       <i> Divider is used only if CAMCLK_SEL = 1

;//   </h>

;// </e> Clock Setup

CLOCK_SETUP     EQU     0 ; 时钟设置

LOCKTIME_Val    EQU     0x0FFF0FFF ; PLL锁定时间计数器值

MPLLCON_Val     EQU     0x00043011 ; MPLL配置寄存器值

UPLLCON_Val     EQU     0x00038021 ; UPLL配置寄存器值

CLKCON_Val      EQU     0x001FFFF0 ; 时钟配置寄存器值

CLKSLOW_Val     EQU     0x00000004 ; 时钟减慢控制寄存器值

CLKDIVN_Val     EQU     0x0000000F ; 时钟分频控制寄存器值

CAMDIVN_Val     EQU     0x00000000 ; 摄像头分频控制寄存器值

 

 

;----------------------- Memory Controller Definitions -------------------------

; 存储控制器设置

 

MC_BASE         EQU     0x48000000      ; Memory Controller Base Address ; 存储控制器基地址

BWSCON_OFS      EQU     0x00            ; Bus Width and Wait Status Ctrl Offset ; 总线宽度和等待控制寄存器

BANKCON0_OFS    EQU     0x04            ; Bank 0 Control Register        Offset ; BANK0---BOOT ROM控制寄存器设置

BANKCON1_OFS    EQU     0x08            ; Bank 1 Control Register        Offset ; BANK1

BANKCON2_OFS    EQU     0x0C            ; Bank 2 Control Register        Offset ; BANK2

BANKCON3_OFS    EQU     0x10            ; Bank 3 Control Register        Offset ; BANK3

BANKCON4_OFS    EQU     0x14            ; Bank 4 Control Register        Offset ; BANK4

BANKCON5_OFS    EQU     0x18            ; Bank 5 Control Register        Offset ; BANK5</

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值