lm3tempest.pp 7.8 KB

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