stm32f103.pp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683
  1. {
  2. Register definitions and utility code for STM32F103
  3. Preliminary startup code - TODO: interrupt handler variables
  4. Created by Jeppe Johansen 2009 - [email protected]
  5. }
  6. unit stm32f103;
  7. {$goto on}
  8. {$define stm32f103}
  9. interface
  10. type
  11. TBitvector32 = bitpacked array[0..31] of 0..1;
  12. {$PACKRECORDS 2}
  13. const
  14. PeripheralBase = $40000000;
  15. FSMCBase = $60000000;
  16. APB1Base = PeripheralBase;
  17. APB2Base = PeripheralBase+$10000;
  18. AHBBase = PeripheralBase+$20000;
  19. SCS_BASE = $E000E000;
  20. { FSMC }
  21. FSMCBank1NOR1 = FSMCBase+$00000000;
  22. FSMCBank1NOR2 = FSMCBase+$04000000;
  23. FSMCBank1NOR3 = FSMCBase+$08000000;
  24. FSMCBank1NOR4 = FSMCBase+$0C000000;
  25. FSMCBank1PSRAM1 = FSMCBase+$00000000;
  26. FSMCBank1PSRAM2 = FSMCBase+$04000000;
  27. FSMCBank1PSRAM3 = FSMCBase+$08000000;
  28. FSMCBank1PSRAM4 = FSMCBase+$0C000000;
  29. FSMCBank2NAND1 = FSMCBase+$10000000;
  30. FSMCBank3NAND2 = FSMCBase+$20000000;
  31. FSMCBank4PCCARD = FSMCBase+$30000000;
  32. type
  33. TTimerRegisters = record
  34. CR1, res1,
  35. CR2, res2,
  36. SMCR, res3,
  37. DIER, res4,
  38. SR, res5,
  39. EGR, res,
  40. CCMR1, res6,
  41. CCMR2, res7,
  42. CCER, res8,
  43. CNT, res9,
  44. PSC, res10,
  45. ARR, res11,
  46. RCR, res12,
  47. CCR1, res13,
  48. CCR2, res14,
  49. CCR3, res15,
  50. CCR4, res16,
  51. BDTR, res17,
  52. DCR, res18,
  53. DMAR, res19: Word;
  54. end;
  55. TRTCRegisters = record
  56. CRH, res1,
  57. CRL, res2,
  58. PRLH, res3,
  59. PRLL, res4,
  60. DIVH, res5,
  61. DIVL, res6,
  62. CNTH, res7,
  63. CNTL, res8,
  64. ALRH, res9,
  65. ALRL, res10: Word;
  66. end;
  67. TIWDGRegisters = record
  68. KR, res1,
  69. PR, res2,
  70. RLR, res3,
  71. SR, res4: word;
  72. end;
  73. TWWDGRegisters = record
  74. CR, res2,
  75. CFR, res3,
  76. SR, res4: word;
  77. end;
  78. TSPIRegisters = record
  79. CR1, res1,
  80. CR2, res2,
  81. SR, res3,
  82. DR, res4,
  83. CRCPR, res5,
  84. RXCRCR, res6,
  85. TXCRCR, res7,
  86. I2SCFGR, res8,
  87. I2SPR, res9: Word;
  88. end;
  89. TUSARTRegisters = record
  90. SR, res1,
  91. DR, res2,
  92. BRR, res3,
  93. CR1, res4,
  94. CR2, res5,
  95. CR3, res6,
  96. GTPR, res7: Word;
  97. end;
  98. TI2CRegisters = record
  99. CR1, res1,
  100. CR2, res2,
  101. OAR1, res3,
  102. OAR2, res4,
  103. DR, res5,
  104. SR1, res6,
  105. SR2, res7,
  106. CCR, res8: word;
  107. TRISE: byte;
  108. end;
  109. TUSBRegisters = record
  110. EPR: array[0..7] of DWord;
  111. res: array[0..7] of dword;
  112. CNTR, res1,
  113. ISTR, res2,
  114. FNR, res3: Word;
  115. DADDR: byte; res4: word; res5: byte;
  116. BTABLE: Word;
  117. end;
  118. TUSBMem = packed array[0..511] of byte;
  119. TCANMailbox = record
  120. IR,
  121. DTR,
  122. DLR,
  123. DHR: DWord;
  124. end;
  125. TCANRegisters = record
  126. MCR,
  127. MSR,
  128. TSR,
  129. RF0R,
  130. RF1R,
  131. IER,
  132. ESR,
  133. BTR: DWord;
  134. res5: array[$020..$17F] of byte;
  135. TX: array[0..2] of TCANMailbox;
  136. RX: array[0..2] of TCANMailbox;
  137. res6: array[$1D0..$1FF] of byte;
  138. FMR,
  139. FM1R,
  140. res9: DWord;
  141. FS1R, res10: word;
  142. res11: DWord;
  143. FFA1R, res12: word;
  144. res13: DWord;
  145. FA1R, res14: word;
  146. res15: array[$220..$23F] of byte;
  147. FOR1,
  148. FOR2: DWord;
  149. FB: array[1..13] of array[1..2] of DWord;
  150. end;
  151. TBKPRegisters = record
  152. DR: array[1..10] of record data, res: word; end;
  153. RTCCR,
  154. CR,
  155. CSR,
  156. res1,res2: DWord;
  157. DR2: array[11..42] of record data, res: word; end;
  158. end;
  159. TPwrRegisters = record
  160. CR, res: word;
  161. CSR: Word;
  162. end;
  163. TDACRegisters = record
  164. CR,
  165. SWTRIGR: DWord;
  166. DHR12R1, res2,
  167. DHR12L1, res3,
  168. DHR8R1, res4,
  169. DHR12R2, res5,
  170. DHR12L2, res6,
  171. DHR8R2, res7: word;
  172. DHR12RD,
  173. DHR12LD: DWord;
  174. DHR8RD, res8,
  175. DOR1, res9,
  176. DOR2, res10: Word;
  177. end;
  178. TAFIORegisters = record
  179. EVCR,
  180. MAPR: DWord;
  181. EXTICR: array[0..3] of DWord;
  182. end;
  183. TEXTIRegisters = record
  184. IMR,
  185. EMR,
  186. RTSR,
  187. FTSR,
  188. SWIER,
  189. PR: DWord;
  190. end;
  191. TPortRegisters = record
  192. CRL,
  193. CRH,
  194. IDR,
  195. ODR,
  196. BSRR,
  197. BRR,
  198. LCKR: DWord;
  199. end;
  200. TADCRegisters = record
  201. SR,
  202. CR1,
  203. CR2,
  204. SMPR1,
  205. SMPR2: DWord;
  206. JOFR1, res2,
  207. JOFR2, res3,
  208. JOFR3, res4,
  209. JOFR4, res5,
  210. HTR, res6,
  211. LTR, res7: word;
  212. SQR1,
  213. SQR2,
  214. SQR3,
  215. JSQR: DWord;
  216. JDR1, res8,
  217. JDR2, res9,
  218. JDR3, res10,
  219. JDR4, res11: Word;
  220. DR: DWord;
  221. end;
  222. TSDIORegisters = record
  223. POWER,
  224. CLKCR,
  225. ARG: DWord;
  226. CMD, res3,
  227. RESPCMD, res4: Word;
  228. RESP1,
  229. RESP2,
  230. RESP3,
  231. RESP4,
  232. DTIMER,
  233. DLEN: DWord;
  234. DCTRL, res5: word;
  235. DCOUNT,
  236. STA,
  237. ICR,
  238. MASK,
  239. FIFOCNT,
  240. FIFO: DWord;
  241. end;
  242. TDMAChannel = record
  243. CCR, res1,
  244. CNDTR, res2: word;
  245. CPAR,
  246. CMAR,
  247. res: DWord;
  248. end;
  249. TDMARegisters = record
  250. ISR,
  251. IFCR: DWord;
  252. Channel: array[0..7] of TDMAChannel;
  253. end;
  254. TRCCRegisters = record
  255. CR,
  256. CFGR,
  257. CIR,
  258. APB2RSTR,
  259. APB1RSTR,
  260. AHBENR,
  261. APB2ENR,
  262. APB1ENR,
  263. BDCR,
  264. CSR: DWord;
  265. end;
  266. TCRCRegisters = record
  267. DR: DWord;
  268. IDR: byte; res1: word; res2: byte;
  269. CR: byte;
  270. end;
  271. TFSMCRegisters = record
  272. nothingyet: byte;
  273. end;
  274. TFlashRegisters = record
  275. ACR,
  276. KEYR,
  277. OPTKEYR,
  278. SR,
  279. CR,
  280. AR,
  281. res,
  282. OBR,
  283. WRPR: DWord;
  284. end;
  285. TNVICRegisters = packed record
  286. ISER: array[0..7] of longword;
  287. reserved0: array[0..23] of longword;
  288. ICER: array[0..7] of longword;
  289. reserved1: array[0..23] of longword;
  290. ISPR: array[0..7] of longword;
  291. reserved2: array[0..23] of longword;
  292. ICPR: array[0..7] of longword;
  293. reserved3: array[0..23] of longword;
  294. IABR: array[0..7] of longword;
  295. reserved4: array[0..55] of longword;
  296. IP: array[0..239] of longword;
  297. reserved5: array[0..643] of longword;
  298. STIR: longword;
  299. end;
  300. TSCBRegisters = packed record
  301. CPUID, {!< CPU ID Base Register }
  302. ICSR, {!< Interrupt Control State Register }
  303. VTOR, {!< Vector Table Offset Register }
  304. AIRCR, {!< Application Interrupt / Reset Control Register }
  305. SCR, {!< System Control Register }
  306. CCR: longword; {!< Configuration Control Register }
  307. SHP: array[0..11] of byte; {!< System Handlers Priority Registers (4-7, 8-11, 12-15) }
  308. SHCSR, {!< System Handler Control and State Register }
  309. CFSR, {!< Configurable Fault Status Register }
  310. HFSR, {!< Hard Fault Status Register }
  311. DFSR, {!< Debug Fault Status Register }
  312. MMFAR, {!< Mem Manage Address Register }
  313. BFAR, {!< Bus Fault Address Register }
  314. AFSR: longword; {!< Auxiliary Fault Status Register }
  315. PFR: array[0..1] of longword; {!< Processor Feature Register }
  316. DFR, {!< Debug Feature Register }
  317. ADR: longword; {!< Auxiliary Feature Register }
  318. MMFR: array[0..3] of longword; {!< Memory Model Feature Register }
  319. ISAR: array[0..4] of longword; {!< ISA Feature Register }
  320. end;
  321. TSysTickRegisters = packed record
  322. Ctrl,
  323. Load,
  324. Val,
  325. Calib: longword;
  326. end;
  327. {$ALIGN 2}
  328. var
  329. { Timers }
  330. Timer1: TTimerRegisters absolute (APB2Base+$2C00);
  331. Timer2: TTimerRegisters absolute (APB1Base+$0000);
  332. Timer3: TTimerRegisters absolute (APB1Base+$0400);
  333. Timer4: TTimerRegisters absolute (APB1Base+$0800);
  334. Timer5: TTimerRegisters absolute (APB1Base+$0C00);
  335. Timer6: TTimerRegisters absolute (APB1Base+$1000);
  336. Timer7: TTimerRegisters absolute (APB1Base+$1400);
  337. Timer8: TTimerRegisters absolute (APB2Base+$3400);
  338. { RTC }
  339. RTC: TRTCRegisters absolute (APB1Base+$2800);
  340. { WDG }
  341. WWDG: TWWDGRegisters absolute (APB1Base+$2C00);
  342. IWDG: TIWDGRegisters absolute (APB1Base+$3000);
  343. { SPI }
  344. SPI1: TSPIRegisters absolute (APB2Base+$3000);
  345. SPI2: TSPIRegisters absolute (APB1Base+$3800);
  346. SPI3: TSPIRegisters absolute (APB1Base+$3C00);
  347. { USART/UART }
  348. USART1: TUSARTRegisters absolute (APB2Base+$3800);
  349. USART2: TUSARTRegisters absolute (APB1Base+$4400);
  350. USART3: TUSARTRegisters absolute (APB1Base+$4800);
  351. UART4: TUSARTRegisters absolute (APB1Base+$4C00);
  352. UART5: TUSARTRegisters absolute (APB1Base+$5000);
  353. { I2C }
  354. I2C1: TI2CRegisters absolute (APB1Base+$5400);
  355. I2C2: TI2CRegisters absolute (APB1Base+$5800);
  356. { USB }
  357. USB: TUSBRegisters absolute (APB1Base+$5C00);
  358. USBMem: TUSBMem absolute (APB1Base+$5C00);
  359. { CAN }
  360. CAN: TCANRegisters absolute (APB1Base+$6800);
  361. { BKP }
  362. BKP: TBKPRegisters absolute (APB1Base+$6C00);
  363. { PWR }
  364. PWR: TPwrRegisters absolute (APB1Base+$7000);
  365. { DAC }
  366. DAC: TDACRegisters absolute (APB1Base+$7400);
  367. { GPIO }
  368. AFIO: TAFIORegisters absolute (APB2Base+$0);
  369. EXTI: TEXTIRegisters absolute (APB2Base+$0400);
  370. PortA: TPortRegisters absolute (APB2Base+$0800);
  371. PortB: TPortRegisters absolute (APB2Base+$0C00);
  372. PortC: TPortRegisters absolute (APB2Base+$1000);
  373. PortD: TPortRegisters absolute (APB2Base+$1400);
  374. PortE: TPortRegisters absolute (APB2Base+$1800);
  375. PortF: TPortRegisters absolute (APB2Base+$1C00);
  376. PortG: TPortRegisters absolute (APB2Base+$2000);
  377. { ADC }
  378. ADC1: TADCRegisters absolute (APB2Base+$2400);
  379. ADC2: TADCRegisters absolute (APB2Base+$2800);
  380. ADC3: TADCRegisters absolute (APB2Base+$3C00);
  381. { SDIO }
  382. SDIO: TSDIORegisters absolute (APB2Base+$8000);
  383. { DMA }
  384. DMA1: TDMARegisters absolute (AHBBase+$0000);
  385. DMA2: TDMARegisters absolute (AHBBase+$0400);
  386. { RCC }
  387. RCC: TRCCRegisters absolute (AHBBase+$1000);
  388. { Flash }
  389. Flash: TFlashRegisters absolute (AHBBase+$2000);
  390. { CRC }
  391. CRC: TCRCRegisters absolute (AHBBase+$3000);
  392. { SCB }
  393. SCB: TSCBRegisters absolute (SCS_BASE+$0D00);
  394. { SysTick }
  395. SysTick: TSysTickRegisters absolute (SCS_BASE+$0010);
  396. { NVIC }
  397. NVIC: TNVICRegisters absolute (SCS_BASE+$0100);
  398. var
  399. NMI_Handler,
  400. HardFault_Handler,
  401. MemManage_Handler,
  402. BusFault_Handler,
  403. UsageFault_Handler,
  404. SWI_Handler,
  405. DebugMonitor_Handler,
  406. PendingSV_Handler,
  407. Systick_Handler: pointer;
  408. implementation
  409. var
  410. _data: record end; external name '_data';
  411. _edata: record end; external name '_edata';
  412. _etext: record end; external name '_etext';
  413. _bss_start: record end; external name '_bss_start';
  414. _bss_end: record end; external name '_bss_end';
  415. _stack_top: record end; external name '_stack_top';
  416. procedure PASCALMAIN; external name 'PASCALMAIN';
  417. procedure _FPC_haltproc; assembler; nostackframe; public name '_haltproc';
  418. asm
  419. .Lhalt:
  420. b .Lhalt
  421. end;
  422. procedure _FPC_start; assembler; nostackframe;
  423. label _start;
  424. asm
  425. .init
  426. .balign 16
  427. .long _stack_top // First entry in NVIC table is the new stack pointer
  428. .long _start+1
  429. //b _start // Reset
  430. .long _start+1
  431. //b .LNMI_Addr // Non maskable interrupt. The RCC Clock Security System (CSS) is linked to the NMI vector.
  432. .long _start+1
  433. //b .LHardFault_Addr // All class of fault
  434. .long _start+1
  435. //b .LMemManage_Addr // Memory management
  436. .long _start+1
  437. //b .LBusFault_Addr // Pre-fetch fault, memory access fault
  438. .long _start+1
  439. //b .LUsageFault_Addr // Undefined instruction or illegal state
  440. .long _start+1
  441. //nop // Reserved
  442. .long _start+1
  443. //nop // Reserved
  444. .long _start+1
  445. //nop // Reserved
  446. .long _start+1
  447. //nop // Reserved
  448. .long _start+1
  449. //b .LSWI_Addr // Software Interrupt vector
  450. .long _start+1
  451. //b .LDebugMonitor_Addr // Debug Monitor
  452. .long _start+1
  453. //nop // Reserved
  454. .long _start+1
  455. //b .LPendingSV_Addr // Pendable request for system service
  456. .long _start+1
  457. //b .LSystick_Addr // System tick timer
  458. //17
  459. .long .LDefaultHandler+1
  460. .long .LDefaultHandler+1
  461. .long .LDefaultHandler+1
  462. //20
  463. .long .LDefaultHandler+1
  464. .long .LDefaultHandler+1
  465. .long .LDefaultHandler+1
  466. .long .LDefaultHandler+1
  467. .long .LDefaultHandler+1
  468. .long .LDefaultHandler+1
  469. .long .LDefaultHandler+1
  470. .long .LDefaultHandler+1
  471. .long .LDefaultHandler+1
  472. .long .LDefaultHandler+1
  473. .long .LDefaultHandler+1
  474. .long .LDefaultHandler+1
  475. .long .LDefaultHandler+1
  476. .long .LDefaultHandler+1
  477. .long .LDefaultHandler+1
  478. .long .LDefaultHandler+1
  479. .long .LDefaultHandler+1
  480. .long .LDefaultHandler+1
  481. .long .LDefaultHandler+1
  482. .long .LDefaultHandler+1
  483. .long .LDefaultHandler+1
  484. .long .LDefaultHandler+1
  485. .long .LDefaultHandler+1
  486. .long .LDefaultHandler+1
  487. .long .LDefaultHandler+1
  488. .long .LDefaultHandler+1
  489. .long .LDefaultHandler+1
  490. .long .LDefaultHandler+1
  491. .long .LDefaultHandler+1
  492. .long .LDefaultHandler+1
  493. .long .LDefaultHandler+1
  494. .long .LDefaultHandler+1
  495. .long .LDefaultHandler+1
  496. .long .LDefaultHandler+1
  497. .long .LDefaultHandler+1
  498. .long .LDefaultHandler+1
  499. .long .LDefaultHandler+1
  500. .long .LDefaultHandler+1
  501. .long .LDefaultHandler+1
  502. .long .LDefaultHandler+1
  503. .LNMI_Addr:
  504. ldr r0,.L1
  505. ldr pc,[r0]
  506. .LHardFault_Addr:
  507. ldr r0,.L2
  508. ldr pc,[r0]
  509. .LMemManage_Addr:
  510. ldr r0,.L3
  511. ldr pc,[r0]
  512. .LBusFault_Addr:
  513. ldr r0,.L4
  514. ldr pc,[r0]
  515. .LUsageFault_Addr:
  516. ldr r0,.L5
  517. ldr pc,[r0]
  518. .LSWI_Addr:
  519. ldr r0,.L6
  520. ldr pc,[r0]
  521. .LDebugMonitor_Addr:
  522. ldr r0,.L7
  523. ldr pc,[r0]
  524. .LPendingSV_Addr:
  525. ldr r0,.L8
  526. ldr pc,[r0]
  527. .LSystick_Addr:
  528. ldr r0,.L9
  529. ldr pc,[r0]
  530. .L1:
  531. .long NMI_Handler
  532. .L2:
  533. .long HardFault_Handler
  534. .L3:
  535. .long MemManage_Handler
  536. .L4:
  537. .long BusFault_Handler
  538. .L5:
  539. .long UsageFault_Handler
  540. .L6:
  541. .long SWI_Handler
  542. .L7:
  543. .long DebugMonitor_Handler
  544. .L8:
  545. .long PendingSV_Handler
  546. .L9:
  547. .long Systick_Handler
  548. .globl _start
  549. .text
  550. _start:
  551. // Copy initialized data to ram
  552. ldr r1,.L_etext
  553. ldr r2,.L_data
  554. ldr r3,.L_edata
  555. .Lcopyloop:
  556. cmp r2,r3
  557. ittt ls
  558. ldrls r0,[r1],#4
  559. strls r0,[r2],#4
  560. bls .Lcopyloop
  561. // clear onboard ram
  562. ldr r1,.L_bss_start
  563. ldr r2,.L_bss_end
  564. mov r0,#0
  565. .Lzeroloop:
  566. cmp r1,r2
  567. itt ls
  568. strls r0,[r1],#4
  569. bls .Lzeroloop
  570. b PASCALMAIN
  571. b _FPC_haltproc
  572. .L_bss_start:
  573. .long _bss_start
  574. .L_bss_end:
  575. .long _bss_end
  576. .L_etext:
  577. .long _etext
  578. .L_data:
  579. .long _data
  580. .L_edata:
  581. .long _edata
  582. .LDefaultHandlerAddr:
  583. .long .LDefaultHandler
  584. // default irq handler just returns
  585. .LDefaultHandler:
  586. mov pc,r14
  587. end;
  588. end.