微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Cortex-M3 (NXP LPC1788)之启动代码分析

Cortex-M3 (NXP LPC1788)之启动代码分析

时间:11-19 来源:互联网 点击:

  1. BusFault_Handler\
  2. PROC
  3. EXPORTBusFault_Handler[WEAK]
  4. B.
  5. ENDP
  6. UsageFault_Handler\
  7. PROC
  8. EXPORTUsageFault_Handler[WEAK]
  9. B.
  10. ENDP
  11. SVC_HandlerPROC
  12. EXPORTSVC_Handler[WEAK]
  13. B.
  14. ENDP
  15. DebugMon_Handler\
  16. PROC
  17. EXPORTDebugMon_Handler[WEAK]
  18. B.
  19. ENDP
  20. PendSV_HandlerPROC
  21. EXPORTPendSV_Handler[WEAK]
  22. B.
  23. ENDP
  24. SysTick_HandlerPROC
  25. EXPORTSysTick_Handler[WEAK]
  26. B.
  27. ENDP
  28. Default_HandlerPROC
  29. EXPORTWDT_IRQHandler[WEAK]
  30. EXPORTTIMER0_IRQHandler[WEAK]
  31. EXPORTTIMER1_IRQHandler[WEAK]
  32. EXPORTTIMER2_IRQHandler[WEAK]
  33. EXPORTTIMER3_IRQHandler[WEAK]
  34. EXPORTUART0_IRQHandler[WEAK]
  35. EXPORTUART1_IRQHandler[WEAK]
  36. EXPORTUART2_IRQHandler[WEAK]
  37. EXPORTUART3_IRQHandler[WEAK]
  38. EXPORTPWM1_IRQHandler[WEAK]
  39. EXPORTI2C0_IRQHandler[WEAK]
  40. EXPORTI2C1_IRQHandler[WEAK]
  41. EXPORTI2C2_IRQHandler[WEAK]
  42. EXPORTSPIFI_IRQHandler[WEAK]
  43. EXPORTSSP0_IRQHandler[WEAK]
  44. EXPORTSSP1_IRQHandler[WEAK]
  45. EXPORTPLL0_IRQHandler[WEAK]
  46. EXPORTRTC_IRQHandler[WEAK]
  47. EXPORTEINT0_IRQHandler[WEAK]
  48. EXPORTEINT1_IRQHandler[WEAK]
  49. EXPORTEINT2_IRQHandler[WEAK]
  50. EXPORTEINT3_IRQHandler[WEAK]
  51. EXPORTADC_IRQHandler[WEAK]
  52. EXPORTBOD_IRQHandler[WEAK]
  53. EXPORTUSB_IRQHandler[WEAK]
  54. EXPORTCAN_IRQHandler[WEAK]
  55. EXPORTDMA_IRQHandler[WEAK]
  56. EXPORTI2S_IRQHandler[WEAK]
  57. EXPORTENET_IRQHandler[WEAK]
  58. EXPORTMCI_IRQHandler[WEAK]
  59. EXPORTMCPWM_IRQHandler[WEAK]
  60. EXPORTQEI_IRQHandler[WEAK]
  61. EXPORTPLL1_IRQHandler[WEAK]
  62. EXPORTUSBActivity_IRQHandler[WEAK]
  63. EXPORTCANActivity_IRQHandler[WEAK]
  64. EXPORTUART4_IRQHandler[WEAK]
  65. EXPORTSSP2_IRQHandler[WEAK]
  66. EXPORTLCD_IRQHandler[WEAK]
  67. EXPORTGPIO_IRQHandler[WEAK]
  68. EXPORTPWM0_IRQHandler[WEAK]
  69. EXPORTEEPROM_IRQHandler[WEAK]
  70. WDT_IRQHandler
  71. TIMER0_IRQHandler
  72. TIMER1_IRQHandler
  73. TIMER2_IRQHandler
  74. TIMER3_IRQHandler
  75. UART0_IRQHandler
  76. UART1_IRQHandler
  77. UART2_IRQHandler
  78. UART3_IRQHandler
  79. PWM1_IRQHandler
  80. I2C0_IRQHandler
  81. I2C1_IRQHandler
  82. I2C2_IRQHandler
  83. SPIFI_IRQHandler
  84. SSP0_IRQHandler
  85. SSP1_IRQHandler
  86. PLL0_IRQHandler
  87. RTC_IRQHandler
  88. EINT0_IRQHandler
  89. EINT1_IRQHandler
  90. EINT2_IRQHandler
  91. EINT3_IRQHandler
  92. ADC_IRQHandler
  93. BOD_IRQHandler
  94. USB_IRQHandler
  95. CAN_IRQHandler
  96. DMA_IRQHandler
  97. I2S_IRQHandler
  98. ENET_IRQHandler
  99. MCI_IRQHandler
  100. MCPWM_IRQHandler
  101. QEI_IRQHandler
  102. PLL1_IRQHandler
  103. USBActivity_IRQHandler
  104. CANActivity_IRQHandler
  105. UART4_IRQHandler
  106. SSP2_IRQHandler
  107. LCD_IRQHandler
  108. GPIO_IRQHandler
  109. PWM0_IRQHandler
  110. EEPROM_IRQHandler
  111. B.
  112. ENDP
  113. ALIGN
  114. ;UserInitialStack&Heap
  115. IF:DEF:__MICROLIB
  116. EXPORT__initial_sp
  117. EXPORT__heap_base
  118. EXPORT__heap_limit
  119. ELSE
  120. IMPORT__use_two_region_memory
  121. EXPORT__user_initial_stackheap
  122. __user_initial_stackheap
  123. LDRR0,=Heap_Mem
  124. LDRR1,=(Stack_Mem+Stack_Size)
  125. LDRR2,=(Heap_Mem+Heap_Size)
  126. LDRR3,=Stack_Mem
  127. BXLR
  128. ALIGN
  129. ENDIF
  130. 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的启动,主要包括堆栈初始化,

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top