微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM启动过程(Cortex-M3 NXP LPC1768为例)

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

时间:11-21 来源:互联网 点击:
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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top