lm3fury.pp 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. {
  2. Register definitions and utility code for stellaris
  3. Preliminary startup code
  4. Geoffrey Barton 2010 08 01 [email protected]
  5. based on stm32f103 created by Jeppe Johansen 2009 - [email protected]
  6. }
  7. {$goto on}
  8. unit lm3fury;
  9. interface
  10. type
  11. TBitvector32 = bitpacked array[0..31] of 0..1;
  12. {$PACKRECORDS 4}
  13. const
  14. PeripheralBase = $40000000;
  15. PPBbase = $E0000fff;
  16. APBbase = PeripheralBase;
  17. AHBbase = PeripheralBase+$54000;
  18. portAoffset=APBbase+$4000;
  19. portBoffset=APBbase+$5000;
  20. portCoffset=APBbase+$6000;
  21. portDoffset=APBbase+$7000;
  22. portEoffset=APBbase+$24000;
  23. portFoffset=APBbase+$25000;
  24. portGoffset=APBbase+$26000;
  25. portHoffset=APBbase+$27000;
  26. portJoffset=APBbase+$3d000;
  27. sysconoffset=APBbase+$fe000;
  28. type
  29. TgpioPort=record
  30. data:array[0..255] of dword;dir,_is,ibe,iev,im,ris,mis,icr,
  31. afsel:dword;dummy1:array[0..54] of dword;dr2r,dr4r,dr8r,odr,pur,pdr,slr,den,lock,cr,amsel,pctl:dword;
  32. end;
  33. Tsyscon=record
  34. did0,did1,dc0,res0c,dc1,dc2,dc3,dc4,dc5,dc6,dc7,dc8,borc,res34,res38,res3c,
  35. src0,src1,src2,res4c,ris,imc,misc,resc,rcc,pllcfg,res68,gpiohbctl,rcc2,res74,res78,moscctl:dword;res80:array[0..31] of dword;
  36. rcgc0,rcgc1,rcgc2,res10,scgc0,scgc1,scgc2,
  37. res11,dcgc0,dcgc1,dcgc2,res12c,res130,res134,res138,res13c,res140,dsplpclk,res13,res14,res15,piosccal,
  38. i2smclk,res174,res178,res17c,res180,res184,res188,res18c,dc9,res194,res198,res19c,nvmstat:dword;
  39. end;
  40. {$ALIGN 4}
  41. var
  42. PortA :Tgpioport absolute portAoffset;
  43. PortB :Tgpioport absolute portBoffset;
  44. PortC :Tgpioport absolute portCoffset;
  45. PortD :Tgpioport absolute portDoffset;
  46. PortE :Tgpioport absolute portEoffset;
  47. PortF :Tgpioport absolute portFoffset;
  48. PortG :Tgpioport absolute portGoffset;
  49. PortH :Tgpioport absolute portHoffset;
  50. PortJ :Tgpioport absolute portJoffset;
  51. syscon :Tsyscon absolute sysconoffset;
  52. rcgc0 :dword absolute (sysconoffset+$100);
  53. rcgc1 :dword absolute (sysconoffset+$104);
  54. rcgc2 :dword absolute (sysconoffset+$108);
  55. var
  56. NMI_Handler,
  57. HardFault_Handler,
  58. MemManage_Handler,
  59. BusFault_Handler,
  60. UsageFault_Handler,
  61. SWI_Handler,
  62. DebugMonitor_Handler,
  63. PendingSV_Handler,
  64. Systick_Handler,UART0intvector: pointer;
  65. implementation
  66. var
  67. _data: record end; external name '_data';
  68. _edata: record end; external name '_edata';
  69. _etext: record end; external name '_etext';
  70. _bss_start: record end; external name '_bss_start';
  71. _bss_end: record end; external name '_bss_end';
  72. _stack_top: record end; external name '_stack_top';
  73. procedure PASCALMAIN; external name 'PASCALMAIN';
  74. procedure _FPC_haltproc; assembler; nostackframe; public name '_haltproc';
  75. asm
  76. .Lhalt:
  77. b .Lhalt
  78. end;
  79. procedure _FPC_start; assembler; nostackframe;
  80. label
  81. _start;
  82. asm
  83. .init
  84. .align 16
  85. .long _stack_top // First entry in NVIC table is the new stack pointer
  86. .long _start+1 //gjb changed from stm32f version to avoid invstate error when interrupt fires
  87. //b _start // Reset
  88. .long _start+1
  89. //b .LNMI_Addr // Non maskable interrupt. The RCC Clock Security System (CSS) is linked to the NMI vector.
  90. .long _start+1
  91. //b .LHardFault_Addr // All class of fault
  92. .long _start+1
  93. //b .LMemManage_Addr // Memory management
  94. .long _start+1
  95. //b .LBusFault_Addr // Pre-fetch fault, memory access fault
  96. .long _start+1
  97. //b .LUsageFault_Addr // Undefined instruction or illegal state
  98. .long _start+1
  99. //nop // Reserved
  100. .long _start+1
  101. //nop // Reserved
  102. .long _start+1
  103. //nop // Reserved
  104. .long _start+1
  105. //nop // Reserved
  106. .long _start+1
  107. //b .LSWI_Addr // Software Interrupt vector now SVC
  108. .long _start+1
  109. //b .LDebugMonitor_Addr // Debug Monitor
  110. .long _start+1
  111. //nop // Reserved
  112. .long _start+1
  113. //b .LPendingSV_Addr // Pendable request for system service
  114. .long _start+1
  115. //b .LSystick_Addr // System tick timer
  116. //16
  117. .long .LDefaultHandler+1 //GPIOA #0
  118. .long .LDefaultHandler+1 //GPIOB
  119. .long .LDefaultHandler+1 //GPIOC
  120. .long .LDefaultHandler+1 //GPIOD
  121. .long .LDefaultHandler+1 //GPIOE
  122. .long .LUART0handler+1 //.LDefaultHandler+1 //UART0
  123. .long .LDefaultHandler+1 //UART1
  124. .long .LDefaultHandler+1 //SSI0
  125. //24
  126. .long .LDefaultHandler+1 //I2C0 #8
  127. .long .LDefaultHandler+1 //PWMF
  128. .long .LDefaultHandler+1 //PWMG0
  129. .long .LDefaultHandler+1 //PWMG1
  130. .long .LDefaultHandler+1 //PWMG2
  131. .long .LDefaultHandler+1 //QEI0
  132. .long .LDefaultHandler+1 //ADC0S0
  133. .long .LDefaultHandler+1 //ADC0S1
  134. //32
  135. .long .LDefaultHandler+1 //ADC0S2 #16
  136. .long .LDefaultHandler+1 //ADC0S3
  137. .long .LDefaultHandler+1 //WDGTimer01
  138. .long .LDefaultHandler+1 //T0A
  139. .long .LDefaultHandler+1 //T0B
  140. .long .LDefaultHandler+1 //T1A
  141. .long .LDefaultHandler+1 //T1B
  142. .long .LDefaultHandler+1 //T2A
  143. //40
  144. .long .LDefaultHandler+1 //T2B #24
  145. .long .LDefaultHandler+1 //COMP0
  146. .long .LDefaultHandler+1 //COMP1
  147. .long .LDefaultHandler+1 //COMP2
  148. .long .LDefaultHandler+1 //SYSCON
  149. .long .LDefaultHandler+1 //FLASH
  150. .long .LDefaultHandler+1 //GPIOF
  151. .long .LDefaultHandler+1 //GPIOG
  152. //48
  153. .long .LDefaultHandler+1 //GPIOH #32
  154. .long .LDefaultHandler+1 //UART2
  155. .long .LDefaultHandler+1 //SSI1
  156. .long .LDefaultHandler+1 //T3A
  157. .long .LDefaultHandler+1 //T3B
  158. .long .LDefaultHandler+1 //I2C1
  159. .long .LDefaultHandler+1 //QEI1
  160. .long .LDefaultHandler+1 //CAN0
  161. //56
  162. .long .LDefaultHandler+1 //CAN1 #40
  163. .long .LDefaultHandler+1 //res
  164. .long .LDefaultHandler+1 //ETH
  165. .long .LDefaultHandler+1 //res
  166. .long .LDefaultHandler+1 //USB
  167. .long .LDefaultHandler+1 //PWMG3
  168. .long .LDefaultHandler+1 //UDMAS
  169. .long .LDefaultHandler+1 //UDMAE
  170. //64
  171. .long .LDefaultHandler+1 //ADC1S0 #48
  172. .long .LDefaultHandler+1 //ADC1S1
  173. .long .LDefaultHandler+1 //ADC1S2
  174. .long .LDefaultHandler+1 //ADC1S3
  175. .long .LDefaultHandler+1 //I2S0
  176. .long .LDefaultHandler+1 //EPI
  177. .long .LDefaultHandler+1 //GPIOJ
  178. .long .LDefaultHandler+1 //res #55
  179. .LNMI_Addr:
  180. ldr r0,.L1
  181. ldr pc,[r0]
  182. .LHardFault_Addr:
  183. ldr r0,.L2
  184. ldr pc,[r0]
  185. .LMemManage_Addr:
  186. ldr r0,.L3
  187. ldr pc,[r0]
  188. .LBusFault_Addr:
  189. ldr r0,.L4
  190. ldr pc,[r0]
  191. .LUsageFault_Addr:
  192. ldr r0,.L5
  193. ldr pc,[r0]
  194. .LSWI_Addr:
  195. ldr r0,.L6
  196. ldr pc,[r0]
  197. .LDebugMonitor_Addr:
  198. ldr r0,.L7
  199. ldr pc,[r0]
  200. .LPendingSV_Addr:
  201. ldr r0,.L8
  202. ldr pc,[r0]
  203. .LSystick_Addr:
  204. ldr r0,.L9
  205. ldr pc,[r0]
  206. .LUART0handler:
  207. ldr r0,.L10
  208. ldr pc,[r0]
  209. .L1:
  210. .long NMI_Handler
  211. .L2:
  212. .long HardFault_Handler
  213. .L3:
  214. .long MemManage_Handler
  215. .L4:
  216. .long BusFault_Handler
  217. .L5:
  218. .long UsageFault_Handler
  219. .L6:
  220. .long SWI_Handler
  221. .L7:
  222. .long DebugMonitor_Handler
  223. .L8:
  224. .long PendingSV_Handler
  225. .L9:
  226. .long Systick_Handler
  227. .L10:
  228. .long UART0IntVector
  229. .globl _start
  230. .text
  231. _start:
  232. // Copy initialized data to ram
  233. ldr r1,.L_etext
  234. ldr r2,.L_data
  235. ldr r3,.L_edata
  236. .Lcopyloop:
  237. cmp r2,r3
  238. ittt ls
  239. ldrls r0,[r1],#4
  240. strls r0,[r2],#4
  241. bls .Lcopyloop
  242. // clear onboard ram
  243. ldr r1,.L_bss_start
  244. ldr r2,.L_bss_end
  245. mov r0,#0
  246. .Lzeroloop:
  247. cmp r1,r2
  248. itt ls
  249. strls r0,[r1],#4
  250. bls .Lzeroloop
  251. b PASCALMAIN
  252. b _FPC_haltproc
  253. .L_bss_start:
  254. .long _bss_start
  255. .L_bss_end:
  256. .long _bss_end
  257. .L_etext:
  258. .long _etext
  259. .L_data:
  260. .long _data
  261. .L_edata:
  262. .long _edata
  263. .LDefaultHandlerAddr:
  264. .long .LDefaultHandler
  265. // default irq handler just returns
  266. .LDefaultHandler:
  267. mov pc,r14
  268. end;
  269. end.