<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > Cortex-M3 (NXP LPC1788)之啟動代碼分析

          Cortex-M3 (NXP LPC1788)之啟動代碼分析

          作者: 時間:2016-11-19 來源:網(wǎng)絡 收藏
          在Keil uVision4中新建一個基于NXP1788的工程后,會提示添加啟動匯編代碼startup_LPC177x_8x.S。該文件進行從匯編到C語言運行環(huán)境的初始化工作。

          本文引用地址:http://www.ex-cimer.com/article/201611/318444.htm
          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. ;StackConfiguration
          22. ;StackSize(inBytes)<0x0-0xFFFFFFFF:8>
          23. ;
          24. Stack_SizeEQU0x00000200
          25. AREASTACK,NOINIT,READWRITE,ALIGN=3
          26. Stack_MemSPACEStack_Size
          27. __initial_sp
          28. ;HeapConfiguration
          29. ;HeapSize(inBytes)<0x0-0xFFFFFFFF:8>
          30. ;
          31. Heap_SizeEQU0x00000400
          32. AREAHEAP,NOINIT,READWRITE,ALIGN=3
          33. __heap_base
          34. Heap_MemSPACEHeap_Size
          35. __heap_limit
          36. PRESERVE8
          37. THUMB
          38. ;VectorTableMappedtoAddress0atReset
          39. AREARESET,DATA,READONLY
          40. EXPORT__Vectors
          41. __VectorsDCD__initial_sp;TopofStack
          42. DCDReset_Handler;ResetHandler
          43. DCDNMI_Handler;NMIHandler
          44. DCDHardFault_Handler;HardFaultHandler
          45. DCDMemManage_Handler;MPUFaultHandler
          46. DCDBusFault_Handler;BusFaultHandler
          47. DCDUsageFault_Handler;UsageFaultHandler
          48. DCD0;Reserved
          49. DCD0;Reserved
          50. DCD0;Reserved
          51. DCD0;Reserved
          52. DCDSVC_Handler;SVCallHandler
          53. DCDDebugMon_Handler;DebugMonitorHandler
          54. DCD0;Reserved
          55. DCDPendSV_Handler;PendSVHandler
          56. DCDSysTick_Handler;SysTickHandler
          57. ;ExternalInterrupts
          58. DCDWDT_IRQHandler;16:WatchdogTimer
          59. DCDTIMER0_IRQHandler;17:Timer0
          60. DCDTIMER1_IRQHandler;18:Timer1
          61. DCDTIMER2_IRQHandler;19:Timer2
          62. DCDTIMER3_IRQHandler;20:Timer3
          63. DCDUART0_IRQHandler;21:UART0
          64. DCDUART1_IRQHandler;22:UART1
          65. DCDUART2_IRQHandler;23:UART2
          66. DCDUART3_IRQHandler;24:UART3
          67. DCDPWM1_IRQHandler;25:PWM1
          68. DCDI2C0_IRQHandler;26:I2C0
          69. DCDI2C1_IRQHandler;27:I2C1
          70. DCDI2C2_IRQHandler;28:I2C2
          71. DCDSPIFI_IRQHandler;29:SPIFI
          72. DCDSSP0_IRQHandler;30:SSP0
          73. DCDSSP1_IRQHandler;31:SSP1
          74. DCDPLL0_IRQHandler;32:PLL0Lock(MainPLL)
          75. DCDRTC_IRQHandler;33:RealTimeClock
          76. DCDEINT0_IRQHandler;34:ExternalInterrupt0
          77. DCDEINT1_IRQHandler;35:ExternalInterrupt1
          78. DCDEINT2_IRQHandler;36:ExternalInterrupt2
          79. DCDEINT3_IRQHandler;37:ExternalInterrupt3
          80. DCDADC_IRQHandler;38:A/DConverter
          81. DCDBOD_IRQHandler;39:Brown-OutDetect
          82. DCDUSB_IRQHandler;40:USB
          83. DCDCAN_IRQHandler;41:CAN
          84. DCDDMA_IRQHandler;42:GeneralPurposeDMA
          85. DCDI2S_IRQHandler;43:I2S
          86. DCDENET_IRQHandler;44:Ethernet
          87. DCDMCI_IRQHandler;45:SD/MMCcardI/F
          88. DCDMCPWM_IRQHandler;46:MotorControlPWM
          89. DCDQEI_IRQHandler;47:QuadratureEncoderInterface
          90. DCDPLL1_IRQHandler;48:PLL1Lock(USBPLL)
          91. DCDUSBActivity_IRQHandler;49:USBActivityinterrupttowakeup
          92. DCDCANActivity_IRQHandler;50:CANActivityinterrupttowakeup
          93. DCDUART4_IRQHandler;51:UART4
          94. DCDSSP2_IRQHandler;52:SSP2
          95. DCDLCD_IRQHandler;53:LCD
          96. DCDGPIO_IRQHandler;54:GPIO
          97. DCDPWM0_IRQHandler;55:PWM0
          98. DCDEEPROM_IRQHandler;56:EEPROM
          99. IF:LNOT::DEF:NO_CRP
          100. AREA|.ARM.__at_0x02FC|,CODE,READONLY
          101. CRP_KeyDCD0xFFFFFFFF
          102. ENDIF
          103. AREA|.text|,CODE,READONLY
          104. ;ResetHandler
          105. Reset_HandlerPROC
          106. EXPORTReset_Handler[WEAK]
          107. IMPORTSystemInit
          108. IMPORT__main
          109. LDRR0,=SystemInit
          110. BLXR0
          111. LDRR0,=__main
          112. BXR0
          113. ENDP
          114. ;DummyExceptionHandlers(infiniteloopswhichcanbemodified)
          115. NMI_HandlerPROC
          116. EXPORTNMI_Handler[WEAK]
          117. B.
          118. ENDP
          119. HardFault_Handler
          120. PROC
          121. EXPORTHardFault_Handler[WEAK]
          122. B.
          123. ENDP
          124. MemManage_Handler
          125. PROC
          126. EXPORTMemManage_Handler[WEAK]
          127. B.
          128. ENDP
          129. BusFault_Handler
          130. PROC
          131. EXPORTBusFault_Handler[WEAK]
          132. B.
          133. ENDP
          134. UsageFault_Handler
          135. PROC
          136. EXPORTUsageFault_Handler[WEAK]
          137. B.
          138. ENDP
          139. SVC_HandlerPROC
          140. EXPORTSVC_Handler[WEAK]
          141. B.
          142. ENDP
          143. DebugMon_Handler
          144. PROC
          145. EXPORTDebugMon_Handler[WEAK]
          146. B.
          147. ENDP
          148. PendSV_HandlerPROC
          149. EXPORTPendSV_Handler[WEAK]
          150. B.
          151. ENDP
          152. SysTick_HandlerPROC
          153. EXPORTSysTick_Handler[WEAK]
          154. B.
          155. ENDP
          156. Default_HandlerPROC
          157. EXPORTWDT_IRQHandler[WEAK]
          158. EXPORTTIMER0_IRQHandler[WEAK]
          159. EXPORTTIMER1_IRQHandler[WEAK]
          160. EXPORTTIMER2_IRQHandler[WEAK]
          161. EXPORTTIMER3_IRQHandler[WEAK]
          162. EXPORTUART0_IRQHandler[WEAK]
          163. EXPORTUART1_IRQHandler[WEAK]
          164. EXPORTUART2_IRQHandler[WEAK]
          165. EXPORTUART3_IRQHandler[WEAK]
          166. EXPORTPWM1_IRQHandler[WEAK]
          167. EXPORTI2C0_IRQHandler[WEAK]
          168. EXPORTI2C1_IRQHandler[WEAK]
          169. EXPORTI2C2_IRQHandler[WEAK]
          170. EXPORTSPIFI_IRQHandler[WEAK]
          171. EXPORTSSP0_IRQHandler[WEAK]
          172. EXPORTSSP1_IRQHandler[WEAK]
          173. EXPORTPLL0_IRQHandler[WEAK]
          174. EXPORTRTC_IRQHandler[WEAK]
          175. EXPORTEINT0_IRQHandler[WEAK]
          176. EXPORTEINT1_IRQHandler[WEAK]
          177. EXPORTEINT2_IRQHandler[WEAK]
          178. EXPORTEINT3_IRQHandler[WEAK]
          179. EXPORTADC_IRQHandler[WEAK]
          180. EXPORTBOD_IRQHandler[WEAK]
          181. EXPORTUSB_IRQHandler[WEAK]
          182. EXPORTCAN_IRQHandler[WEAK]
          183. EXPORTDMA_IRQHandler[WEAK]
          184. EXPORTI2S_IRQHandler[WEAK]
          185. EXPORTENET_IRQHandler[WEAK]
          186. EXPORTMCI_IRQHandler[WEAK]
          187. EXPORTMCPWM_IRQHandler[WEAK]
          188. EXPORTQEI_IRQHandler[WEAK]
          189. EXPORTPLL1_IRQHandler[WEAK]
          190. EXPORTUSBActivity_IRQHandler[WEAK]
          191. EXPORTCANActivity_IRQHandler[WEAK]
          192. EXPORTUART4_IRQHandler[WEAK]
          193. EXPORTSSP2_IRQHandler[WEAK]
          194. EXPORTLCD_IRQHandler[WEAK]
          195. EXPORTGPIO_IRQHandler[WEAK]
          196. EXPORTPWM0_IRQHandler[WEAK]
          197. EXPORTEEPROM_IRQHandler[WEAK]
          198. WDT_IRQHandler
          199. TIMER0_IRQHandler
          200. TIMER1_IRQHandler
          201. TIMER2_IRQHandler
          202. TIMER3_IRQHandler
          203. UART0_IRQHandler
          204. UART1_IRQHandler
          205. UART2_IRQHandler
          206. UART3_IRQHandler
          207. PWM1_IRQHandler
          208. I2C0_IRQHandler
          209. I2C1_IRQHandler
          210. I2C2_IRQHandler
          211. SPIFI_IRQHandler
          212. SSP0_IRQHandler
          213. SSP1_IRQHandler
          214. PLL0_IRQHandler
          215. RTC_IRQHandler
          216. EINT0_IRQHandler
          217. EINT1_IRQHandler
          218. EINT2_IRQHandler
          219. EINT3_IRQHandler
          220. ADC_IRQHandler
          221. BOD_IRQHandler
          222. USB_IRQHandler
          223. CAN_IRQHandler
          224. DMA_IRQHandler
          225. I2S_IRQHandler
          226. ENET_IRQHandler
          227. MCI_IRQHandler
          228. MCPWM_IRQHandler
          229. QEI_IRQHandler
          230. PLL1_IRQHandler
          231. USBActivity_IRQHandler
          232. CANActivity_IRQHandler
          233. UART4_IRQHandler
          234. SSP2_IRQHandler
          235. LCD_IRQHandler
          236. GPIO_IRQHandler
          237. PWM0_IRQHandler
          238. EEPROM_IRQHandler
          239. B.
          240. ENDP
          241. ALIGN
          242. ;UserInitialStack&Heap
          243. IF:DEF:__MICROLIB
          244. EXPORT__initial_sp
          245. EXPORT__heap_base
          246. EXPORT__heap_limit
          247. ELSE
          248. IMPORT__use_two_region_memory
          249. EXPORT__user_initial_stackheap
          250. __user_initial_stackheap
          251. LDRR0,=Heap_Mem
          252. LDRR1,=(Stack_Mem+Stack_Size)
          253. LDRR2,=(Heap_Mem+Heap_Size)
          254. LDRR3,=Stack_Mem
          255. BXLR
          256. ALIGN
          257. ENDIF
          258. END

          程序完成如下內(nèi)容的工作:

          開辟一塊大小為Stack_Size的??臻g;

          標號__initial_sp指向棧頂位置;

          定義堆空間大小為Heap_Size;

          建立中斷向量表Vectors,cortex-M3規(guī)定起始地址必須存放棧頂?shù)刂芳確_initial_sp,緊接著存放復位入口地址,這樣內(nèi)核復位后就會自動從起始地址的下32位取出復位地址執(zhí)行復位中斷服務函數(shù)。

          Reset_Handler復位中斷函數(shù)中先EXPORT聲明Reset_Handler的全局性,然后分別執(zhí)行外部的函數(shù)SystemInit和__main。

          下面對匯編程序中的幾個關鍵字做說明:

          AREA偽指令:用于定義代碼段和數(shù)據(jù)段,后跟屬性標號。其中“READWRITE”表示可讀寫,“READONLY”只讀屬性。根據(jù)LPC1788的數(shù)據(jù)手冊描述的存儲介質(zhì),可知可讀寫段保持在SRAM區(qū),起始地址為0x1000 0000,代碼中的堆棧保存在SRAM空間。只讀段保存在Flash區(qū),起始地址為0x0000 0000,代碼中的中斷向量表保存在Flash空間。 因此可以總結出,在0x0000 0000 存放的是棧頂?shù)牡刂穇_initial_sp(即0x1000 0200),在0x0000 0004 存放的是Reset_Handler的地址。

          圖1:LPC1788 地址映射

          圖2: debug中 0地址的值0x1000 0200 即棧頂?shù)刂罚?0x0000 0004 地址值為0x0000 00F9(看反匯編可知該值 即Reset_Handler的入口如下圖)。

          DCD指令:開辟內(nèi)存空間,中斷向量表建立中使用相當于C語言中的函數(shù)指針,每個成員都是函數(shù)指針,指向各個中斷服務函數(shù)。

          自此分析了LPC1788的啟動,主要包括堆棧初始化,和中斷向量表的初始化。LPC1788有內(nèi)部Flash,所以上點從內(nèi)部Flash啟動,內(nèi)部Flash的起始地址為0x0000 0000,存放棧頂?shù)牡刂?x1000 0200。 0x0000 0004存放復位中斷的入口地址。LPC1788復位后,從0x0000 0004取出復位入口地址,執(zhí)行中斷復位函數(shù),從而跳轉(zhuǎn)到SystemInit和main C語言函數(shù)執(zhí)行。



          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();