LPC1778启动代码分析.docx

上传人:b****6 文档编号:4295306 上传时间:2022-11-29 格式:DOCX 页数:12 大小:193.06KB
下载 相关 举报
LPC1778启动代码分析.docx_第1页
第1页 / 共12页
LPC1778启动代码分析.docx_第2页
第2页 / 共12页
LPC1778启动代码分析.docx_第3页
第3页 / 共12页
LPC1778启动代码分析.docx_第4页
第4页 / 共12页
LPC1778启动代码分析.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

LPC1778启动代码分析.docx

《LPC1778启动代码分析.docx》由会员分享,可在线阅读,更多相关《LPC1778启动代码分析.docx(12页珍藏版)》请在冰豆网上搜索。

LPC1778启动代码分析.docx

LPC1778启动代码分析

LPC1788启动代码分析

在KeiluVision4中新建一个基于NXP1788的工程后,会提示添加启动汇编代码startup_LPC177x_8x.S。

该文件进行从汇编到C语言运行环境的初始化工作。

[cpp]viewplaincopy

1;/*****************************************************************************

2;*@file:

startup_LPC177x_8x.s

3;*@purpose:

CMSISCortex-M3CoreDeviceStartupFile

4;*fortheNXPLPC177x_8xDeviceSeries

5;*@version:

V1.20

6;*@date:

07.October2010

7;*-------<<>>------------------

8;*

9;*Copyright(C)2010ARMLimited.Allrightsreserved.

10;*ARMLimited(ARM)issupplyingthissoftwareforusewithCortex-M3

11;*processorbasedmicrocontrollers.Thisfilecanbefreelydistributed

12;*withindevelopmenttoolsthataresupportingsuchARMbasedprocessors.

13;*

14;*THISSOFTWAREISPROVIDED"ASIS".NOWARRANTIES,WHETHEREXPRESS,IMPLIED

15;*ORSTATUTORY,INCLUDING,BUTNOTLIMITEDTO,IMPLIEDWARRANTIESOF

16;*MERCHANTABILITYANDFITNESSFORAPARTICULARPURPOSEAPPLYTOTHISSOFTWARE.

17;*ARMSHALLNOT,INANYCIRCUMSTANCES,BELIABLEFORSPECIAL,INCIDENTAL,OR

18;*CONSEQUENTIALDAMAGES,FORANYREASONWHATSOEVER.

19;*

20;*****************************************************************************/

21

22

23;StackConfiguration

24;StackSize(inBytes)<0x0-0xFFFFFFFF:

8>

25;

26

27Stack_SizeEQU0x00000200

28

29AREASTACK,NOINIT,READWRITE,ALIGN=3

30Stack_MemSPACEStack_Size

31__initial_sp

32

33

34;HeapConfiguration

35;HeapSize(inBytes)<0x0-0xFFFFFFFF:

8>

36;

37

38Heap_SizeEQU0x00000400

39

40AREAHEAP,NOINIT,READWRITE,ALIGN=3

41__heap_base

42Heap_MemSPACEHeap_Size

43__heap_limit

44

45

46PRESERVE8

47THUMB

48

49

50;VectorTableMappedtoAddress0atReset

51

52AREARESET,DATA,READONLY

53EXPORT__Vectors

54

55__VectorsDCD__initial_sp;TopofStack

56DCDReset_Handler;ResetHandler

57DCDNMI_Handler;NMIHandler

58DCDHardFault_Handler;HardFaultHandler

59DCDMemManage_Handler;MPUFaultHandler

60DCDBusFault_Handler;BusFaultHandler

61DCDUsageFault_Handler;UsageFaultHandler

62DCD0;Reserved

63DCD0;Reserved

64DCD0;Reserved

65DCD0;Reserved

66DCDSVC_Handler;SVCallHandler

67DCDDebugMon_Handler;DebugMonitorHandler

68DCD0;Reserved

69DCDPendSV_Handler;PendSVHandler

70DCDSysTick_Handler;SysTickHandler

71

72;ExternalInterrupts

73DCDWDT_IRQHandler;16:

WatchdogTimer

74DCDTIMER0_IRQHandler;17:

Timer0

75DCDTIMER1_IRQHandler;18:

Timer1

76DCDTIMER2_IRQHandler;19:

Timer2

77DCDTIMER3_IRQHandler;20:

Timer3

78DCDUART0_IRQHandler;21:

UART0

79DCDUART1_IRQHandler;22:

UART1

80DCDUART2_IRQHandler;23:

UART2

81DCDUART3_IRQHandler;24:

UART3

82DCDPWM1_IRQHandler;25:

PWM1

83DCDI2C0_IRQHandler;26:

I2C0

84DCDI2C1_IRQHandler;27:

I2C1

85DCDI2C2_IRQHandler;28:

I2C2

86DCDSPIFI_IRQHandler;29:

SPIFI

87DCDSSP0_IRQHandler;30:

SSP0

88DCDSSP1_IRQHandler;31:

SSP1

89DCDPLL0_IRQHandler;32:

PLL0Lock(MainPLL)

90DCDRTC_IRQHandler;33:

RealTimeClock

91DCDEINT0_IRQHandler;34:

ExternalInterrupt0

92DCDEINT1_IRQHandler;35:

ExternalInterrupt1

93DCDEINT2_IRQHandler;36:

ExternalInterrupt2

94DCDEINT3_IRQHandler;37:

ExternalInterrupt3

95DCDADC_IRQHandler;38:

A/DConverter

96DCDBOD_IRQHandler;39:

Brown-OutDetect

97DCDUSB_IRQHandler;40:

USB

98DCDCAN_IRQHandler;41:

CAN

99DCDDMA_IRQHandler;42:

GeneralPurposeDMA

100DCDI2S_IRQHandler;43:

I2S

101DCDENET_IRQHandler;44:

Ethernet

102DCDMCI_IRQHandler;45:

SD/MMCcardI/F

103DCDMCPWM_IRQHandler;46:

MotorControlPWM

104DCDQEI_IRQHandler;47:

QuadratureEncoderInterface

105DCDPLL1_IRQHandler;48:

PLL1Lock(USBPLL)

106DCDUSBActivity_IRQHandler;49:

USBActivityinterrupttowakeup

107DCDCANActivity_IRQHandler;50:

CANActivityinterrupttowakeup

108DCDUART4_IRQHandler;51:

UART4

109DCDSSP2_IRQHandler;52:

SSP2

110DCDLCD_IRQHandler;53:

LCD

111DCDGPIO_IRQHandler;54:

GPIO

112DCDPWM0_IRQHandler;55:

PWM0

113DCDEEPROM_IRQHandler;56:

EEPROM

114

115

116IF:

LNOT:

:

DEF:

NO_CRP

117AREA|.ARM.__at_0x02FC|,CODE,READONLY

118CRP_KeyDCD0xFFFFFFFF

119ENDIF

120

121

122AREA|.text|,CODE,READONLY

123

124

125;ResetHandler

126

127Reset_HandlerPROC

128EXPORTReset_Handler[WEAK]

129IMPORTSystemInit

130IMPORT__main

131LDRR0,=SystemInit

132BLXR0

133LDRR0,=__main

134BXR0

135ENDP

136

137

138;DummyExceptionHandlers(infiniteloopswhichcanbemodified)

139

140NMI_HandlerPROC

141EXPORTNMI_Handler[WEAK]

142B.

143ENDP

144HardFault_Handler\

145PROC

146EXPORTHardFault_Handler[WEAK]

147B.

148ENDP

149MemManage_Handler\

150PROC

151EXPORTMemManage_Handler[WEAK]

152B.

153ENDP

154BusFault_Handler\

155PROC

156EXPORTBusFault_Handler[WEAK]

157B.

158ENDP

159UsageFault_Handler\

160PROC

161EXPORTUsageFault_Handler[WEAK]

162B.

163ENDP

164SVC_HandlerPROC

165EXPORTSVC_Handler[WEAK]

166B.

167ENDP

168DebugMon_Handler\

169PROC

170EXPORTDebugMon_Handler[WEAK]

171B.

172ENDP

173PendSV_HandlerPROC

174EXPORTPendSV_Handler[WEAK]

175B.

176ENDP

177SysTick_HandlerPROC

178EXPORTSysTick_Handler[WEAK]

179B.

180ENDP

181

182Default_HandlerPROC

183

184EXPORTWDT_IRQHandler[WEAK]

185EXPORTTIMER0_IRQHandler[WEAK]

186EXPORTTIMER1_IRQHandler[WEAK]

187EXPORTTIMER2_IRQHandler[WEAK]

188EXPORTTIMER3_IRQHandler[WEAK]

189EXPORTUART0_IRQHandler[WEAK]

190EXPORTUART1_IRQHandler[WEAK]

191EXPORTUART2_IRQHandler[WEAK]

192EXPORTUART3_IRQHandler[WEAK]

193EXPORTPWM1_IRQHandler[WEAK]

194EXPORTI2C0_IRQHandler[WEAK]

195EXPORTI2C1_IRQHandler[WEAK]

196EXPORTI2C2_IRQHandler[WEAK]

197EXPORTSPIFI_IRQHandler[WEAK]

198EXPORTSSP0_IRQHandler[WEAK]

199EXPORTSSP1_IRQHandler[WEAK]

200EXPORTPLL0_IRQHandler[WEAK]

201EXPORTRTC_IRQHandler[WEAK]

202EXPORTEINT0_IRQHandler[WEAK]

203EXPORTEINT1_IRQHandler[WEAK]

204EXPORTEINT2_IRQHandler[WEAK]

205EXPORTEINT3_IRQHandler[WEAK]

206EXPORTADC_IRQHandler[WEAK]

207EXPORTBOD_IRQHandler[WEAK]

208EXPORTUSB_IRQHandler[WEAK]

209EXPORTCAN_IRQHandler[WEAK]

210EXPORTDMA_IRQHandler[WEAK]

211EXPORTI2S_IRQHandler[WEAK]

212EXPORTENET_IRQHandler[WEAK]

213EXPORTMCI_IRQHandler[WEAK]

214EXPORTMCPWM_IRQHandler[WEAK]

215EXPORTQEI_IRQHandler[WEAK]

216EXPORTPLL1_IRQHandler[WEAK]

217EXPORTUSBActivity_IRQHandler[WEAK]

218EXPORTCANActivity_IRQHandler[WEAK]

219EXPORTUART4_IRQHandler[WEAK]

220EXPORTSSP2_IRQHandler[WEAK]

221EXPORTLCD_IRQHandler[WEAK]

222EXPORTGPIO_IRQHandler[WEAK]

223EXPORTPWM0_IRQHandler[WEAK]

224EXPORTEEPROM_IRQHandler[WEAK]

225

226WDT_IRQHandler

227TIMER0_IRQHandler

228TIMER1_IRQHandler

229TIMER2_IRQHandler

230TIMER3_IRQHandler

231UART0_IRQHandler

232UART1_IRQHandler

233UART2_IRQHandler

234UART3_IRQHandler

235PWM1_IRQHandler

236I2C0_IRQHandler

237I2C1_IRQHandler

238I2C2_IRQHandler

239SPIFI_IRQHandler

240SSP0_IRQHandler

241SSP1_IRQHandler

242PLL0_IRQHandler

243RTC_IRQHandler

244EINT0_IRQHandler

245EINT1_IRQHandler

246EINT2_IRQHandler

247EINT3_IRQHandler

248ADC_IRQHandler

249BOD_IRQHandler

250USB_IRQHandler

251CAN_IRQHandler

252DMA_IRQHandler

253I2S_IRQHandler

254ENET_IRQHandler

255MCI_IRQHandler

256MCPWM_IRQHandler

257QEI_IRQHandler

258PLL1_IRQHandler

259USBActivity_IRQHandler

260CANActivity_IRQHandler

261UART4_IRQHandler

262SSP2_IRQHandler

263LCD_IRQHandler

264GPIO_IRQHandler

265PWM0_IRQHandler

266EEPROM_IRQHandler

267

268B.

269

270ENDP

271

272

273ALIGN

274

275

276;UserInitialStack&Heap

277

278IF:

DEF:

__MICROLIB

279

280EXPORT__initial_sp

281EXPORT__heap_base

282EXPORT__heap_limit

283

284ELSE

285

286IMPORT__use_two_region_memory

287EXPORT__user_initial_stackheap

288__user_initial_stackheap

289

290LDRR0,=Heap_Mem

291LDRR1,=(Stack_Mem+Stack_Size)

292LDRR2,=(Heap_Mem+Heap_Size)

293LDRR3,=Stack_Mem

294BXLR

295

296ALIGN

297

298ENDIF

299

300

301END

程序完成如下内容的工作:

开辟一块大小为Stack_Size的栈空间;

标号__initial_sp指向栈顶位置;

定义堆空间大小为Heap_Size;

建立中断向量表Vectors,cortex-M3规定起始地址必须存放栈顶地址即__initial_sp,紧接着存放复位入口地址,这样内核复位后就会自动从起始地址的下32位取出复位地址执行复位中断服务函数。

Reset_Handler复位中断函数中先EXPORT声明Reset_Handler的全局性,然后分别执行外部的函数SystemInit和__main。

 

下面对汇编程序中的几个关键字做说明:

AREA伪指令:

用于定义代码段和数据段,后跟属性标号。

其中“READWRITE”表示可读写,“READONLY”只读属性。

根据LPC1788的数据手册描述的存储介质,可知可读写段保持在SRAM区,起始地址为0x10000000,代码中的堆栈保存在SRAM空间。

只读段保存在Flash区,起始地址为0x00000000,代码中的中断向量表保存在Flash空间。

因此可以总结出,在0x00000000存放的是栈顶的地址__initial_sp(即0x10000200),在0x00000004存放的是Reset_Handler的地址。

图1:

LPC1788地址映射

图2:

debug中0地址的值0x10000200即栈顶地址,0x00000004地址值为0x000000F9(看反汇编可知该值即Reset_Handler的入口如下图)。

DCD指令:

开辟内存空间,中断向量表建立中使用相当于C语言中的函数指针,每个成员都是函数指针,指向各个中断服务函数。

 

自此分析了LPC1788的启动,主要包括堆栈初始化,和中断向量表的初始化。

LPC1788有内部Flash,所以上点从内部Flash启动,内部Flash的起始地址为0x00000000,存放栈顶的地址0x10000200。

0x00000004存放复位中断的入口地址。

LPC1788复位后,从0x00000004取出复位入口地址,执行中断复位函数,从而跳转到SystemInit和mainC语言函数执行。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 材料科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1