新聞中心

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

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

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

        本文引用地址:http://www.104case.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

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

        開辟一塊大小為Stack_Size的棧空間;

        標號__initial_sp指向棧頂位置;

        定義堆空間大小為Heap_Size;

        建立中斷向量表Vectors,cortex-M3規定起始地址必須存放棧頂地址即__initial_sp,緊接著存放復位入口地址,這樣內核復位后就會自動從起始地址的下32位取出復位地址執行復位中斷服務函數。

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

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

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

        圖1:LPC1788 地址映射

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

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

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



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 雷山县| 成安县| 类乌齐县| 信丰县| 镶黄旗| 平阴县| 时尚| 响水县| 望谟县| 沙雅县| 抚顺县| 阜阳市| 太康县| 嘉祥县| 阳原县| 西藏| 米林县| 万宁市| 潜江市| 武夷山市| 灵丘县| 兴义市| 徐闻县| 临武县| 绍兴县| 景宁| 武平县| 巨鹿县| 绵阳市| 综艺| 湖南省| 日土县| 鄂尔多斯市| 攀枝花市| 会同县| 工布江达县| 勃利县| 日土县| 石泉县| 青海省| 长治县|