关于 keil mdk lpc2100 启动文件的思考

发布者:MysticalGarden最新更新时间:2019-01-17 来源: eefocus关键字:keil  mdk  lpc2100  启动文件 手机看文章 扫描二维码
随时随地手机看文章

;/*****************************************************************************/

;/* STARTUP.S: Startup file for Philips LPC2000                               */

;/*****************************************************************************/

;/* <<< Use Configuration Wizard in Context Menu >>>                          */ 

;/*****************************************************************************/

;/* This file is part of the uVision/ARM development tools.                   */

;/* Copyright (c) 2005-2007 Keil Software. All rights reserved.               */

;/* This software may only be used under the terms of a valid, current,       */

;/* end user licence from KEIL for a compatible version of KEIL software      */

;/* development tools. Nothing else gives you the right to use this software. */

;/*****************************************************************************/





;/*

; *  The STARTUP.S code is executed after CPU Reset. This file may be 

; *  translated with the following SET symbols. In uVision these SET 

; *  symbols are entered under Options - ASM - Define.

; *

; *  REMAP: when set the startup code initializes the register MEMMAP 

; *  which overwrites the settings of the CPU configuration pins. The 

; *  startup and interrupt vectors are remapped from:

; *     0x00000000  default setting (not remapped)

; *     0x80000000  when EXTMEM_MODE is used

; *     0x40000000  when RAM_MODE is used

; *

; *  EXTMEM_MODE: when set the device is configured for code execution

; *  from external memory starting at address 0x80000000.

; *

; *  RAM_MODE: when set the device is configured for code execution

; *  from on-chip RAM starting at address 0x40000000.

; *

; *  EXTERNAL_MODE: when set the PIN2SEL values are written that enable

; *  the external BUS at startup.

; */





; Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs

; 七种模式,cpsr后8位

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

F_Bit           EQU     0x40            ; when F bit is set, FIQ is disabled





;//

;//   

;//   

;//   

;//   

;//   

;//   

;//



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)  



 ;定义一个数据段,8字节对齐

                AREA    STACK, NOINIT, READWRITE, ALIGN=3 

 ;space分配一块内存空间,并用0初始化,这段内存空间的首地址如何确定呢?首地址就是标号

Stack_Mem       SPACE   USR_Stack_Size  

__initial_sp    SPACE   ISR_Stack_Size



Stack_Top ;此处说明栈顶为大地址,栈向下生长。





;//

;//   

;//

;默认堆大小为0,程序运行时可以利用它动态申请内存吗?后文:如果定义了_Microlib,那么

;_heap_base 和_heap_limit可以被其他文件引用 。可以这样理解:如果定义_Microlib,那么

;就可以动态申请堆,并在启动文件中修改Heap_Size的大小,然后就可以用了,而默认是没有堆的

;你说呢?

Heap_Size       EQU     0x00000000 


                AREA    HEAP, NOINIT, READWRITE, ALIGN=3

__heap_base 

Heap_Mem        SPACE   Heap_Size

__heap_limit





; VPBDIV definitions   ;倍频,分频相关

VPBDIV          EQU     0xE01FC100      ; VPBDIV Address



;//

;// Peripheral Bus Clock Rate

;//   

;//               

;//               

;//               

;//   

;//               

;//               

;//               

;//

VPBDIV_SETUP    EQU     0

VPBDIV_Val      EQU     0x00000000





; Phase Locked Loop (PLL) definitions

PLL_BASE        EQU     0xE01FC080      ; PLL Base Address

PLLCON_OFS      EQU     0x00            ; PLL Control Offset

PLLCFG_OFS      EQU     0x04            ; PLL Configuration Offset

PLLSTAT_OFS     EQU     0x08            ; PLL Status Offset

PLLFEED_OFS     EQU     0x0C            ; PLL Feed Offset

PLLCON_PLLE     EQU     (1<<0)          ; PLL Enable

PLLCON_PLLC     EQU     (1<<1)          ; PLL Connect

PLLCFG_MSEL     EQU     (0x1F<<0)       ; PLL Multiplier

PLLCFG_PSEL     EQU     (0x03<<5)       ; PLL Divider

PLLSTAT_PLOCK   EQU     (1<<10)         ; PLL Lock Status



;//

;//   

;//               <1-32>

;//                M Value

;//   

;//               

;//                P Value

;//

PLL_SETUP       EQU     0

PLLCFG_Val      EQU     0x00000020





; Memory Accelerator Module (MAM) definitions

MAM_BASE        EQU     0xE01FC000      ; MAM Base Address

MAMCR_OFS       EQU     0x00            ; MAM Control Offset

MAMTIM_OFS      EQU     0x04            ; MAM Timing Offset



;//

;//   

;//               

;//               

;//               

;//                Mode

;//   

;//               

;//               

;//                Fetch Cycles

;//

MAM_SETUP       EQU     0

MAMCR_Val       EQU     0x00000002

MAMTIM_Val      EQU     0x00000004





; External Memory Controller (EMC) definitions

EMC_BASE        EQU     0xFFE00000      ; EMC Base Address

BCFG0_OFS       EQU     0x00            ; BCFG0 Offset

BCFG1_OFS       EQU     0x04            ; BCFG1 Offset

BCFG2_OFS       EQU     0x08            ; BCFG2 Offset

BCFG3_OFS       EQU     0x0C            ; BCFG3 Offset



;//

EMC_SETUP       EQU     0



;//   

;//     

;//     

;//     

;//     

;//     

;//     

;//     

;//                                   

;//   

BCFG0_SETUP EQU         0

BCFG0_Val   EQU         0x0000FBEF



;//   

;//     

;//     

;//     

;//     

;//     

;//     

;//     

;//                                   

;//   

BCFG1_SETUP EQU         0

BCFG1_Val   EQU         0x0000FBEF



;//   

;//     

;//     

;//     

;//     

;//     

;//     

;//     

;//                                   

;//   

BCFG2_SETUP EQU         0

BCFG2_Val   EQU         0x0000FBEF



;//   

;//     

;//     

;//     

;//     

;//     

;//     

;//     

;//                                   

;//   

BCFG3_SETUP EQU         0

BCFG3_Val   EQU         0x0000FBEF



;//End of EMC





; External Memory Pins definitions

PINSEL2         EQU     0xE002C014      ; PINSEL2 Address

PINSEL2_Val     EQU     0x0E6149E4      ; CS0..3, OE, WE, BLS0..3, 

                                        ; D0..31, A2..23, JTAG Pins





                PRESERVE8

                



; Area Definition and Entry Point

;  Startup Code must be linked first at Address at which it expects to run.



                AREA    RESET, CODE, READONLY

                ARM





; Exception Vectors

;  Mapped to Address 0.

;  Absolute addressing mode must be used.

;  Dummy Handlers are implemented as infinite loops which can be modified.


;传说中的中的中断向量表,程序从这里开始

Vectors         LDR     PC, Reset_Addr         

                LDR     PC, Undef_Addr

                LDR     PC, SWI_Addr

                LDR     PC, PAbt_Addr

                LDR     PC, DAbt_Addr

                NOP                            ; Reserved Vector 

;               LDR     PC, IRQ_Addr

                LDR     PC, [PC, #-0x0FF0]     ; Vector from VicVectAddr

                LDR     PC, FIQ_Addr



Reset_Addr      DCD     Reset_Handler

Undef_Addr      DCD     Undef_Handler

SWI_Addr        DCD     SWI_Handler

PAbt_Addr       DCD     PAbt_Handler

DAbt_Addr       DCD     DAbt_Handler

                DCD     0                      ; Reserved Address 

IRQ_Addr        DCD     IRQ_Handler

FIQ_Addr        DCD     FIQ_Handler



Undef_Handler   B       Undef_Handler

SWI_Handler     B       SWI_Handler

PAbt_Handler    B       PAbt_Handler

DAbt_Handler    B       DAbt_Handler

IRQ_Handler     B       IRQ_Handler

FIQ_Handler     B       FIQ_Handler





; Reset Handler



                EXPORT  Reset_Handler

Reset_Handler   





; Setup External Memory Pins

                IF      :DEF:EXTERNAL_MODE

                LDR     R0, =PINSEL2

                LDR     R1, =PINSEL2_Val

                STR     R1, [R0]

                ENDIF





; Setup External Memory Controller

                IF      EMC_SETUP <> 0

                LDR     R0, =EMC_BASE



                IF      BCFG0_SETUP <> 0

                LDR     R1, =BCFG0_Val

                STR     R1, [R0, #BCFG0_OFS]

                ENDIF



                IF      BCFG1_SETUP <> 0

                LDR     R1, =BCFG1_Val

                STR     R1, [R0, #BCFG1_OFS]

                ENDIF



                IF      BCFG2_SETUP <> 0

                LDR     R1, =BCFG2_Val

                STR     R1, [R0, #BCFG2_OFS]

                ENDIF



                IF      BCFG3_SETUP <> 0

                LDR     R1, =BCFG3_Val

                STR     R1, [R0, #BCFG3_OFS]

                ENDIF



                ENDIF   ; EMC_SETUP





; Setup VPBDIV

                IF      VPBDIV_SETUP <> 0

                LDR     R0, =VPBDIV

                LDR     R1, =VPBDIV_Val

                STR     R1, [R0]

                ENDIF





; Setup PLL

                IF      PLL_SETUP <> 0

                LDR     R0, =PLL_BASE

                MOV     R1, #0xAA

                MOV     R2, #0x55



;  Configure and Enable PLL

                MOV     R3, #PLLCFG_Val

                STR     R3, [R0, #PLLCFG_OFS] 

                MOV     R3, #PLLCON_PLLE

                STR     R3, [R0, #PLLCON_OFS]

                STR     R1, [R0, #PLLFEED_OFS]

                STR     R2, [R0, #PLLFEED_OFS]



;  Wait until PLL Locked

PLL_Loop        LDR     R3, [R0, #PLLSTAT_OFS]

                ANDS    R3, R3, #PLLSTAT_PLOCK

                BEQ     PLL_Loop



;  Switch to PLL Clock

                MOV     R3, #(PLLCON_PLLE:OR:PLLCON_PLLC)

                STR     R3, [R0, #PLLCON_OFS]

                STR     R1, [R0, #PLLFEED_OFS]

                STR     R2, [R0, #PLLFEED_OFS]

                ENDIF   ; PLL_SETUP





; Setup MAM

                IF      MAM_SETUP <> 0

                LDR     R0, =MAM_BASE

                MOV     R1, #MAMTIM_Val

                STR     R1, [R0, #MAMTIM_OFS] 

                MOV     R1, #MAMCR_Val

                STR     R1, [R0, #MAMCR_OFS] 

                ENDIF   ; MAM_SETUP





; Memory Mapping (when Interrupt Vectors are in RAM);中断向量重映射

MEMMAP          EQU     0xE01FC040      ; Memory Mapping Control

                IF      :DEF:REMAP

                LDR     R0, =MEMMAP

                IF      :DEF:EXTMEM_MODE

                MOV     R1, #3

                ELIF    :DEF:RAM_MODE

                MOV     R1, #2

                ELSE

                MOV     R1, #1

                ENDIF

                STR     R1, [R0]

                ENDIF





; Initialise Interrupt System

;  ...





; Setup Stack for each mode    ;除系统模式外的6种模式栈连续分布,系统模式的堆栈呢?



                LDR     R0, =Stack_Top



;  Enter Undefined Instruction Mode and set its Stack Pointer

                MSR     CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit

                MOV     SP, R0

                SUB     R0, R0, #UND_Stack_Size



;  Enter Abort Mode and set its Stack Pointer

                MSR     CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit

                MOV     SP, R0

                SUB     R0, R0, #ABT_Stack_Size



;  Enter FIQ Mode and set its Stack Pointer

                MSR     CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit

                MOV     SP, R0

                SUB     R0, R0, #FIQ_Stack_Size



;  Enter IRQ Mode and set its Stack Pointer

                MSR     CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit

                MOV     SP, R0

                SUB     R0, R0, #IRQ_Stack_Size



;  Enter Supervisor Mode and set its Stack Pointer ;栈向下生长

                MSR     CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit

                MOV     SP, R0

                SUB     R0, R0, #SVC_Stack_Size



;  Enter User Mode and set its Stack Pointer

                MSR     CPSR_c, #Mode_USR

                IF      :DEF:__MICROLIB



                EXPORT __initial_sp



                ELSE



                MOV     SP, R0

                SUB     SL, SP, #USR_Stack_Size



                ENDIF





; Enter the C code



                IMPORT  __main

                LDR     R0, =__main

                BX      R0 ;带状态切换的跳转 ,并不是跳到main(),与c/c++库函数有关,待详解;





                IF      :DEF:__MICROLIB



                EXPORT  __heap_base ;export声明一个符号可以被其他文件引用

                EXPORT  __heap_limit



                ELSE

; User Initial Stack & Heap  


; 这个程序段定义堆栈, c外部接口用于动态申请内存? 怎么用


;area定义出来的段名可以在scatter中用来指定区域

                AREA    |.text|, CODE, READONLY 



                IMPORT  __use_two_region_memory ;调用外部:用两个存储区域?

                EXPORT  __user_initial_stackheap

__user_initial_stackheap  ;

;放到寄存器中就完了,啥用呢?R0~R4用来传递参数,以供外部程序设置堆栈

;跟前面所定义用户模式的堆栈有啥区别?

                LDR     R0, =  Heap_Mem  

                LDR     R1, =(Stack_Mem + USR_Stack_Size)

                LDR     R2, = (Heap_Mem +      Heap_Size)

                LDR     R3, = Stack_Mem

                BX      LR ;子程序返回

                ENDIF





                END


这个帖子类似于随笔,看了很多遍才基本把启动文件顺清楚,刚开始对汇编很排斥,虽说看了好多遍,完整看完的真没几遍,最近狠了下,发现汇编


也还是蛮清楚的,就那么几条。堆栈的划分还是有点疑惑,只能在以后的应用中慢慢体会了,到时再更新,欢迎一起讨论啊。

关键字:keil  mdk  lpc2100  启动文件 引用地址:关于 keil mdk lpc2100 启动文件的思考

上一篇:LPC2013 中的启动文件cstartup.s 详解
下一篇:STM32F10xxx_Keil中添加的预定义宏

推荐阅读最新更新时间:2024-03-16 16:22

stm32f407discovery 的keil 4.60ST-linkII不能用解决方法
1 、用资源中的STLink文件替换 C:\Keil\ARM\STLink, 记得备份原来的文件, 2、C:\Keil\TOOLS.INI改成如下的 ORGANIZATION= cs2c NAME= jianzhong , cui EMAIL= cjzswust@gmail.com ARMSEL=1 BOOK0=UV4\RELEASE_NOTES.HTM( uVision Release Notes ) PATH= C:\Keil\ARM VERSION=4.60 PATH1= C:\Program Files\arm-none-eabi-gcc-4_6\ TOOLPR
[单片机]
stm32f407discovery 的<font color='red'>keil</font> 4.60ST-linkII不能用解决方法
STM32 MDK常见错误与解决
1,warning Deprecated declaration/函数/ - give arg types 解决方法:该函数如果没有参数就要在括号里加“void” 2,USER\main.c(39): warning: #223-D: function function declared implicitly 函数没有声明 解决方法:在使用函数之前一定要声明 3,warning: #1-D: last line of file ends without a newline 解决方法:在最后一行加个回车
[单片机]
第5章 STM32F429下载和调试方法(MDK5)
5.1 初学者重要提示 如果使用JLINK调试下载STM32F429,可以使用JLINK V8,V9和V10。 如果使用STLINK调试下载STM32F429,推荐使用最新的电脑端驱动和对应的固件,详情见第2章的2.6小节。 MDK曾发布的STM32F1,F407,F429和F7的所有调试方法的设置细节及其注意事项,同样适用于STM32H7:http://www.armbbs.cn/forum.php?mod=viewthread&tid=14896 。 MDK5调试过程中容易崩溃的问题,请看本章5.4小节,比较重要。 JLINK无法下载解决思路以及常见问题整理,适用于其它LINK:http://www.armb
[单片机]
第5章 STM32F429下载和调试方法(<font color='red'>MDK</font>5)
stm32 启动文件的选择
最近在网上看到一些关于STM32启动文件的问题帖,都是类似这样的问题: 随便选两个 startup_stm32f10x_ld、hd、md这3个启动文件有什么不同??? 官网固件库中的启动文件有啥区别,怎么选择? 搜索了论坛,也看了一下,有一些回答,但是都不太全或者不甚明了。其实我以前也不清楚,当然我是新手,只不过是个爱折腾的新手,因为我觉得,这个有必要弄清楚。一是启动文件在一个工程中有着不可取代的作用,二是对于STM32这个让人蛋疼而又强大的东东,经常是新手乱添加启动文件或者去找一下工程例子 依葫芦画瓢 的添加,试问你的MCU和人家工程例子的就是一样,换一款型号,要命 ?所有说,基于这些,我就说一说我的认识: 注意此处只针
[单片机]
stm32 <font color='red'>启动文件</font>的选择
如何创建51单片机KEIL工程步骤
1. 什么是Keil软件 Keil软件是一款专为嵌入式系统开发而设计的集成开发环境(IDE),常用于51、STM32单片机软件开发的编程软件。Keil编程软件不仅支持多种工具和扩展程序,还能够处理多种文件格式和数据交换方式;可支持单片机程序的在线仿真,或通过仿真器进行实物仿真,大大方便开发人员的工作。 其中,我们常用的Keil软件有两种,分别为Keil C51以及Keil MDK,前者主要用于51单片机等8051内核单片机的开发工具(不支持32位单片机),Keil MDK主要用于ARM架构单片机的开发工具,主要用于STM32单片机等32单片机。所以在使用Keil软件时需要主要这一点。 2.如何创建51单片机KEIL工程步骤
[单片机]
如何创建51单片机<font color='red'>KEIL</font>工程步骤
Keil逻辑分析仪的使用
Keil中的逻辑分析仪可以将指定的变量或VTREG(虚拟仿真寄存器)值的变化以图形的方式表示出来。 注:只能看全局变量。 顶部是工具栏,下面是显示区,工具栏如下: setup:按钮用于定义记录信号的变量、并配置显示输出。 save:按钮用于将当前已记录的信号写到一个文件(*.UVLA)中,一边之后进行分析,还可以存入一个.TAB文件中,使用其他外部工具进行分析。 Min Time:抓取信号的开始时间。 Max Time:抓取信号的结束时间。 Grid:每个栅格代表的时间。 Zoom:调整时基,相当于示波器的“水平”,In是放大,Out是缩小,All是把抓取的信号全部显示出来。可以用滚轮。
[单片机]
<font color='red'>Keil</font>逻辑分析仪的使用
STM32标准库及的Keil软件包下载
在安装好Keil开发工具后,还需要分别安装STM32相关的软件包及相关的函数库。 由于官网一般下载速度较慢,将常用及标准库上传在网盘上,可自行下载。 Keil软件包 链接:https://pan.baidu.com/s/1Uh1J0L9gZSIWKtDzocQWJA 提取码:gdcw STM32标准库 链接:https://pan.baidu.com/s/1NQXKnOTQAr0P3NMqrnI2Ww 提取码: zs99 STM32的软件包属于Keil相关,下载方法如下: 1. 打开链接:https://www.keil.com/dd2/Pack/ 2. 下拉找到所使用的STM32芯片的型号,点击右
[单片机]
STM32标准库及的<font color='red'>Keil</font>软件包下载
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved