lpc21x4.pp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574
  1. {******************************************************************************
  2. lpc2114.h - Register defs for Philips LPC2114, LPC2124
  3. THE SOFTWARE IS DELIVERED "AS IS" WITHOUT WARRANTY OR CONDITION OF ANY KIND,
  4. EITHER EXPRESS, IMPLIED OR STATUTORY. THIS INCLUDES WITHOUT LIMITATION ANY
  5. WARRANTY OR CONDITION WITH RESPECT TO MERCHANTABILITY OR FITNESS FOR ANY
  6. PARTICULAR PURPOSE, OR AGAINST THE INFRINGEMENTS OF INTELLECTUAL PROPERTY RIGHTS
  7. OF OTHERS.
  8. This file may be freely used for commercial and non-commercial applications,
  9. including being redistributed with any tools.
  10. If you find a problem with the file, please report it so that it can be fixed.
  11. Created by Sten Larsson (sten_larsson at yahoo com)
  12. Free Pascal conversion by the Free Pascal development team
  13. ******************************************************************************}
  14. unit lpc21x4;
  15. {$goto on}
  16. interface
  17. {##############################################################################
  18. ## MISC
  19. ##############################################################################}
  20. { Constants for data to put in IRQ/FIQ Exception Vectors }
  21. const
  22. VECTDATA_IRQ = dword($E51FFFF0); { LDR PC,[PC,#-0xFF0] }
  23. // VECTDATA_FIQ { __TODO }
  24. type
  25. TBitvector32 = bitpacked array[0..31] of 0..1;
  26. {##############################################################################
  27. ## VECTORED INTERRUPT CONTROLLER
  28. ##############################################################################}
  29. var
  30. VICIRQStatus : DWord absolute $FFFFF000;
  31. VICFIQStatus : DWord absolute $FFFFF004;
  32. VICRawIntr : DWord absolute $FFFFF008;
  33. VICIntSelect : DWord absolute $FFFFF00C;
  34. VICIntEnable : DWord absolute $FFFFF010;
  35. VICIntEnClear : DWord absolute $FFFFF014;
  36. VICSoftInt : DWord absolute $FFFFF018;
  37. VICSoftIntClear : DWord absolute $FFFFF01C;
  38. VICProtection : DWord absolute $FFFFF020;
  39. VICVectAddr : DWord absolute $FFFFF030;
  40. VICDefVectAddr : DWord absolute $FFFFF034;
  41. VICVectAddr0 : DWord absolute $FFFFF100;
  42. VICVectAddr1 : DWord absolute $FFFFF104;
  43. VICVectAddr2 : DWord absolute $FFFFF108;
  44. VICVectAddr3 : DWord absolute $FFFFF10C;
  45. VICVectAddr4 : DWord absolute $FFFFF110;
  46. VICVectAddr5 : DWord absolute $FFFFF114;
  47. VICVectAddr6 : DWord absolute $FFFFF118;
  48. VICVectAddr7 : DWord absolute $FFFFF11C;
  49. VICVectAddr8 : DWord absolute $FFFFF120;
  50. VICVectAddr9 : DWord absolute $FFFFF124;
  51. VICVectAddr10 : DWord absolute $FFFFF128;
  52. VICVectAddr11 : DWord absolute $FFFFF12C;
  53. VICVectAddr12 : DWord absolute $FFFFF130;
  54. VICVectAddr13 : DWord absolute $FFFFF134;
  55. VICVectAddr14 : DWord absolute $FFFFF138;
  56. VICVectAddr15 : DWord absolute $FFFFF13C;
  57. VICVectCntl0 : DWord absolute $FFFFF200;
  58. VICVectCntl1 : DWord absolute $FFFFF204;
  59. VICVectCntl2 : DWord absolute $FFFFF208;
  60. VICVectCntl3 : DWord absolute $FFFFF20C;
  61. VICVectCntl4 : DWord absolute $FFFFF210;
  62. VICVectCntl5 : DWord absolute $FFFFF214;
  63. VICVectCntl6 : DWord absolute $FFFFF218;
  64. VICVectCntl7 : DWord absolute $FFFFF21C;
  65. VICVectCntl8 : DWord absolute $FFFFF220;
  66. VICVectCntl9 : DWord absolute $FFFFF224;
  67. VICVectCntl10 : DWord absolute $FFFFF228;
  68. VICVectCntl11 : DWord absolute $FFFFF22C;
  69. VICVectCntl12 : DWord absolute $FFFFF230;
  70. VICVectCntl13 : DWord absolute $FFFFF234;
  71. VICVectCntl14 : DWord absolute $FFFFF238;
  72. VICVectCntl15 : DWord absolute $FFFFF23C;
  73. VICITCR : DWord absolute $FFFFF300;
  74. VICITIP1 : DWord absolute $FFFFF304;
  75. VICITIP2 : DWord absolute $FFFFF308;
  76. VICITOP1 : DWord absolute $FFFFF30C;
  77. VICITOP2 : DWord absolute $FFFFF310;
  78. VICPeriphID0 : DWord absolute $FFFFFFE0;
  79. VICPeriphID1 : DWord absolute $FFFFFFE4;
  80. VICPeriphID2 : DWord absolute $FFFFFFE8;
  81. VICPeriphID3 : DWord absolute $FFFFFFEC;
  82. VICIntEnClr : DWord absolute $FFFFF014;
  83. VICSoftIntClr : DWord absolute $FFFFF01C;
  84. {##############################################################################
  85. ## PCB - Pin Connect Block
  86. ##############################################################################}
  87. PCB_PINSEL0 : DWord absolute $E002C000;
  88. PCB_PINSEL1 : DWord absolute $E002C004;
  89. PCB_PINSEL2 : DWord absolute $E002C014;
  90. {##############################################################################
  91. ## GPIO - General Purpose I/O
  92. ##############################################################################}
  93. GPIO0_IOPIN : DWord absolute $E0028000;
  94. GPIO0_IOSET : DWord absolute $E0028004;
  95. GPIO0_IODIR : DWord absolute $E0028008;
  96. GPIO0_IOCLR : DWord absolute $E002800C;
  97. GPIO1_IOPIN : DWord absolute $E0028010;
  98. GPIO1_IOSET : DWord absolute $E0028014;
  99. GPIO1_IODIR : DWord absolute $E0028018;
  100. GPIO1_IOCLR : DWord absolute $E002801C;
  101. {##############################################################################
  102. ## UART0 / UART1
  103. ##############################################################################}
  104. { ---- UART 0 --------------------------------------------- }
  105. UART0_RBR : DWord absolute $E000C000;
  106. UART0_THR : DWord absolute $E000C000;
  107. UART0_IER : DWord absolute $E000C004;
  108. UART0_IIR : DWord absolute $E000C008;
  109. UART0_FCR : DWord absolute $E000C008;
  110. UART0_LCR : DWord absolute $E000C00C;
  111. UART0_LSR : DWord absolute $E000C014;
  112. UART0_SCR : DWord absolute $E000C01C;
  113. UART0_DLL : DWord absolute $E000C000;
  114. UART0_DLM : DWord absolute $E000C004;
  115. { ---- UART 1 --------------------------------------------- }
  116. UART1_RBR : DWord absolute $E0010000;
  117. UART1_THR : DWord absolute $E0010000;
  118. UART1_IER : DWord absolute $E0010004;
  119. UART1_IIR : DWord absolute $E0010008;
  120. UART1_FCR : DWord absolute $E0010008;
  121. UART1_LCR : DWord absolute $E001000C;
  122. UART1_LSR : DWord absolute $E0010014;
  123. UART1_SCR : DWord absolute $E001001C;
  124. UART1_DLL : DWord absolute $E0010000;
  125. UART1_DLM : DWord absolute $E0010004;
  126. UART1_MCR : DWord absolute $E0010010;
  127. UART1_MSR : DWord absolute $E0010018;
  128. {##############################################################################
  129. ## I2C
  130. ##############################################################################}
  131. I2C_I2CONSET : DWord absolute $E001C000;
  132. I2C_I2STAT : DWord absolute $E001C004;
  133. I2C_I2DAT : DWord absolute $E001C008;
  134. I2C_I2ADR : DWord absolute $E001C00C;
  135. I2C_I2SCLH : DWord absolute $E001C010;
  136. I2C_I2SCLL : DWord absolute $E001C014;
  137. I2C_I2CONCLR : DWord absolute $E001C018;
  138. {##############################################################################
  139. ## SPI - Serial Peripheral Interface
  140. ##############################################################################}
  141. SPI_SPCR : DWord absolute $E0020000; { SPI = SPI0 }
  142. SPI_SPSR : DWord absolute $E0020004;
  143. SPI_SPDR : DWord absolute $E0020008;
  144. SPI_SPCCR : DWord absolute $E002000C;
  145. SPI_SPTCR : DWord absolute $E0020010;
  146. SPI_SPTSR : DWord absolute $E0020014;
  147. SPI_SPTOR : DWord absolute $E0020018;
  148. SPI_SPINT : DWord absolute $E002001C;
  149. SPI0_SPCR : DWord absolute $E0020000; { SPI = SPI0 }
  150. SPI0_SPSR : DWord absolute $E0020004;
  151. SPI0_SPDR : DWord absolute $E0020008;
  152. SPI0_SPCCR : DWord absolute $E002000C;
  153. SPI0_SPTCR : DWord absolute $E0020010;
  154. SPI0_SPTSR : DWord absolute $E0020014;
  155. SPI0_SPTOR : DWord absolute $E0020018;
  156. SPI0_SPINT : DWord absolute $E002001C;
  157. SPI1_SPCR : DWord absolute $E0030000;
  158. SPI1_SPSR : DWord absolute $E0030004;
  159. SPI1_SPDR : DWord absolute $E0030008;
  160. SPI1_SPCCR : DWord absolute $E003000C;
  161. SPI1_SPTCR : DWord absolute $E0030010;
  162. SPI1_SPTSR : DWord absolute $E0030014;
  163. SPI1_SPTOR : DWord absolute $E0030018;
  164. SPI1_SPINT : DWord absolute $E003001C;
  165. {##############################################################################
  166. ## Timer 0 and Timer 1
  167. ##############################################################################}
  168. { ---- Timer 0 -------------------------------------------- }
  169. T0_IR : DWord absolute $E0004000;
  170. T0_TCR : DWord absolute $E0004004;
  171. T0_TC : DWord absolute $E0004008;
  172. T0_PR : DWord absolute $E000400C;
  173. T0_PC : DWord absolute $E0004010;
  174. T0_MCR : DWord absolute $E0004014;
  175. T0_MR0 : DWord absolute $E0004018;
  176. T0_MR1 : DWord absolute $E000401C;
  177. T0_MR2 : DWord absolute $E0004020;
  178. T0_MR3 : DWord absolute $E0004024;
  179. T0_CCR : DWord absolute $E0004028;
  180. T0_CR0 : DWord absolute $E000402C;
  181. T0_CR1 : DWord absolute $E0004030;
  182. T0_CR2 : DWord absolute $E0004034;
  183. T0_CR3 : DWord absolute $E0004038;
  184. T0_EMR : DWord absolute $E000403C;
  185. { ---- Timer 1 -------------------------------------------- }
  186. T1_IR : DWord absolute $E0008000;
  187. T1_TCR : DWord absolute $E0008004;
  188. T1_TC : DWord absolute $E0008008;
  189. T1_PR : DWord absolute $E000800C;
  190. T1_PC : DWord absolute $E0008010;
  191. T1_MCR : DWord absolute $E0008014;
  192. T1_MR0 : DWord absolute $E0008018;
  193. T1_MR1 : DWord absolute $E000801C;
  194. T1_MR2 : DWord absolute $E0008020;
  195. T1_MR3 : DWord absolute $E0008024;
  196. T1_CCR : DWord absolute $E0008028;
  197. T1_CR0 : DWord absolute $E000802C;
  198. T1_CR1 : DWord absolute $E0008030;
  199. T1_CR2 : DWord absolute $E0008034;
  200. T1_CR3 : DWord absolute $E0008038;
  201. T1_EMR : DWord absolute $E000803C;
  202. {##############################################################################
  203. ## PWM
  204. ##############################################################################}
  205. PWM_IR : DWord absolute $E0014000;
  206. PWM_TCR : DWord absolute $E0014004;
  207. PWM_TC : DWord absolute $E0014008;
  208. PWM_PR : DWord absolute $E001400C;
  209. PWM_PC : DWord absolute $E0014010;
  210. PWM_MCR : DWord absolute $E0014014;
  211. PWM_MR0 : DWord absolute $E0014018;
  212. PWM_MR1 : DWord absolute $E001401C;
  213. PWM_MR2 : DWord absolute $E0014020;
  214. PWM_MR3 : DWord absolute $E0014024;
  215. PWM_MR4 : DWord absolute $E0014040;
  216. PWM_MR5 : DWord absolute $E0014044;
  217. PWM_MR6 : DWord absolute $E0014048;
  218. PWM_EMR : DWord absolute $E001403C;
  219. PWM_PCR : DWord absolute $E001404C;
  220. PWM_LER : DWord absolute $E0014050;
  221. PWM_CCR : DWord absolute $E0014028;
  222. PWM_CR0 : DWord absolute $E001402C;
  223. PWM_CR1 : DWord absolute $E0014030;
  224. PWM_CR2 : DWord absolute $E0014034;
  225. PWM_CR3 : DWord absolute $E0014038;
  226. {##############################################################################
  227. ## RTC
  228. ##############################################################################}
  229. { ---- RTC: Miscellaneous Register Group ------------------ }
  230. RTC_ILR : DWord absolute $E0024000;
  231. RTC_CTC : DWord absolute $E0024004;
  232. RTC_CCR : DWord absolute $E0024008;
  233. RTC_CIIR : DWord absolute $E002400C;
  234. RTC_AMR : DWord absolute $E0024010;
  235. RTC_CTIME0 : DWord absolute $E0024014;
  236. RTC_CTIME1 : DWord absolute $E0024018;
  237. RTC_CTIME2 : DWord absolute $E002401C;
  238. { ---- RTC: Timer Control Group --------------------------- }
  239. RTC_SEC : DWord absolute $E0024020;
  240. RTC_MIN : DWord absolute $E0024024;
  241. RTC_HOUR : DWord absolute $E0024028;
  242. RTC_DOM : DWord absolute $E002402C;
  243. RTC_DOW : DWord absolute $E0024030;
  244. RTC_DOY : DWord absolute $E0024034;
  245. RTC_MONTH : DWord absolute $E0024038;
  246. RTC_YEAR : DWord absolute $E002403C;
  247. { ---- RTC: Alarm Control Group --------------------------- }
  248. RTC_ALSEC : DWord absolute $E0024060;
  249. RTC_ALMIN : DWord absolute $E0024064;
  250. RTC_ALHOUR : DWord absolute $E0024068;
  251. RTC_ALDOM : DWord absolute $E002406C;
  252. RTC_ALDOW : DWord absolute $E0024070;
  253. RTC_ALDOY : DWord absolute $E0024074;
  254. RTC_ALMON : DWord absolute $E0024078;
  255. RTC_ALYEAR : DWord absolute $E002407C;
  256. { ---- RTC: Reference Clock Divider Group ----------------- }
  257. RTC_PREINT : DWord absolute $E0024080;
  258. RTC_PREFRAC : DWord absolute $E0024084;
  259. {##############################################################################
  260. ## AE - AD Converter
  261. ##############################################################################}
  262. AD_ADCR : DWord absolute $E0034000;
  263. AD_ADDR : DWord absolute $E0034004;
  264. {##############################################################################
  265. ## WD - Watchdog
  266. ##############################################################################}
  267. WD_WDMOD : DWord absolute $E0000000;
  268. WD_WDTC : DWord absolute $E0000004;
  269. WD_WDFEED : DWord absolute $E0000008;
  270. WD_WDTV : DWord absolute $E000000C;
  271. {##############################################################################
  272. ## SCB - System Control Block
  273. ##############################################################################}
  274. SCB_EXTINT : DWord absolute $E01FC140;
  275. SCB_EXTWAKE : DWord absolute $E01FC144;
  276. SCB_EXTMODE : DWord absolute $E01FC148;
  277. SCB_EXTPOLAR : DWord absolute $E01FC14C;
  278. SCB_MEMMAP : DWord absolute $E01FC040;
  279. SCB_PLLCON : DWord absolute $E01FC080;
  280. SCB_PLLCFG : DWord absolute $E01FC084;
  281. SCB_PLLSTAT : DWord absolute $E01FC088;
  282. SCB_PLLFEED : DWord absolute $E01FC08C;
  283. SCB_PCON : DWord absolute $E01FC0C0;
  284. SCB_PCONP : DWord absolute $E01FC0C4;
  285. SCB_VPBDIV : DWord absolute $E01FC100;
  286. {##############################################################################
  287. ## MAM - Memory Accelerator Module
  288. ##############################################################################}
  289. MAM_MAMCR : DWord absolute $E01FC000;
  290. MAM_MAMTIM : DWord absolute $E01FC004;
  291. MAM_MAMMAP : DWord absolute $E01FC040;
  292. var
  293. Undefined_Handler,
  294. SWI_Handler,
  295. Prefetch_Handler,
  296. Abort_Handler,
  297. IRQ_Handler,
  298. FIQ_Handler : pointer;
  299. type
  300. tm = 1..32;
  301. tp = 1..8;
  302. procedure InitPLL(m : tm;p : tp);
  303. procedure PLLFeed;
  304. function GetProcessorClock(CrystalFrequency : DWord) : DWord;
  305. implementation
  306. procedure PLLFeed;
  307. begin
  308. SCB_PLLFEED:=$aa;
  309. SCB_PLLFEED:=$55;
  310. end;
  311. function GetProcessorClock(CrystalFrequency : DWord) : DWord;
  312. begin
  313. if (TBitvector32(SCB_PLLSTAT)[8] and 1)<>0 then
  314. GetProcessorClock:=((SCB_PLLSTAT and $f)+1)*CrystalFrequency
  315. else
  316. GetProcessorClock:=CrystalFrequency;
  317. end;
  318. procedure InitPLL(m : tm;p : tp);
  319. begin
  320. case p of
  321. 1: p:=0;
  322. 2..3: p:=1;
  323. 4..7: p:=2;
  324. 8: p:=3;
  325. end;
  326. { set p and m }
  327. SCB_PLLCFG:=(m-1) or (p shl 5);
  328. { write changes }
  329. PLLFeed;
  330. { start PLL }
  331. TBitvector32(SCB_PLLCON)[0]:=1;
  332. { write changes }
  333. PLLFeed;
  334. { wait for pll sync }
  335. while TBitvector32(SCB_PLLSTAT)[10]=0 do
  336. ;
  337. { connect PLL }
  338. TBitvector32(SCB_PLLCON)[1]:=1;
  339. { write changes }
  340. PLLFeed;
  341. end;
  342. procedure PASCALMAIN; external name 'PASCALMAIN';
  343. procedure _FPC_haltproc; assembler; nostackframe; public name '_haltproc';
  344. asm
  345. .Lhalt:
  346. b .Lhalt
  347. end;
  348. var
  349. _data: record end; external name '_data';
  350. _edata: record end; external name '_edata';
  351. _etext: record end; external name '_etext';
  352. _bss_start: record end; external name '_bss_start';
  353. _bss_end: record end; external name '_bss_end';
  354. _stack_top: record end; external name '_stack_top';
  355. procedure _FPC_start; assembler; nostackframe;
  356. label
  357. _start;
  358. asm
  359. // code derived from phillips appnote 10254
  360. .init
  361. .align 16
  362. .globl _start
  363. b _start
  364. b .LUndefined_Addr // Undefined Instruction vector
  365. b .LSWI_Addr // Software Interrupt vector
  366. b .LPrefetch_Addr // Prefetch abort vector
  367. b .LAbort_Addr // Data abort vector
  368. nop // reserved
  369. b .LIRQ_Addr // Interrupt Request (IRQ) vector
  370. b .LFIQ_Addr // Fast interrupt request (FIQ) vector
  371. .LUndefined_Addr:
  372. ldr r0,.L1
  373. ldr pc,[r0]
  374. .LSWI_Addr:
  375. ldr r0,.L2
  376. ldr pc,[r0]
  377. .LPrefetch_Addr:
  378. ldr r0,.L3
  379. ldr pc,[r0]
  380. .LAbort_Addr:
  381. ldr r0,.L4
  382. ldr pc,[r0]
  383. .LIRQ_Addr:
  384. ldr r0,.L5
  385. ldr pc,[r0]
  386. .LFIQ_Addr:
  387. ldr r0,.L5
  388. ldr pc,[r0]
  389. .L1:
  390. .long Undefined_Handler
  391. .L2:
  392. .long SWI_Handler
  393. .L3:
  394. .long Prefetch_Handler
  395. .L4:
  396. .long Abort_Handler
  397. .L5:
  398. .long IRQ_Handler
  399. .L6:
  400. .long FIQ_Handler
  401. _start:
  402. (*
  403. Set absolute stack top
  404. stack is already set by bootloader
  405. but if this point is entered by any
  406. other means than reset, the stack pointer
  407. needs to be set explicity
  408. *)
  409. ldr r0,.L_stack_top
  410. (*
  411. Setting up SP for IRQ and FIQ mode.
  412. Change mode before setting each one
  413. move back again to Supervisor mode
  414. Each interrupt has its own link
  415. register, stack pointer and program
  416. counter The stack pointers must be
  417. initialized for interrupts to be
  418. used later.
  419. *)
  420. (*
  421. setup irq and fiq stacks each 128 bytes
  422. *)
  423. msr cpsr_c, #0x12 // switch to irq mode
  424. mov sp, r0 // set irq stack pointer
  425. sub r0,r0,#128 // irq stack size
  426. msr cpsr_c, #0x11 // fiq mode
  427. mov sp, r0 // set fiq stack pointer
  428. sub r0,r0,#128 // fiq stack size
  429. msr cpsr_c, #0x13 // supervisor mode F,I enabled
  430. mov sp, r0 // stack
  431. ldr r1,.LDefaultHandlerAddr
  432. ldr r0,.L1
  433. str r1,[r0]
  434. ldr r0,.L2
  435. str r1,[r0]
  436. ldr r0,.L3
  437. str r1,[r0]
  438. ldr r0,.L4
  439. str r1,[r0]
  440. ldr r0,.L5
  441. str r1,[r0]
  442. ldr r0,.L6
  443. str r1,[r0]
  444. // copy initialized data from flash to ram
  445. ldr r1,.L_etext
  446. ldr r2,.L_data
  447. ldr r3,.L_edata
  448. .Lcopyloop:
  449. cmp r2,r3
  450. ldrls r0,[r1],#4
  451. strls r0,[r2],#4
  452. bls .Lcopyloop
  453. // clear onboard ram
  454. ldr r1,.L_bss_start
  455. ldr r2,.L_bss_end
  456. mov r0,#0
  457. .Lzeroloop:
  458. cmp r1,r2
  459. strls r0,[r1],#4
  460. bls .Lzeroloop
  461. bl PASCALMAIN
  462. bl _FPC_haltproc
  463. .L_bss_start:
  464. .long _bss_start
  465. .L_bss_end:
  466. .long _bss_end
  467. .L_etext:
  468. .long _etext
  469. .L_data:
  470. .long _data
  471. .L_edata:
  472. .long _edata
  473. .L_stack_top:
  474. .long _stack_top
  475. .LDefaultHandlerAddr:
  476. .long .LDefaultHandler
  477. // default irq handler just returns
  478. .LDefaultHandler:
  479. mov pc,r14
  480. .text
  481. end;
  482. end.