找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10682|回复: 0
打印 上一主题 下一主题
收起左侧

ARM启动过程(Cortex-M3 NXP LPC1768为例)

[复制链接]
跳转到指定楼层
楼主
ID:50962 发表于 2014-8-12 14:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.基本概念(CMSIS): Cortex Micro-controller Software InterfaceStandard,微控制器软件接口标准。
2.CMSIS标准的文件结构:
a) core_cm.c (stdint.h)
b) system_.c (core_cm, system_)
c) startup_.s

其中core_cm.c以及core_cm中为内核设访问层,其中定义了定义了内核中得外设几丁质以及一些内核的访问及控制函数。

startup_.s文件是系统的启动文件,其包括堆和栈的初始化配置、中断向量表的配置以及将程序引导到main()函数等功能。

system_和system_.c文件则是由ARM公司提供模版,各芯片制造商根据自己芯片的特点来编写的。

3.注解startup_.s文件
此文件主要完成三项工作:堆栈以及堆的初始化、定位中断向量表、调用Reset Handler
a) 堆栈以及堆的初始化
; Stack Configuration
;   Stack Size(in Bytes) <0x0-0xFFFFFFFF:8>
;

Stack_Size        EQU    0x00000200


                   AREA    STACK, NOINIT, READWRITE,ALIGN=3  
//指明8字节对齐(ALIGN=3)

Stack_Mem SPACE   Stack_Size
__initial_sp      //此标号有一层隐含的意思那就是在M3中堆栈是满递减堆                               //栈,因为它指定了堆栈指针位于堆栈的高地址(在//Stack_Mem之后)


; Heap Configuration
;   Heap Size (in Bytes)<0x0-0xFFFFFFFF:8>
;

Heap_Size       EQU    0x00000000


              AREA    HEAP, NOINIT, READWRITE,ALIGN=3
__heap_base
Heap_Mem       SPACEHeap_Size
__heap_limit


以上堆和栈的具体地址可以在工程编译后产生的*.map文件中看到。

b) 定位中断向量表
PRESERVE8  
//PRESERVE8指定了以下的代码位8字节对齐

THUMB

//THUMB指定了接下来的代码为THUMB指令集


; Vector Table Mapped to Address 0 atReset


              AREA   RESET, DATA,READONLY
//此语句声明RESET数据段


              EXPORT __Vectors
//导出向量表标号,EXPORT作用类似于C语言中的extern


__Vectors     
              DCD    __initial_sp                   ; Top ofStack
              DCD    Reset_Handler           ; ResetHandler
              DCD    NMI_Handler             ; NMI Handler
              DCD    HardFault_Handler        ; Hard FaultHandler
              DCD    MemManage_Handler        ; MPU FaultHandler
              DCD    BusFault_Handler         ; Bus FaultHandler
              DCD    UsageFault_Handler       ; Usage Fault Handler
              DCD    0                      ;Reserved
              DCD    0                      ;Reserved
              DCD    0                      ;Reserved
              DCD    0                      ;Reserved
              DCD    SVC_Handler             ; SVCallHandler
              DCD    DebugMon_Handler         ; Debug MonitorHandler
              DCD    0                      ;Reserved
              DCD    PendSV_Handler           ; PendSVHandler
              DCD    SysTick_Handler          ; SysTickHandler


              ; ExternalInterrupts
              DCD    WDT_IRQHandler           ; 16:Watchdog Timer
              DCD    TIMER0_IRQHandler        ; 17: Timer0
              DCD    TIMER1_IRQHandler        ; 18: Timer1
              DCD    TIMER2_IRQHandler        ; 19: Timer2
              DCD    TIMER3_IRQHandler        ; 20: Timer3
              DCD    UART0_IRQHandler         ; 21: UART0
(……省略)



c) 调用Reset Handler
; Reset Handler


Reset_Handler  
PROC
              EXPORT Reset_Handler           [WEAK]
              IMPORT SystemInit
              IMPORT __main
              LDR    R0,=SystemInit
              BLX    R0
              LDR    R0, =__main
              BX    R0
             ENDP


注释:引导程序进入__main(此__main是C_Library中的函数,非main())

d) 其他的代码
这段代码是NXP公司的LPC1700系列的MCU特有的一段代码,其他公司的Cortex-M3MCU的启动程序是没有这段代码的。

这段代码是指定LPC1700的CRP加密级别的代码段,芯片上电后会自动读取这一地址的值以确定加密方式,其中CRP_Key =0xffffffff为不加密(0级加密),CRP_Key = 0x12345678为1级加密,CRP_Key =0x87654321为2级加密,CRP_Key =0x43218765为3级加密(最高级加密),3级加密将会禁止所有的ISP指令,也就是说,芯片将不能读写、不能擦除。

              IF    :LNOT::DEF:NO_CRP
              AREA    |.ARM.__at_0x02FC|, CODE,READONLY
CRP_Key      
DCD     0xFFFFFFFF
             ENDIF


              AREA    |.text|, CODE,READONLY


e) 堆栈以及堆的初始化行为
; User Initial Stack &Heap


              IF     :DEF:__MICROLIB
            
              EXPORT __initial_sp
              EXPORT __heap_base
              EXPORT __heap_limit
            
             ELSE
            
              IMPORT __use_two_region_memory
              EXPORT __user_initial_stackheap
__user_initial_stackheap


              LDR     R0, = Heap_Mem
              LDR     R1, =(Stack_Mem + Stack_Size)
              LDR     R2, =(Heap_Mem +  Heap_Size)
              LDR     R3, =Stack_Mem
              BX     LR



4.ARM启动工程详解

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表