stm32f103.pp 11 KB

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