stellaris.pp 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  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. unit stellaris;
  8. {$goto on}
  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;rcgc0,
  36. 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 _start;
  81. asm
  82. .init
  83. .align 16
  84. .long _stack_top // First entry in NVIC table is the new stack pointer
  85. .long _start+1 //gjb changed from stm32f version to avoid invstate error when interrupt fires
  86. //b _start // Reset
  87. .long _start+1
  88. //b .LNMI_Addr // Non maskable interrupt. The RCC Clock Security System (CSS) is linked to the NMI vector.
  89. .long _start+1
  90. //b .LHardFault_Addr // All class of fault
  91. .long _start+1
  92. //b .LMemManage_Addr // Memory management
  93. .long _start+1
  94. //b .LBusFault_Addr // Pre-fetch fault, memory access fault
  95. .long _start+1
  96. //b .LUsageFault_Addr // Undefined instruction or illegal state
  97. .long _start+1
  98. //nop // Reserved
  99. .long _start+1
  100. //nop // Reserved
  101. .long _start+1
  102. //nop // Reserved
  103. .long _start+1
  104. //nop // Reserved
  105. .long _start+1
  106. //b .LSWI_Addr // Software Interrupt vector now SVC
  107. .long _start+1
  108. //b .LDebugMonitor_Addr // Debug Monitor
  109. .long _start+1
  110. //nop // Reserved
  111. .long _start+1
  112. //b .LPendingSV_Addr // Pendable request for system service
  113. .long _start+1
  114. //b .LSystick_Addr // System tick timer
  115. //16
  116. .long .LDefaultHandler+1 //GPIOA #0
  117. .long .LDefaultHandler+1 //GPIOB
  118. .long .LDefaultHandler+1 //GPIOC
  119. .long .LDefaultHandler+1 //GPIOD
  120. .long .LDefaultHandler+1 //GPIOE
  121. .long .LUART0handler+1 //.LDefaultHandler+1 //UART0
  122. .long .LDefaultHandler+1 //UART1
  123. .long .LDefaultHandler+1 //SSI0
  124. //24
  125. .long .LDefaultHandler+1 //I2C0 #8
  126. .long .LDefaultHandler+1 //PWMF
  127. .long .LDefaultHandler+1 //PWMG0
  128. .long .LDefaultHandler+1 //PWMG1
  129. .long .LDefaultHandler+1 //PWMG2
  130. .long .LDefaultHandler+1 //QEI0
  131. .long .LDefaultHandler+1 //ADC0S0
  132. .long .LDefaultHandler+1 //ADC0S1
  133. //32
  134. .long .LDefaultHandler+1 //ADC0S2 #16
  135. .long .LDefaultHandler+1 //ADC0S3
  136. .long .LDefaultHandler+1 //WDGTimer01
  137. .long .LDefaultHandler+1 //T0A
  138. .long .LDefaultHandler+1 //T0B
  139. .long .LDefaultHandler+1 //T1A
  140. .long .LDefaultHandler+1 //T1B
  141. .long .LDefaultHandler+1 //T2A
  142. //40
  143. .long .LDefaultHandler+1 //T2B #24
  144. .long .LDefaultHandler+1 //COMP0
  145. .long .LDefaultHandler+1 //COMP1
  146. .long .LDefaultHandler+1 //COMP2
  147. .long .LDefaultHandler+1 //SYSCON
  148. .long .LDefaultHandler+1 //FLASH
  149. .long .LDefaultHandler+1 //GPIOF
  150. .long .LDefaultHandler+1 //GPIOG
  151. //48
  152. .long .LDefaultHandler+1 //GPIOH #32
  153. .long .LDefaultHandler+1 //UART2
  154. .long .LDefaultHandler+1 //SSI1
  155. .long .LDefaultHandler+1 //T3A
  156. .long .LDefaultHandler+1 //T3B
  157. .long .LDefaultHandler+1 //I2C1
  158. .long .LDefaultHandler+1 //QEI1
  159. .long .LDefaultHandler+1 //CAN0
  160. //56
  161. .long .LDefaultHandler+1 //CAN1 #40
  162. .long .LDefaultHandler+1 //res
  163. .long .LDefaultHandler+1 //ETH
  164. .long .LDefaultHandler+1 //res
  165. .long .LDefaultHandler+1 //USB
  166. .long .LDefaultHandler+1 //PWMG3
  167. .long .LDefaultHandler+1 //UDMAS
  168. .long .LDefaultHandler+1 //UDMAE
  169. //64
  170. .long .LDefaultHandler+1 //ADC1S0 #48
  171. .long .LDefaultHandler+1 //ADC1S1
  172. .long .LDefaultHandler+1 //ADC1S2
  173. .long .LDefaultHandler+1 //ADC1S3
  174. .long .LDefaultHandler+1 //I2S0
  175. .long .LDefaultHandler+1 //EPI
  176. .long .LDefaultHandler+1 //GPIOJ
  177. .long .LDefaultHandler+1 //res #55
  178. .LNMI_Addr:
  179. ldr r0,.L1
  180. ldr pc,[r0]
  181. .LHardFault_Addr:
  182. ldr r0,.L2
  183. ldr pc,[r0]
  184. .LMemManage_Addr:
  185. ldr r0,.L3
  186. ldr pc,[r0]
  187. .LBusFault_Addr:
  188. ldr r0,.L4
  189. ldr pc,[r0]
  190. .LUsageFault_Addr:
  191. ldr r0,.L5
  192. ldr pc,[r0]
  193. .LSWI_Addr:
  194. ldr r0,.L6
  195. ldr pc,[r0]
  196. .LDebugMonitor_Addr:
  197. ldr r0,.L7
  198. ldr pc,[r0]
  199. .LPendingSV_Addr:
  200. ldr r0,.L8
  201. ldr pc,[r0]
  202. .LSystick_Addr:
  203. ldr r0,.L9
  204. ldr pc,[r0]
  205. .LUART0handler:
  206. ldr r0,.L10
  207. ldr pc,[r0]
  208. .L1:
  209. .long NMI_Handler
  210. .L2:
  211. .long HardFault_Handler
  212. .L3:
  213. .long MemManage_Handler
  214. .L4:
  215. .long BusFault_Handler
  216. .L5:
  217. .long UsageFault_Handler
  218. .L6:
  219. .long SWI_Handler
  220. .L7:
  221. .long DebugMonitor_Handler
  222. .L8:
  223. .long PendingSV_Handler
  224. .L9:
  225. .long Systick_Handler
  226. .L10:
  227. .long UART0IntVector
  228. .globl _start
  229. .text
  230. _start:
  231. // Copy initialized data to ram
  232. ldr r1,.L_etext
  233. ldr r2,.L_data
  234. ldr r3,.L_edata
  235. .Lcopyloop:
  236. cmp r2,r3
  237. ittt ls
  238. ldrls r0,[r1],#4
  239. strls r0,[r2],#4
  240. bls .Lcopyloop
  241. // clear onboard ram
  242. ldr r1,.L_bss_start
  243. ldr r2,.L_bss_end
  244. mov r0,#0
  245. .Lzeroloop:
  246. cmp r1,r2
  247. itt ls
  248. strls r0,[r1],#4
  249. bls .Lzeroloop
  250. b PASCALMAIN
  251. b _FPC_haltproc
  252. .L_bss_start:
  253. .long _bss_start
  254. .L_bss_end:
  255. .long _bss_end
  256. .L_etext:
  257. .long _etext
  258. .L_data:
  259. .long _data
  260. .L_edata:
  261. .long _edata
  262. .LDefaultHandlerAddr:
  263. .long .LDefaultHandler
  264. // default irq handler just returns
  265. .LDefaultHandler:
  266. mov pc,r14
  267. end;
  268. end.