Cortex-M0(NXPLPC11C14)启动代码分析

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

启动代码的一般作用1、堆和栈的初始化;2、向量表定义;3、地址重映射及中断向量表的转移;4、初始化有特殊要求的断口;5、处理器模式;6、进入C应用程序。ARM复位后程序从0x00地址开始执行代码,所以一般都会有将Flash地址映射到0x00的过程。但对于这一款CortexM0的启动代码比较简单,从存储分布图中我们可以看到LPC11C14拥有32K的片内Flash,地址范围是0x00000000~0x00008000,当我们将程序(小于32K)烧写进片内Flash时,启动代码中就可以不用再对Flash的地址重新映射。NXPLPC11C14存储分布图主要看FlashCortexM0的启动代码进行分析:一、堆栈初始化部分在程序开始处,首先定义栈的大小及属性,然后对堆进行初始化操作,ARM-Thumb过程调用标准和ARM、ThumbC/C++编译器总是使用满减(Fulldescending)类型堆栈。;hStackConfiguration;oStackSize(inBytes)0x0-0xFFFFFFFF:8;hStackConfiguration;oStackSize(inBytes)0x0-0xFFFFFFFF:8;/hStack_SizeEQU0x00000020//定义堆栈大小AREASTACK,NOINIT,READWRITE,ALIGN=3//定义一个数据段按8个字节对齐AREA伪指令用于定义一//个代码段或者数据段//NOINIT定义此数据段仅仅保留了内存单元,而没有将各初//始值写入内存单元,或者将各个内存单元值初始化为0Stack_MemSPACEStack_Size//保留Stack_Size大小的堆栈空间,来分配连续Stack_Size//节的存储单元并初始化为0__initial_sp//标号--堆栈顶部地址。M0中堆栈式满递减堆栈,堆栈指针位//于堆栈的高地址Stack_SizeEQU0x00000020//定义堆栈大小;hHeapConfiguration;oHeapSize(inBytes)0x0-0xFFFFFFFF:8;/hHeap_SizeEQU0x00000000//定义堆空间大小AREAHEAP,NOINIT,READWRITE,ALIGN=3//定义了一个数据段,8字节对齐__heap_base//标号--代表为堆末底部地址Heap_MemSPACEHeap_Size//保留Heap_Size的堆空间__heap_limit//标号--堆的界限地址PRESERVE8//指令指定当前文件保持堆栈8字节对齐。它设置PRES8编译属性,以//通知链接器。链接器检查要求堆栈8字节对齐的任何代码是否仅由保持//堆栈8字节对齐的代码直接或者间接地调用。THUMB//指示编译器以后的伪指令为Thum指令二、中断量表定义在MDK生成分散加载文件中,RESET被设置在flash的0地址处,这样就规定了向量表的地址。;VectorTableMappedtoAddress0atResetAREARESET,DATA,READONLY//定义只读数据段,位于0地址,其实放在CODE区//EXPORT在程序中声明一个全局的标号__Vetors号可//可以在其他文件中使用/*DCD伪指令用于分配一片连续的字存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为程序标号或数字表达式。DCD也可用“&”代替。*/__VectorsDCD__initial_sp;TopofStack//给__initial_sp分配4字节32位的地址DCDReset_Handler;ResetHandler//给标号Reset_Handler分配地址DCDNMI_Handler;NMIHandler//给标号NMI_Handler分配地址DCDHardFault_Handler;HardFaultHandlerDCDMemManage_Handler;MPUFaultHandlerDCDBusFault_Handler;BusFaultHandlerDCDUsageFault_Handler;UsageFaultHandlerDCD0;Reserved//保留的,不给任何标号分配DCD0;ReservedDCD0;ReservedDCD0;ReservedDCDSVC_Handler;SVCallHandlerDCDDebugMon_Handler;DebugMonitorHandlerDCD0;ReservedDCDPendSV_Handler;PendSVHandlerDCDSysTick_Handler;SysTickHandler;ExternalInterruptsDCDWAKEUP_IRQHandler;15wakeupsourcesforalltheDCDWAKEUP_IRQHandler;I/OpinsstartingfromPIO0(0:11)DCDWAKEUP_IRQHandler;all40areroutedtothesameISRDCDWAKEUP_IRQHandlerDCDWAKEUP_IRQHandlerDCDWAKEUP_IRQHandlerDCDWAKEUP_IRQHandlerDCDWAKEUP_IRQHandlerDCDWAKEUP_IRQHandlerDCDWAKEUP_IRQHandlerDCDWAKEUP_IRQHandlerDCDWAKEUP_IRQHandlerDCDWAKEUP_IRQHandler;PIO1(0:11)DCDCAN_IRQHandler;CANDCDSSP1_IRQHandler;SSP1DCDI2C_IRQHandler;I2CDCDTIMER16_0_IRQHandler;16-bitTimer0DCDTIMER16_1_IRQHandler;16-bitTimer1DCDTIMER32_0_IRQHandler;32-bitTimer0DCDTIMER32_1_IRQHandler;32-bitTimer1DCDSSP0_IRQHandler;SSP0DCDUART_IRQHandler;UARTDCDUSB_IRQHandler;USBIRQDCDUSB_FIQHandler;USBFIQDCDADC_IRQHandler;A/DConverterDCDWDT_IRQHandler;WatchdogtimerDCDBOD_IRQHandler;BrownOutDetectDCDFMC_IRQHandler;IP2111FlashMemoryControllerDCDPIOINT3_IRQHandler;PIOINT3DCDPIOINT2_IRQHandler;PIOINT2DCDPIOINT1_IRQHandler;PIOINT1DCDPIOINT0_IRQHandler;PIOINT0IF:LNOT::DEF:NO_CRP//进行宏定义判断AREA|.ARM.__at_0x02FC|,CODE,READONLY/****************************************************************************************************************************************************************这有几个关键的地方“NO_CRP”、0x02FC和0xFFFFFFFF,如果我们在前面定义有“NO_CRP”,那么我们后面的代码也就不起作用了,所以在需要加密的时候前面就一定不能再定义了代码读保护,也就是加密的关键字,经过加密后芯片再也无法擦除,除非之前烧写的程序带有IAP,IAP可以使芯片进入ISP模式。****************************************************************************************************************************************************************/CRP_KeyDCD0xFFFFFFFF//加密等级ENDIFAREA|.text|,CODE,READONLY//代码段定义利用PROC,ENDP这一对伪指令把程序段分为若干个过程,是程序的结构更加清晰;ResetHandlerReset_HandlerPROC//过程的开始EXPORTReset_Handler[WEAK]//[WEAK]弱定义,意思是如果在别处也定义该标//(函数),在连接时,用别处的地址。如果没有//他地方定义,编译器也不报错,以此处地址进行链接IMPORT__main//通知编译要使用标号在其他文件LDRR0,=__main//使用“=”表示LDR目前是伪指令,不是标准指令。把__main//地址赋给R0。BXR0//BX是ARM指令集和THUMB指令集之间程序的跳转ENDP//过程结束;DummyExceptionHandlers(infiniteloopswhichcanbemodified)NMI_HandlerPROCEXPORTNMI_Handler[WEAK]B.//原地跳转(即无限循环)ENDPHardFault_Handler\PROCEXPORTHardFault_Handler[WEAK]B.ENDPMemManage_Handler\PROCEXPORTMemManage_Handler[WEAK]B.ENDPBusFault_Handler\PROCEXPORTBusFault_Handler[WEAK]B.ENDPUsageFault_Handler\PROCEXPORTUsageFault_Handler[WEAK]B.ENDPSVC_HandlerPROCEXPORTSVC_Handler[WEAK]B.ENDPDebugMon_Handler\PROCEXPORTDebugMon_Handler[WEAK]B.ENDPPendSV_HandlerPROCEXPORTPendSV_Handler[WEAK]B.ENDPSysTick_HandlerPROCEXPORTSysTick_Handler[WEAK]B.ENDPDefault_HandlerPROCEXPORTWAKEUP_IRQHandler[WEAK]EXPORTCAN_IRQHandler[WEAK]EXPORTSSP1_IRQHandler[WEAK]EXPORTI2C_IRQHandler[WEAK]EXPORTTIMER16_0_IRQHandler[WEAK]EXPORTTIMER16_1_IRQHandler[WEAK]EXPORTTIMER32_0_IRQHandler[WEAK]EXPORTTIMER32_1_IRQHandler[WEAK]EXPORTSSP0_IRQHandler[WEAK]EXPORTUART_IRQHandler[WEAK]EXPORTUSB_IRQHandler[WEAK]EXPORTUSB_FIQHandler[WEAK]EXPORTADC_IRQHandler[WEAK]EXPORTWDT_IRQHandler[WEAK]EXPORTBOD_IRQHandler[WEAK]EXPORTFMC_IRQHandler[WEAK]EXPORTPIOINT3_IRQHandler[WEAK]EXPORTPIOINT2_IRQHandler[WEAK]EXPORTPIOINT1_IRQHandler[WEAK]EXPORTPIOINT0_IRQHandler[WEAK]WAKEUP_IRQHandlerCAN_IRQHandlerSSP1_IRQHandlerI2C_IRQHandlerTIMER16_0_I

1 / 9
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功