LPC1778启动代码分析.docx
《LPC1778启动代码分析.docx》由会员分享,可在线阅读,更多相关《LPC1778启动代码分析.docx(12页珍藏版)》请在冰豆网上搜索。
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语言函数执行。