Cortex-M3(NXP LPC 1788) 启动代码
startup_LPC177x_8x.s启动代码分析。
参考资料:
Cortex-M3 (NXP LPC1788)之启动代码分析
ARM启动过程(Cortex-M3 NXP LPC1768为例)
;/***************************************************************************** ; * @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 (C) 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. ; * ; *****************************************************************************/; <h> Stack Configuration ; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> ; </h>Stack_Size EQU 0x00002000 ;开辟一块大小为Stack_Size的栈空间AREA STACK, NOINIT, READWRITE, ALIGN=3 ;AREA伪指令:用于定义代码段和数据段,后跟属性标号。 ;其中“READWRITE”表示可读写,“READONLY”只读属性。 ;根据LPC1788的数据手册描述的存储介质,可知可读写段保持在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指向栈顶位置; <h> Heap Configuration ; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> ; </h>Heap_Size EQU 0x00005000 ;定义堆空间大小为Heap_SizeAREA HEAP, NOINIT, READWRITE, ALIGN=3 __heap_base Heap_Mem SPACE Heap_Size __heap_limit;建立中断向量表Vectors,cortex-M3规定起始地址必须存放栈顶地址即__initial_sp,紧接着存放复位入口地址,;这样内核复位后就会自动从起始地址的下32位取出复位地址执行复位中断服务函数。PRESERVE8 ;指定了以下代码为8字节对齐THUMB ;指定了以下代码为THUMB指令集; Vector Table Mapped to Address 0 at ResetAREA RESET, DATA, READONLY ;声明RESET数据段EXPORT __Vectors ;导出向量表标号,EXPORT作用相当于C语言中的extern__Vectors DCD __initial_sp ; Top of StackDCD Reset_Handler ; Reset HandlerDCD NMI_Handler ; NMI HandlerDCD HardFault_Handler ; Hard Fault HandlerDCD MemManage_Handler ; MPU Fault HandlerDCD BusFault_Handler ; Bus Fault HandlerDCD UsageFault_Handler ; Usage Fault HandlerDCD 0 ; ReservedDCD 0 ; ReservedDCD 0 ; ReservedDCD 0 ; ReservedDCD SVC_Handler ; SVCall HandlerDCD DebugMon_Handler ; Debug Monitor HandlerDCD 0 ; ReservedDCD PendSV_Handler ; PendSV HandlerDCD OSPendSV ; used by uCOS-IIDCD SysTick_Handler ; SysTick Handler'used by uCOS-II ; 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: EEPROM ;这段代码是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_CRPAREA |.ARM.__at_0x02FC|, CODE, READONLY CRP_Key DCD 0xFFFFFFFFENDIFAREA |.text|, CODE, READONLY; Reset HandlerReset_Handler PROCEXPORT Reset_Handler [WEAK] ;声明Reset_Handler的全局性IMPORT SystemInit ;复位后先调用SystemInitIMPORT __main ;再调用__mainLDR R0, =SystemInitBLX R0LDR R0, =__mainBX R0ENDP; Dummy Exception Handlers (infinite loops which can be modified)NMI_Handler PROCEXPORT NMI_Handler [WEAK]B .ENDP HardFault_Handler\PROCEXPORT HardFault_Handler [WEAK]B .ENDP MemManage_Handler\PROCEXPORT MemManage_Handler [WEAK]B .ENDP BusFault_Handler\PROCEXPORT BusFault_Handler [WEAK]B .ENDP UsageFault_Handler\PROCEXPORT UsageFault_Handler [WEAK]B .ENDP SVC_Handler PROCEXPORT SVC_Handler [WEAK]B .ENDP DebugMon_Handler\PROCEXPORT DebugMon_Handler [WEAK]B .ENDP OSPendSV PROCEXPORT OSPendSV [WEAK]B .ENDP SysTick_Handler PROCEXPORT SysTick_Handler [WEAK]B .ENDPDefault_Handler PROCEXPORT 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_IRQHandlerB .ENDPALIGN; User Initial Stack & HeapIF :DEF:__MICROLIBEXPORT __initial_spEXPORT __heap_baseEXPORT __heap_limitELSEIMPORT __use_two_region_memoryEXPORT __user_initial_stackheap __user_initial_stackheapLDR R0, = Heap_MemLDR R1, =(Stack_Mem + Stack_Size)LDR R2, = (Heap_Mem + Heap_Size)LDR R3, = Stack_MemBX LRALIGNENDIFEND
转载于:https://www.cnblogs.com/GBRgbr/p/3656668.html
Cortex-M3(NXP LPC 1788) 启动代码相关推荐
- Cortex‐M3和Cortex‐M0是否都能位带操作
最近在进行stm32l011f4的编程,想到stm32有位带操作,便想试一试,但是事与愿违,先贴下位带操作代码 Cortex‐M0的位带操作代码 //IO输出方向设置 #define SDA_IN() ...
- cortex m0启动代码详解
转自:http://www.cnblogs.com/mddblog/p/4920063.html 阅读目录 概述 1.堆栈空间定义 2.存放中断向量表 3. 复位中断函数(Reset_Handler) ...
- Cortex‐M3的Faults异常究竟是什么?
关注+星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | strongerHuang 有许多朋友在学习,或者开发STM32时都遇到过HardFault_Handler的情 ...
- LPC11C14 启动代码分析
启动代码的一般作用 1.堆和栈的初始化: 2.向量表定义: 3.地址重映射及中断向量表的转移: 4.初始化有特殊要求的断口: 5.处理器模式: 6.进入C应用程序. ARM复位后程序从0x00地址开始 ...
- STM32启动代码学习
目录 文章目录 目录 摘要 第一部分:汇编指令学习 1.伪指令 2. 汇编指令 第二部分:STM32启动流程学习 1.基础知识储备 2.反汇编工具 第三部分:STM32启动代码分析 摘要 本节主要记录 ...
- cortex m3的操作模式和状态
1.操作状态(operation state): debug state:处理器在调试器发起halt或匹配到断点时,会进入debug state并停止执行指令. thumb state:处理器正在运行 ...
- stm32启动代码分析
本文转自:http://blog.sina.com.cn/s/blog_4f09c0b501016eo9.html 在<<STM32不完全手册里面>>,用的是STM32F103 ...
- ARM 架构、ARM7、ARM9、STM32、Cortex M3 M4 、51、AVR 有啥区别
ARM架构.ARM7.ARM9.STM32.Cortex M3 M4.51.AVR之间有什么区别和联系? ARM架构:由英国ARM公司设计的一系列32位的RISC微处理器架构总称,现有ARMv1~AR ...
- ARM 架构、ARM7、ARM9、STM32、Cortex M3 M4 、51、AVR 之间有什么区别和联系?
本文转自嵌入式资讯精选公众号,特别鸣谢, 编者按:初学习ARM单片机的同学们可能会对ARM的架构定义并不是很明确,形形色色的名词背后到底代表什么含义呢?请听听这位嵌入式工程师的经验总结. ARM架构: ...
最新文章
- 征途单机版场景服务器端口被占用,模拟城市5解决端口被占用的方法
- ARM架构中MMU/TLB/Cache的一些概念和寄存器
- 2021-04-02 反步法示例
- AtCoder - 2153 An Ordinary Game list模拟 || 博弈
- 停止使用p = 0.05
- Linux学习笔记-匿名和命名管道读写的相同点及不同点
- 写html前端代码的软件_html用什么软件编写
- Tomcat服务器安装PFX格式证书
- 3D深度估计,让视频特效更梦幻!
- pattern in java_Java里的生产者-消费者模型(Producer and Consumer Pattern in Java)
- 一、app更新提示后台接口开发-(2)数据库表设计
- ubuntu16.04使用ipv6
- LabView-之1: 串口驱动
- 高性能网络之shufflenet v2
- 基于穿戴式智能化步态分析仪的步态分析
- oracle 将钱转换万元单位,oracle 金额单位转换
- 将整数翻译成英文(C++)
- Chapter 3 Raster Images
- 切比雪夫插值多项式在非线性电路中的应用与比较
- linux命令之pip命令