MDK自带SC启动代码研究.docx

上传人:b****5 文档编号:6637225 上传时间:2023-01-08 格式:DOCX 页数:25 大小:24.69KB
下载 相关 举报
MDK自带SC启动代码研究.docx_第1页
第1页 / 共25页
MDK自带SC启动代码研究.docx_第2页
第2页 / 共25页
MDK自带SC启动代码研究.docx_第3页
第3页 / 共25页
MDK自带SC启动代码研究.docx_第4页
第4页 / 共25页
MDK自带SC启动代码研究.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

MDK自带SC启动代码研究.docx

《MDK自带SC启动代码研究.docx》由会员分享,可在线阅读,更多相关《MDK自带SC启动代码研究.docx(25页珍藏版)》请在冰豆网上搜索。

MDK自带SC启动代码研究.docx

MDK自带SC启动代码研究

MDK自带S3C2440启动代码分析

ARM启动代码相当于我们电脑的BIOS,也就是ARM启动时对处理器的一些初始化及嵌入式系统硬件的一些初始化。

由于它直接面对处理器内核和硬件控制器进行编程,一般都是用汇编语言。

一般包括:

中断向量表,初始化存储器系统,初始化堆栈,初始化有特殊要求的断口,设备初始化,变量初始化等。

这几天对着RealViewMDK-ARM中自带的启动代码研究了一下,遇到问题又对着数据手册和指令表看了一下,总算对S3C2440A的硬件有了一个大致的了解。

学习嵌入式系统重在系统,学习ARM只是为学习嵌入式系统铺路,懒猫比较笨可能在上系统之前要裸奔几天以强化以下对S3C2440A内部结构的了解。

把MDK自带的S3C2440A.S文件的注释发一下,这些是懒猫结合数据手册与ARM指令表理解了,可能会有错误,放在这里只是引导一下像我一样还没有入门的兄弟们,希望你们不要害怕ARM害怕嵌入式,老毛他老人家说的对,世上无难事,只怕有心人,ARM指令就那么多,看一遍不会就多看几遍,还有一定要学习看软件自带的帮助文件.

/*****************************************************************************/

/*S3C2440.S:

StartupfileforSamsungS3C440                               */

/*****************************************************************************/

/*<<>>                         */

/*****************************************************************************/

/*ThisfileispartoftheuVision/ARMdevelopmenttools.                  */

/*Copyright(c)2005-2008KeilSoftware.Allrightsreserved.              */

/*Thissoftwaremayonlybeusedunderthetermsofavalid,current,      */

/*enduserlicencefromKEILforacompatibleversionofKEILsoftware     */

/*developmenttools.Nothingelsegivesyoutherighttousethissoftware.*/

/*****************************************************************************/

下面这些参数是与CPSR状态寄存器有关

参数的由来:

这里各个模式的参数是由寄存器CPSR的模式位设置M[4:

0]得来的,

比如这里的用户模式,CPSR的M[4:

0]设置为10000就是0x10。

Mode_USR--用户模式,正常程序执行模式,用于应用程序

Mode_FIQ--快速中断模式,用于高速数据传输和通道处理。

Mode_IRQ--外部中断模式,用于通用的中断处理。

Mode_SVC--管理模式,使用的一种保护模式。

Mode_ABT--数据访问中止模式,用于虚拟存储用存储保护

Mode_UND--未定义指令中止模式,当未定义指令执行时进入此模式。

Mode_SYS--系统模式,用于特权级的操作系统任务。

I_Bit   --如果I位被置1,则外部中断被禁止(IRQisdisabled)

F_Bit   --如果F位被置1,则快速中断被禁止(FIQisdisabled)

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

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           。

whenIbitisset,IRQisdisabled

F_Bit          EQU    0x40           。

whenFbitisset,FIQisdisabled

 

-----------------------------栈初始化定义-----------------------------------

下面这些主要是栈配置,系统的栈空间设定

UND_Stack_Size--未定义模式的栈大小

SVC_Stack_Size--超级用户模式的栈大小

ABT_Stack_Size--数据访问终止模式的栈大小

FIQ_Stack_Size--快速中断模式的栈大小

IRQ_Stack_Size--外部中断模式的栈大小

USR_Stack_Size--用户模式的栈大小

ISR_Stack_Size--总堆栈的大小,也就是所有模式下堆栈相加

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

 

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)

                                                        

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

AREA--是一个伪指令,用于段定义。

ARM的汇编程序由段组成,段是相对独立

       的指令或数据单位,每个段由AREA伪指令定义,并定义段的属性。

       STACK --AREA指令的一个参数,定义段名称

       NOINIT--AREA指令的一个参数,指定本数据段仅仅保留了内在单元,而

                 将句初始值写入内存单元,也即将内存单元值初始化为0

       READWRITE--指定本段为可读可写,数据段默认为READWRITE。

                    READWRITE(读写)、READONLY(只读)

ALIGN--也是一个伪指令,指定对齐方式。

ALIGNn指令的对齐值有两种方案

        即n或2^n,这里采用第二种方案即指定后面的指令8字节对齐。

下面这句话的意思是:

开辟一个堆栈段,段名字为STACK,定义为可读可写,将内存单元初始化为0,

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

 

               AREA   STACK,NOINIT,READWRITE,ALIGN=3

                                    

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

SPACE--伪指令,用于分配一块内存单元,并用0初始化,与%同义

其指令格式为:

   {lable} SPACE expr

lable--内存起始地址标号  expr--所要分配的内存字节数  

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

Stack_Mem      SPACE  USR_Stack_Size   。

堆栈内存起始地址标号

__initial_sp   SPACE  ISR_Stack_Size   。

汇编代码的地址标号

 

Stack_Top   。

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

 

Heap_Size      EQU    0x00000000   。

定义堆大小设置

               。

开辟一个名字为HEAP可读可写,不初始化内存单的内存单元。

               AREA   HEAP,NOINIT,READWRITE,ALIGN=3

__heap_base    。

堆的基址

Heap_Mem       SPACE  Heap_Size   。

堆内存起始地址标号

__heap_limit   。

堆结束

 

----------------------------内存初始化定义-----------------------------

在一些应用系统中除了扩展Flash,RAM挂接在外部存储器接口上外,可能还有其它

的外设挂接在外部存储器接口上,不同外设的操作时序什么的都是不一样的,所以

在使用这些外设之前必须初始化连接这些外设存储器接口。

这里因为没扩展,所以

只定义一个片上内存基地址。

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

 

IRAM_BASE      EQU    0x40000000   。

片上SRAM的基地址,即内存基地址

 

-------------------------看门狗初始化定义------------------------------

看门狗在防止程序跑飞,进入无限死循环时起着重要作用。

有些应用可能用不上

看门狗功能,也可能有些应用会用到外部看门狗。

在这个时候内部看门狗必须禁

止,所以有时候会在初始化时将内部看门狗禁止,当以后应用用到时再开启它。

看门狗定时器包括三个寄存器:

WTCON--看门狗控制寄存器,设定看门狗定时器模式

WTDAT--看门狗数据寄存器,用于设定超时宽度

WTCNT--看门狗计数寄存器,里面存放的是看门狗定时器当前值

WT_BASE  --看门狗定时器基地址

WTCON_OFS--看门狗控制寄存器偏移地址,相对于基址

WTDAT_OFS--看门狗数据寄存器偏移地址,相对于基址

WTCNT_OFS--看门狗计数寄存器偏移地址,相对于基址

WT_SETUP --看门狗设置

WTCON_Val--看门狗控制寄存器设置,关闭看门狗

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

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

 

WT_BASE        EQU    0x53000000     。

WatchdogTimerBaseAddress

WTCON_OFS      EQU    0x00           。

WatchdogTimerControlRegisterOffset

WTDAT_OFS      EQU    0x04           。

WatchdogTimerDataRegister   Offset

WTCNT_OFS      EQU    0x08           。

WatchdogTimerCountRegister  Offset

 

WT_SETUP       EQU    0

WTCON_Val      EQU    0x00000000

WTDAT_Val      EQU    0x00008000

 

 

----------------------------时钟与电源管理定义-------------------------

S3C2440A中的时钟控制逻辑可以产生必须的时钟信号,包括CPU的FCLK,AHB总线的

HCLK以及APB总线外设的PCLK3C2440A内部有两个锁相环(PLL):

一个提供FCLK,

HCLK及PCLK,另一个专用于USB模块(48MHz).

CLOCK_BASE  --时钟基地址

LOCKTIME_OFS--锁相环锁定时间计数寄存器偏移地址,相对于基址

MPLLCON_OFS --MPLL配置寄存器偏移地址,相对于基址,主时钟源PLL

UPLLCON_OFS --UPLL配置寄存器偏移地址,相对于基址,USB时钟源PLL

CLKCON_OFS  --时钟控制寄存器偏移地址,相对于基址

CLKSLOW_OFS --时钟减慢控制寄存器偏移地址,相对于基址

CLKDIVN_OFS --时钟分频器控制寄存器偏移地址,相对于基址

CAMDIVN_OFS --摄像头时钟分频器控制寄存器偏移地址,相对于基址,UPLL提供

CLOCK_SETUP --时钟设置

LOCKTIME_Val--PLL锁定时间计数器值

MPLLCON_Val --MPLL配置寄存器值

UPLLCON_Val --UPLL配置寄存器值

CLKCON_Val  --时钟配置寄存器值

CLKSLOW_Val --时钟减慢控制寄存器值

CLKDIVN_Val --时钟分频控制寄存器值

CAMDIVN_Val --摄像头分频控制寄存器值

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

CLOCK_BASE     EQU    0x4C000000     。

ClockBaseAddress

LOCKTIME_OFS   EQU    0x00           。

PLLLockTimeCountRegister  Offset

MPLLCON_OFS    EQU    0x04           。

MPLLConfigurationRegister   Offset

UPLLCON_OFS    EQU    0x08           。

UPLLConfigurationRegister   Offset

CLKCON_OFS     EQU    0x0C           。

ClockGeneratorControlReg   Offset

CLKSLOW_OFS    EQU    0x10           。

ClockSlowControlRegister   Offset

CLKDIVN_OFS    EQU    0x14           。

ClockDividerControlRegisterOffset

CAMDIVN_OFS    EQU    0x18           。

CameraClockDividerRegister Offset

 

CLOCK_SETUP    EQU    0

LOCKTIME_Val   EQU    0x0FFF0FFF

MPLLCON_Val    EQU    0x00043011

UPLLCON_Val    EQU    0x00038021

CLKCON_Val     EQU    0x001FFFF0

CLKSLOW_Val    EQU    0x00000004

CLKDIVN_Val    EQU    0x0000000F

CAMDIVN_Val    EQU    0x00000000

 

--------------------存储控制器设置定义---------------------------------

下面这些都是一些关于存储控制器的地址宏定义

MC_BASE     --存储控制器基地址

BWSCON_OFS  --总线宽度和等待控制寄存器偏移地址

BANKCON0_OFS--BANK1控制寄存器偏移地址

  .

  .

BANKCON7_OFS--BANK7控制寄存器偏移地址

REFRESH_OFS --DRAM/SDRAM刷新控制寄存器偏移地址

BANKSIZE_OFS--可调的bank大小寄存器偏移地址

MRSRB6_OFS  --bank6模式控制寄存器偏移地址

MRSRB7_OFS  --bank7模式控制寄存器偏移地址

MC_SETUP    --存储器控制寄存器设置

BWSCON_Val  --写入总线宽度和等待控制寄存值

BANKCON0_Val--写入Blank0的值

  .

  .

BANKCON7_Val--写入BANK7的值

REFRESH_Val --写入DRAM/SDRAM刷新控制寄存的值

BANKSIZE_Val--写入可调的bank大小寄存的值

MRSRB6_Val  --写入bank6模式控制寄存器的值

MRSRB7_Val  --写入bank7模式控制寄存器的值

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

MC_BASE        EQU    0x48000000     。

MemoryControllerBaseAddress

BWSCON_OFS     EQU    0x00           。

BusWidthandWaitStatusCtrlOffset

BANKCON0_OFS   EQU    0x04           。

Bank0ControlRegister       Offset

BANKCON1_OFS   EQU    0x08           。

Bank1ControlRegister       Offset

BANKCON2_OFS   EQU    0x0C           。

Bank2ControlRegister       Offset

BANKCON3_OFS   EQU    0x10           。

Bank3ControlRegister       Offset

BANKCON4_OFS   EQU    0x14           。

Bank4ControlRegister       Offset

BANKCON5_OFS   EQU    0x18           。

Bank5ControlRegister       Offset

BANKCON6_OFS   EQU    0x1C           。

Bank6ControlRegister       Offset

BANKCON7_OFS   EQU    0x20           。

Bank7ControlRegister       Offset

REFRESH_OFS    EQU    0x24           。

SDRAMRefreshControlRegisterOffset

BANKSIZE_OFS   EQU    0x28           。

FlexibleBankSizeRegister   Offset

MRSRB6_OFS     EQU    0x2C           。

Bank6ModeRegister          Offset

MRSRB7_OFS     EQU    0x30           。

Bank7ModeRegister          Offset

 

MC_SETUP       EQU    1

BWSCON_Val     EQU    0x22000000

BANKCON0_Val   EQU    0x00000700

BANKCON1_Val   EQU    0x00000700

BANKCON2_Val   EQU    0x00000700

BANKCON3_Val   EQU    0x00000700

BANKCON4_Val   EQU    0x00000700

BANKCON5_Val   EQU    0x00000700

BANKCON6_Val   EQU    0x00018005

BANKCON7_Val   EQU    0x00018005

REFRESH_Val    EQU    0x008404F3

BANKSIZE_Val   EQU    0x00000032

MRSRB6_Val     EQU    0x00000020

MRSRB7_Val     EQU    0x00000020

 

---------------------I/O端口宏定义------------------------------

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1