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

发布者:camuspyc最新更新时间:2016-04-06 来源: eefocus关键字:ARM  启动过程  Cortex-M3  LPC1768 手机看文章 扫描二维码
随时随地手机看文章
1. 基本概念(CMSIS): Cortex Micro-controller Software Interface Standard,微控制器软件接口标准。
 
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        SPACE Heap_Size
__heap_limit
 
以上堆和栈的具体地址可以在工程编译后产生的*.map文件中看到。
 
b) 定位中断向量表
PRESERVE8   
//PRESERVE8指定了以下的代码位8字节对齐
 
THUMB
//THUMB指定了接下来的代码为THUMB指令集
 
; Vector Table Mapped to Address 0 at Reset
 
                AREA    RESET, DATA, READONLY
//此语句声明RESET数据段
 
                EXPORT  __Vectors
//导出向量表标号,EXPORT作用类似于C语言中的extern
 
__Vectors       
                DCD     __initial_sp                       ; Top of Stack
                DCD     Reset_Handler              ; Reset Handler
                DCD     NMI_Handler                ; NMI Handler
                DCD     HardFault_Handler          ; Hard Fault Handler
                DCD     MemManage_Handler          ; MPU Fault Handler
                DCD     BusFault_Handler           ; Bus Fault Handler
                DCD     UsageFault_Handler         ; Usage Fault Handler
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     SVC_Handler                ; SVCall Handler
                DCD     DebugMon_Handler           ; Debug Monitor Handler
                DCD     0                          ; Reserved
                DCD     PendSV_Handler             ; PendSV Handler
                DCD     SysTick_Handler            ; SysTick Handler
 
                ; External Interrupts
                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-M3 MCU的启动程序是没有这段代码的。
 
这段代码是指定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启动工程详解
关键字:ARM  启动过程  Cortex-M3  LPC1768 引用地址:ARM启动过程(Cortex-M3 NXP LPC1768为例)

上一篇:LPC1768之串口UART0
下一篇:嵌入式ARM平台调试方法的讨论

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

基于ARM9处理器S3C2410的LCD显示系统设计
引言 S3C2410是三星公司生产的基于ARM920T内核的RISC微处理器,其主频可达203MHz ,适用于信息家电、PDA、手持设备、移动终端等领域,本文介绍了基于S3C2410的显示系统的硬件电路及驱动软件设计方法。 TFT-LCD模块的时序要求 本显示模块选用的LQ080V3DG01是Sharp公司的TFT-LCD器件,该器件的分辨率为640×480,控制时序图如图1所示,时间参数如表1所列 。 硬件电路设计 在该显示系统的硬件电路中,S3C2410与LCD模块的连接是关键,S3C2410内部自带一个LCD驱动控制器,其接口可以与单色、灰度、彩色STN型和彩色TFT型的LCD直接相连,但
[电源管理]
ARM处理器结构
ARM处理器结构 ARM和Thumb状态 RISC技术 流水线技术 超标量技术 ARM和Thumb状态 V4版以后有: (1)32位ARM指令集 (2)16位Thumb指令集,功能是ARM指令集的功能子集。 ARM7TDMI核以后,T变种的ARM微处理器有两种工作状态: (1)ARM状态 (2)Thumb状态。 当ARM微处理器执行32位的ARM指令集时,工作在ARM状态; 当ARM微处理器执行16位的Thumb指令集时,工作在Thumb状态 Thumb技术介绍 ARM7体系结构被广泛应用的时候,嵌入式控制器的市场仍然由8位、16位处理器占领。这些产品不能满足高端应用。这些应用需要32位RISC
[单片机]
<font color='red'>ARM</font>处理器结构
基于ARM9的无线多床位心电监护仪的设计
1 引言   随着社会生活节奏加快、人口逐渐老龄化,心血管疾病已经成为同前威胁人类生命的丰要疾病之一,此类疾病往往具有突发性、短暂性和危险性的特点,如果不能及时发现并进行治疗将会产生非常严重的后果。心电图是检查.诊断和预防该类疾病的主要手段和依据,对于心肌梗塞、心律失常等症状,心电监护仪的使用贯穿于治疗、康复的整个过程。由于传统的基于PC机平台的心电躲护仪,价格昂贵,体积庞大,不便于移动且主要集中在大医院,给医生和病人带来了很大的不便。因此,为了降低成本、缩小体积,本文设计了一种基于ARM9微处理器的新型便携式多床位遥测心电监护仪。该监护仪采用Samsung公司的一款以ARM920T为控制器内核的16/32位高速处理器S3C24
[医疗电子]
基于<font color='red'>ARM</font>9的无线多床位心电监护仪的设计
ARM便携式系统功耗管理的系统级设计
arm微处理器因其高性能和低功耗的特性,特别适合于便携式系统的应用。而系统级的问题对于有效的功耗管理也是非常重要的。本文主要对硬件及系统的功耗管理作一些介绍。 功耗管理电路能尽可能地降低便携式系统的用电量。最主要的优点是延长电池的使用寿命,当然还有其他一些优点,如减少散热量等。充分了解系统各部分组件的耗电情况、降低系统哪部分耗电量比较合理等问题是至关重要的。功耗管理是由软件、处理器、外设、电源等一起构成的系统问题。 处理器 便携式系统的处理器中有大量与系统其他电路相连的开关晶体管,消耗了大量的电能。因处理器运行着软件,所以可使其中某些不执行任务的部件关断或减慢运行速度。 CMOS基础 处理器由CMOS电路构成。下面的公
[单片机]
cortex-M3粗略延时计算
最近调试磁铁驱动程序时,遇到一个奇怪的情况:(问题描述在下边这个帖子中) OSTimeDly在ucos最高优先级任务中,多次使用,有什么说法? 只是知道问题大概出现在哪块,没找到出现这种状况的理由。顺带着理清楚一些基本的常识性的东西。如下: 基本概念: AHB:Advanced High performance Bus,先进的高性能总线,这是一种“系统总线”。AHB 是在地址/控制阶段和数据阶段之间具有固定流水线的总线协议。它只支持由 AMBA AXI 协议提供的功能性的子集。 完全的 AMBA AHB 协议规范包括许多对于主机和从机 IP 开发来说不是必需的属性,因此 ARM 公司建议通常只使用该协议的子集。这个子集
[单片机]
ARM推Android开发工具 欲提升电源效率
据Engadget报道,因Android设备多半采用ARM芯片,为解决电池耗电问题,ARM亲历亲为,推出Android开发工具包。 随着Development Studio 5 Community Edition的发布,该公司已扩大其开发套件的范围,不只针对Linux,也针对谷歌基于Linux的移动操作系统Android。DS - 5不仅优化应用程序的性能,也对电池效率做了很大改进;使用ARM芯片运行Android,尽量提升电池使用时间。 ARM声称DS-5生成的代码比Java快四倍,且集成了标准的Android SDK以及EclipseIDE。
[工业控制]
AMD首款ARM处理器正式登场 挑战英特尔霸主地位
    新浪科技讯 北京时间1月14日晚间消息,经过数年的延迟,AMD今日正式推出了首个基于ARM架构的处理器Opteron A1100,希望在数据中心服务器市场挑战英特尔的霸主地位。   2012年10月,AMD突然宣布将采纳ARM架构自主设计相关处理器产品。2014年初,AMD发布了首款ARM架构处理器Opteron A1100(代号为Seattle)。该款处理器主要面向网络、存储、Web服务器和软件开发等领域。   经过数年的延迟,AMD今日宣布,Opteron A1100将正式批量出货。AMD也承认,这款64位ARM处理器的上市日期确实晚于公司预期。AMD数据中心产品高级主管丹·邦德斯(Dan Bounds)称,
[手机便携]
基于ARM的RFID中问件系统设计
引 言 RFID中间件在RFID读写器和应用程序之间起桥梁作用。应用程序端使用中间件所提供一组通用的应用程序接口(API),即能连到RFID读写器,采集RFID标签数据。即使存储RFID标签情报的数据库软件或后端应用程序增加或改由其他软件取代,或者读写 RFID读写器种类增加等情况发生时,应用端不需修改也能处理,省去多对多连接的维护复杂性问题。嵌入式RFID中间件在RFID的大规模应用中将扮演重要的角色。在具体应用部署过程中,会有大量的嵌入式设备充当边缘中间件的硬件平台。对于众多有意从事中高端RFID读写器开发的硬件厂商而言,借助嵌入式 RFID中间件迅速实现硬件集成基础之上的软件集成,是帮助硬件厂商快速升级产品系列,满足企业
[单片机]
基于<font color='red'>ARM</font>的RFID中问件系统设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

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

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

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