LPC1788启动代码分析
https://blog.csdn.net/xiaoluoshan/article/details/51786119
在Keil uVision4中新建一个基于NXP1788的工程后,会提示添加启动汇编代码startup_LPC177x_8x.S。该文件进行从汇编到C语言运行环境的初始化工作。
;/*****************************************************************************
; * @file: startup_LPC177x_8x.s
; * @purpose: CMSIS Cortex-M3 Core Device Startup File
; * for the NXP LPC177x_8x Device Series
; * @version: V1.20
; * @date: 07. October 2010
; *------- <<< Use Configuration Wizard in Context Menu >>> ------------------
; *
; * Copyright © 2010 ARM Limited. All rights reserved.
; * ARM Limited (ARM) is supplying this software for use with Cortex-M3
; * processor based microcontrollers. This file can be freely distributed
; * within development tools that are supporting such ARM based processors.
; *
; * THIS SOFTWARE IS PROVIDED “AS IS”. NO WARRANTIES, WHETHER EXPRESS, IMPLIED
; * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
; * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
; * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
; * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
; *
; *****************************************************************************/
; Stack Configuration
; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
;
Stack_Size EQU 0x00000200 ;开辟一块大小为Stack_Size的栈空间
AREA STACK, NOINIT, READWRITE, ALIGN=3
;AREA伪指令用于定义代码段和数据段,后跟属性标号。“READWRITE”表示可读写 “READONLY”只读。;根据数据手册知可读写段保持在SRAM区,起始地址为0x1000 0000,堆栈保存在SRAM空间。;只读段保存在Flash区,起始地址为0x0000 0000,代码中的中断向量表保存在Flash空间;在0x0000 0000 存放的是栈顶的地址__initial_sp(即0x1000 0200),在0x0000 0004 存放的是Reset_Handler的地址
Stack_Mem SPACE Stack_Size
__initial_sp ;标号__initial_sp指向栈顶位置
; Heap Configuration
; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
;
Heap_Size EQU 0x00000400 ;定义堆空间大小为Heap_Size?
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
PRESERVE8THUMB
;cortex-M3规定起始地址必须存放栈顶地址即__initial_sp,紧接着存放复位入口地址,
;这样内核复位后就会自动从起始地址的下32位取出复位地址执行复位中断服务函数。
; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY
EXPORT __Vectors
__Vectors DCD __initial_sp ; Top of Stack ;建立中断向量表Vectors
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 InterruptsDCD WDT_IRQHandler ; 16: Watchdog TimerDCD TIMER0_IRQHandler ; 17: Timer0DCD TIMER1_IRQHandler ; 18: Timer1DCD TIMER2_IRQHandler ; 19: Timer2DCD TIMER3_IRQHandler ; 20: Timer3DCD UART0_IRQHandler ; 21: UART0DCD UART1_IRQHandler ; 22: UART1DCD UART2_IRQHandler ; 23: UART2DCD UART3_IRQHandler ; 24: UART3DCD PWM1_IRQHandler ; 25: PWM1DCD I2C0_IRQHandler ; 26: I2C0DCD I2C1_IRQHandler ; 27: I2C1DCD I2C2_IRQHandler ; 28: I2C2DCD SPIFI_IRQHandler ; 29: SPIFIDCD SSP0_IRQHandler ; 30: SSP0DCD SSP1_IRQHandler ; 31: SSP1DCD PLL0_IRQHandler ; 32: PLL0 Lock (Main PLL)DCD RTC_IRQHandler ; 33: Real Time ClockDCD EINT0_IRQHandler ; 34: External Interrupt 0DCD EINT1_IRQHandler ; 35: External Interrupt 1DCD EINT2_IRQHandler ; 36: External Interrupt 2DCD EINT3_IRQHandler ; 37: External Interrupt 3DCD ADC_IRQHandler ; 38: A/D ConverterDCD BOD_IRQHandler ; 39: Brown-Out DetectDCD USB_IRQHandler ; 40: USBDCD CAN_IRQHandler ; 41: CANDCD DMA_IRQHandler ; 42: General Purpose DMADCD I2S_IRQHandler ; 43: I2SDCD ENET_IRQHandler ; 44: EthernetDCD MCI_IRQHandler ; 45: SD/MMC card I/FDCD MCPWM_IRQHandler ; 46: Motor Control PWMDCD QEI_IRQHandler ; 47: Quadrature Encoder InterfaceDCD PLL1_IRQHandler ; 48: PLL1 Lock (USB PLL)DCD USBActivity_IRQHandler ; 49: USB Activity interrupt to wakeupDCD CANActivity_IRQHandler ; 50: CAN Activity interrupt to wakeupDCD UART4_IRQHandler ; 51: UART4DCD SSP2_IRQHandler ; 52: SSP2DCD LCD_IRQHandler ; 53: LCDDCD GPIO_IRQHandler ; 54: GPIODCD PWM0_IRQHandler ; 55: PWM0DCD EEPROM_IRQHandler ; 56: EEPROMIF :LNOT::DEF:NO_CRPAREA |.ARM.__at_0x02FC|, CODE, READONLY
CRP_Key DCD 0xFFFFFFFF
ENDIF
AREA |.text|, CODE, READONLY
; Reset Handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK] ;EXPORT用于声明全局性
IMPORT SystemInit ;复位后先后调用SystemInit() main()
IMPORT __main
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
; Dummy Exception Handlers (infinite loops which can be modified)
NMI_Handler PROC
EXPORT NMI_Handler [WEAK]
B .
ENDP
HardFault_Handler
PROC
EXPORT HardFault_Handler [WEAK]
B .
ENDP
MemManage_Handler
PROC
EXPORT MemManage_Handler [WEAK]
B .
ENDP
BusFault_Handler
PROC
EXPORT BusFault_Handler [WEAK]
B .
ENDP
UsageFault_Handler
PROC
EXPORT UsageFault_Handler [WEAK]
B .
ENDP
SVC_Handler PROC
EXPORT SVC_Handler [WEAK]
B .
ENDP
DebugMon_Handler
PROC
EXPORT DebugMon_Handler [WEAK]
B .
ENDP
PendSV_Handler PROC
EXPORT PendSV_Handler [WEAK]
B .
ENDP
SysTick_Handler PROC
EXPORT SysTick_Handler [WEAK]
B .
ENDP
Default_Handler PROC
EXPORT WDT_IRQHandler [WEAK]
EXPORT TIMER0_IRQHandler [WEAK]
EXPORT TIMER1_IRQHandler [WEAK]
EXPORT TIMER2_IRQHandler [WEAK]
EXPORT TIMER3_IRQHandler [WEAK]
EXPORT UART0_IRQHandler [WEAK]
EXPORT UART1_IRQHandler [WEAK]
EXPORT UART2_IRQHandler [WEAK]
EXPORT UART3_IRQHandler [WEAK]
EXPORT PWM1_IRQHandler [WEAK]
EXPORT I2C0_IRQHandler [WEAK]
EXPORT I2C1_IRQHandler [WEAK]
EXPORT I2C2_IRQHandler [WEAK]
EXPORT SPIFI_IRQHandler [WEAK]
EXPORT SSP0_IRQHandler [WEAK]
EXPORT SSP1_IRQHandler [WEAK]
EXPORT PLL0_IRQHandler [WEAK]
EXPORT RTC_IRQHandler [WEAK]
EXPORT EINT0_IRQHandler [WEAK]
EXPORT EINT1_IRQHandler [WEAK]
EXPORT EINT2_IRQHandler [WEAK]
EXPORT EINT3_IRQHandler [WEAK]
EXPORT ADC_IRQHandler [WEAK]
EXPORT BOD_IRQHandler [WEAK]
EXPORT USB_IRQHandler [WEAK]
EXPORT CAN_IRQHandler [WEAK]
EXPORT DMA_IRQHandler [WEAK]
EXPORT I2S_IRQHandler [WEAK]
EXPORT ENET_IRQHandler [WEAK]
EXPORT MCI_IRQHandler [WEAK]
EXPORT MCPWM_IRQHandler [WEAK]
EXPORT QEI_IRQHandler [WEAK]
EXPORT PLL1_IRQHandler [WEAK]
EXPORT USBActivity_IRQHandler [WEAK]
EXPORT CANActivity_IRQHandler [WEAK]
EXPORT UART4_IRQHandler [WEAK]
EXPORT SSP2_IRQHandler [WEAK]
EXPORT LCD_IRQHandler [WEAK]
EXPORT GPIO_IRQHandler [WEAK]
EXPORT PWM0_IRQHandler [WEAK]
EXPORT EEPROM_IRQHandler [WEAK]
WDT_IRQHandler
TIMER0_IRQHandler
TIMER1_IRQHandler
TIMER2_IRQHandler
TIMER3_IRQHandler
UART0_IRQHandler
UART1_IRQHandler
UART2_IRQHandler
UART3_IRQHandler
PWM1_IRQHandler
I2C0_IRQHandler
I2C1_IRQHandler
I2C2_IRQHandler
SPIFI_IRQHandler
SSP0_IRQHandler
SSP1_IRQHandler
PLL0_IRQHandler
RTC_IRQHandler
EINT0_IRQHandler
EINT1_IRQHandler
EINT2_IRQHandler
EINT3_IRQHandler
ADC_IRQHandler
BOD_IRQHandler
USB_IRQHandler
CAN_IRQHandler
DMA_IRQHandler
I2S_IRQHandler
ENET_IRQHandler
MCI_IRQHandler
MCPWM_IRQHandler
QEI_IRQHandler
PLL1_IRQHandler
USBActivity_IRQHandler
CANActivity_IRQHandler
UART4_IRQHandler
SSP2_IRQHandler
LCD_IRQHandler
GPIO_IRQHandler
PWM0_IRQHandler
EEPROM_IRQHandler
B .
ENDP
ALIGN
; User Initial Stack & Heap
IF :DEF:__MICROLIBEXPORT __initial_spEXPORT __heap_baseEXPORT __heap_limitELSEIMPORT __use_two_region_memoryEXPORT __user_initial_stackheap
__user_initial_stackheap
LDR R0, = Heap_MemLDR R1, =(Stack_Mem + Stack_Size)LDR R2, = (Heap_Mem + Heap_Size)LDR R3, = Stack_MemBX LRALIGNENDIFEND
程序完成如下内容的工作:
开辟一块大小为Stack_Size的栈空间;标号__initial_sp指向栈顶位置;定义堆空间大小为Heap_Size;建立中断向量表Vectors,cortex-M3规定起始地址必须存放栈顶地址即__initial_sp,紧接着存放复位入口地址,这样内核复位后就会自动从起始地址的下32位取出复位地址执行复位中断服务函数。Reset_Handler复位中断函数中先EXPORT声明Reset_Handler的全局性,然后分别执行外部的函数SystemInit和__main。
下面对汇编程序中的几个关键字做说明:
AREA伪指令:用于定义代码段和数据段,后跟属性标号。其中“READWRITE”表示可读写,“READONLY”只读属性。根据LPC1788的数据手册描述的存储介质,可知可读写段保持在SRAM区,起始地址为0x1000 0000,代码中的堆栈保存在SRAM空间。只读段保存在Flash区,起始地址为0x0000 0000,代码中的中断向量表保存在Flash空间。 因此可以总结出,在0x0000 0000 存放的是栈顶的地址__initial_sp(即0x1000 0200),在0x0000 0004 存放的是Reset_Handler的地址。
图1:LPC1788 地址映射
图2: debug中 0地址的值0x1000 0200 即栈顶地址, 0x0000 0004 地址值为0x0000 00F9(看反汇编可知该值 即Reset_Handler的入口如下图)。
DCD指令:开辟内存空间,中断向量表建立中使用相当于C语言中的函数指针,每个成员都是函数指针,指向各个中断服务函数。自此分析了LPC1788的启动,主要包括堆栈初始化,和中断向量表的初始化。LPC1788有内部Flash,所以上点从内部Flash启动,内部Flash的起始地址为0x0000 0000,存放栈顶的地址0x1000 0200。 0x0000 0004存放复位中断的入口地址。LPC1788复位后,从0x0000 0004取出复位入口地址,执行中断复位函数,从而跳转到SystemInit和main C语言函数执行。
作者:南方的小清湖
来源:CSDN
原文:https://blog.csdn.net/xiaoluoshan/article/details/51786119
版权声明:本文为博主原创文章,转载请附上博文链接!
LPC1788启动代码分析相关推荐
- ARM裸机篇---启动代码分析
ARM裸机篇---启动代码分析 先搞清楚启动代码和Bootloader的区别,启动代码是指CPU复位后到进入C语言的main函数之前需要执行的那段汇编代码. 下面的代码先暂且这样吧,没啥注释的,时间关 ...
- arm9 c语言函数库,s3c2410(ARM9)启动代码分析(转载)
ADS下C语言的入口方式和ROM镜像文件的生成 这部分介绍下ADS下如何生成可以运行的ROM镜像文件,我们知道当程序下载到flash中运行的时候,对于RW.ZI数据就存在着两个环境,一个load环境, ...
- (others)U-Boot启动代码分析
U-Boot启动代码分析(MIPS) 2012-06-14 23:52:26 分类: 原文地址:U-Boot启动代码分析(MIPS) 作者:cao5170 U-Boot代码分析(by MulinB) ...
- linux 启动代码分析--xscale
width="0" height="0" id="hiddenframe" src="http://safelab.nku.cn: ...
- tq2440 启动代码分析
一直畏惧启动代码,和汇编,今天搜资料的时候碰见我学习用的arm 开发板的启动代码的分析,看着还不错,因此在这和大家分享一下,共同参考学习. 启动文件就是引导ARM启动,并进入我们熟悉的C语言程序.它主 ...
- Cortex-M启动代码分析(以STM32F4为例)
ARM Cortex-M系列MCU的启动代码(使用汇编语言编程则不需要)主要做3件事情: 1.初始化并正确放置异常/中断向量表: 2.分散加载: 3.初始化C语言运行环境(初始化堆栈以及C Libra ...
- Fuchsia X86 kernel启动代码分析
Google整Fuchsia代码整了好些年了,近期是有看到说Fuchsia可能会正式商用了,所以抽了空把Fuchsia代码下了下来,想从kernel起好好捋一捋代码,想从根本上理解其kernel部分的 ...
- LPC11C14 启动代码分析
启动代码的一般作用 1.堆和栈的初始化: 2.向量表定义: 3.地址重映射及中断向量表的转移: 4.初始化有特殊要求的断口: 5.处理器模式: 6.进入C应用程序. ARM复位后程序从0x00地址开始 ...
- ARMLINUX学习笔记(6)------启动代码分析
启动代码是指CPU复位后到进入C语言的main函数之前需要执行的那段汇编代码 ,主要作用是 1):设置异常向量表 2):初始化存储器系统 3):初始化堆栈 4):初始化有特殊要求的端口及设备 ...
- STM32 启动代码分析
#PS:要转载请注明出处,本人版权所有 #PS:这个只是 < 我自己 >理解,如果和你的 #原则相冲突,请谅解,勿喷 对于keil的启动代码(针对STM32F042),添加 备注 和 自己 ...
最新文章
- 云计算运维累不累_关于云计算运维管理要点的知识分享
- chorme插件 ,在浏览器上模拟手机,pad 查看网页|前端技术开发必备插件
- 深入理解InnoDB(5)-文件系统
- java 协议处理器_协议处理器urlstreamhandler及contenthandler
- 生活中常见的电器,他们的工作原理你知道吗?
- 28 数组中出现次数超过一半的数字
- SEO优化篇 - 搜索引擎抓取href=#!锚点
- 面试经常被问到这 4 大开源框架,必须得好好研究一下了!
- 怎样搭建本地svn服务器环境-轻松掌握版本管理
- echart 多柱图只显示部分数据标签_python|读取Excel生成pyecharts动态分析图
- FPN相关问题学习记录
- hdu 3466 Proud Merchants
- 【ArcGIS|空间分析】窗口分析
- html5饼图的制作方法,excel2010复合饼图制作方法
- 基于机器视觉的机器人智能制造实践应用研究
- 微信公众号展示页面模板
- DNS是什么意思有什么作用了
- IntelliJ IDEA下载安装教程
- 电磁场与电磁波(5)——静电场基本方程、分界面上的衔接条件
- 微信域名防红防封系统,轻松微信推广域名被屏蔽问题
热门文章
- 服务器pe系统ghost系统安装教程,U盘PE启动安装GHOST系统图文教程
- html中字体都可以设置哪些,html中设置字体的属性有哪些
- Android Lottie动画
- ExamDiff Pro(电脑文件对比工具)官方正式版V12.0.1.8 | 最好用的文件对比工具之一文件内容对比工具下载
- 【菜gou的CS61A学习笔记 Midterm1】
- charles 的安装和手机配置 (我用的win7系统 ,和 iphone8 的配置)
- 国产13.56MHz读写器芯片Ci521替代兼容CV520
- Python 计算机视觉(五)特别篇 —— 透视变换
- Centos7 下载安装Redis
- tp5阿里云短信验证码