您的位置 首页 模拟

ARM发动进程(Cortex-M3 NXP LPC1768为例)

1基本概念(CMSIS):CortexMicro-controllerSoftwareInterfaceStandard,微控制器软件接口标准。2CMSIS标准的文件结构:a)

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发动工程详解

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/moni/263211.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部