Advertisement
Guest User

lab_2_pingpong

a guest
May 18th, 2018
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ARM 19.14 KB | None | 0 0
  1. ;*******************************
  2. ;*
  3. ;* Malldokument för Lab2 i Datorteknik Y på Darma
  4. ;*
  5. ;* KPa 180212
  6. ;*
  7. ;*
  8. ;* Lab 2: Använd två portar för avbrott: Port F pin 4 och Port D pin 7
  9. ;*
  10. ;*        Port B pin 0-7 definierat som utgÃ¥ngar
  11. ;*        Port D pin 7 definierat som ingÃ¥ng, pin 7 avbrott pÃ¥ stigande flank
  12. ;*        Port E pin 0-5 definierat som utgÃ¥ngar
  13. ;*        Port F pin 0-3 definierat som utgÃ¥ngar
  14. ;*        Port F pin 4 definierat som ingÃ¥ng med pull-up, pin 4 avbrott pÃ¥ stigande flank
  15. ;*
  16. ;* Fördefinierade subrutiner
  17. ;*
  18. ;*  inituart:   Initiera uart0 till 115200 baud, 8N1.
  19. ;*  initGPIOB:  Initiera port B
  20. ;*  initGPIOD:  Initiera port D
  21. ;*  initGPIOE:  Initiera port E
  22. ;*  initGPIOF:  Initiera port F
  23. ;*  initint:    Initiera NVIC för GPIOF prio 5, GPIOD prio 2
  24. ;*  SKBAK:      Skriv ut "Bakgrundsprogram"
  25. ;*  SKAVH:      Skriv ut "     Avbrott höger"
  26. ;*  SKAVV:      Skriv ut "  Avbrott vänster"
  27. ;*  DELAY:      Fördröjning, r1=antal ms att vänta
  28. ;*
  29.  
  30.     .thumb      ; Kod ska vara för Thumb mode
  31.     .text       ; Programkod ska placeras i programminnet
  32.     .align 2    ; Börja pÃ¥ en jämn adress
  33.  
  34.     .global main    ; main finns definierad här
  35.     .global intgpiod    ; intgpiod är definierad här
  36.     .global intgpiof    ; intgpiof är definierad här
  37.  
  38.     .align 0x100    ; Starta main pÃ¥ en adress som slutar med tvÃ¥ nollor.
  39.  
  40. ;*************************************************************************
  41. ;*
  42. ;* Placera din ditt huvudprogram (main) här
  43. ;*
  44. main:
  45.     bl  inituart
  46.     bl  initGPIOB
  47.     bl  initGPIOD
  48.     bl  initGPIOF
  49.     bl  initint
  50.     bl  clear_score
  51.     bl  init_ball
  52.     bl  init_serve
  53.  
  54. game_loop:
  55.     ; game_loop, checks if someone is serving, else moves the ball
  56.     ldr r0,SERVE
  57.     ldr r1,[r0]
  58.     cmp r1,#0xFF
  59.     beq game_loop
  60.  
  61.     bl  check_ball_dir
  62.     b   game_loop
  63.  
  64. move_ball:
  65.     mov r1, #100
  66.     bl  DELAY
  67.  
  68.     ; check if 'ball' is outside the diodes
  69.     ; if it is, score to correct player
  70.     cmp r0,#0
  71.     beq add_points_l
  72.     cmp r0, #256
  73.     beq add_points_r
  74.  
  75.     bl  game_loop
  76.  
  77. check_ball_dir:
  78.     ; checks the direction of ball
  79.     ldr r2,MOVE_DIR
  80.     ldr r12,[r2]
  81.     cmp r12,#0x00
  82.     ; goes into move_ball_left if direction is 0x00 else move_ball_right
  83.     beq move_ball_left
  84.     b move_ball_right
  85.  
  86. move_ball_left:
  87.     ; shift the GPOIB data one bit to the left
  88.     ldr r3,GPIOB_GPIODATA
  89.     ldr r0,[r3]
  90.     lsl r0, #1
  91.     str r0,[r3]
  92.     bl move_ball
  93.  
  94. move_ball_right:
  95.     ; shift the GPIOB data one bit to the right
  96.     ldr r3,GPIOB_GPIODATA
  97.     ldr r0,[r3]
  98.     lsr r0, #1
  99.     str r0,[r3]
  100.     b move_ball
  101.  
  102. add_points_l:
  103.     push {lr}
  104.     ; incrementing points to left player by 1
  105.     ldr r0,POINTS_L
  106.     ldr r1,[r0]
  107.     ADD r1,#1
  108.     str r1,[r0]
  109.  
  110.     ; set serving for player R
  111.     ldr r0,SERVE_L
  112.     mov r1,#0xFF
  113.     str r1,[r0]
  114.     ; set direction to L
  115.     ldr r0,MOVE_DIR
  116.     mov r1,#0x00
  117.     str r1,[r0]
  118.  
  119.     ; set general serve to 0xFF
  120.     ldr r0,SERVE
  121.     ldr r1,[r0]
  122.     mov r1,#0xFF
  123.     str r1,[r0]
  124.  
  125.     ; disable serving for player L
  126.     ldr r0,SERVE_R
  127.     mov r1,#0x00
  128.     str r1,[r0]
  129.  
  130.     ; make left diode to shine red
  131.     ldr r3,GPIOB_GPIODATA
  132.     mov r1, #0x80
  133.     str r1, [r3]
  134.  
  135.     pop {lr}
  136.     bx lr
  137.  
  138. add_points_r:
  139.     push {lr}
  140.     ; incrementing points to right player by 1
  141.     ldr r0,POINTS_R
  142.     ldr r1,[r0]
  143.     ADD r1,#1
  144.     str r1,[r0]
  145.  
  146.     ; set serving for player R
  147.     ldr r0,SERVE_R
  148.     mov r1,#0xFF
  149.     str r1,[r0]
  150.     ; set direction to R
  151.     ldr r0,MOVE_DIR
  152.     mov r1,#0xFF
  153.     str r1,[r0]
  154.  
  155.     ; set general serve to 0xFF
  156.     ldr r0,SERVE
  157.     ldr r1,[r0]
  158.     mov r1,#0xFF
  159.     str r1,[r0]
  160.  
  161.     ; make right diode to shine red
  162.     ldr r3,GPIOB_GPIODATA
  163.     mov r1, #0x01
  164.     str r1, [r3]
  165.  
  166.     ; disable serving for player L
  167.     ldr r0,SERVE_L
  168.     mov r1,#0x00
  169.     str r1,[r0]
  170.  
  171.     pop {lr}
  172.     bx lr
  173.  
  174. ; clears the score of two players, used in initializing
  175. clear_score:
  176.     ; clear score of player L
  177.     ldr r0,POINTS_L
  178.     ldr r1,[r0]
  179.     mov r1,#0x00
  180.     str r1,[r0]
  181.  
  182.     ; clear score of player L
  183.     ldr r0,POINTS_R
  184.     ldr r1,[r0]
  185.     mov r1,#0x00
  186.     str r1,[r0]
  187.     bx lr
  188.  
  189. change_dir_to_left:
  190.     ; changes the direction field of ball to 0x00
  191.     push {lr,r0,r1}
  192.     ldr r0,MOVE_DIR
  193.     ldr r1,[r0]
  194.     mov r1,#0x00
  195.     str r1,[r0]
  196.     pop {lr,r0,r1}
  197.     bx lr
  198.  
  199. change_dir_to_right:
  200.     ; changes the direction field of ball to 0xFF
  201.     push {lr,r0,r1}
  202.     ldr r0,MOVE_DIR
  203.     ldr r1,[r0]
  204.     mov r1,#0xFF
  205.     str r1,[r0]
  206.     pop {lr,r0,r1}
  207.     bx lr
  208.  
  209.  
  210. init_ball:
  211.     ; initializes the ball, sets it to left diode
  212.     ldr r3,GPIOB_GPIODATA
  213.     mov r1, #0x128
  214.     str r1, [r3]
  215.     bx lr
  216.  
  217. init_serve:
  218.     ; set main serve var
  219.     ldr r0,SERVE
  220.     ldr r1,[r0]
  221.     mov r1,#0xFF
  222.     str r1,[r0]
  223.     ; set L serve status to FF
  224.     ldr r0,SERVE_L
  225.     ldr r1,[r0]
  226.     mov r1,#0xFF
  227.     str r1,[r0]
  228.     ; set R serve status to 00
  229.     ldr r0,SERVE_R
  230.     ldr r1,[r0]
  231.     mov r1,#0x00
  232.     str r1,[r0]
  233.     bx  lr
  234.  
  235. exit_interrupt_d:
  236.     ; exit routine for interruption from GPIO D
  237.     bl add_points_l
  238.     pop {lr}
  239.     bx lr
  240.  
  241. exit_interrupt_f:
  242.     ; exit routine for interruption from GPIO F
  243.     bl add_points_r
  244.  
  245.     pop {lr}
  246.     bx lr
  247.  
  248.     .align 0x100    ; Starta avbrottrutin för GPIO port D pÃ¥ en adress som slutar med tvÃ¥ nollor
  249. ;**********************************************
  250. ;*
  251. ;* Placera din avbrottrutin för GPIO port D här
  252. ;*
  253. intgpiod:
  254.     push {lr}
  255.  
  256.     ; nollställ avbrott
  257.     ldr r1,GPIOD_base
  258.     mov r0,#0xff    ; clear interrupts
  259.     str r0,[r1,#GPIOICR]
  260.  
  261.     ; set general serve to 0x00
  262.     ldr r0,SERVE
  263.     ldr r1,[r0]
  264.     mov r1,#0x00
  265.     str r1,[r0]
  266.  
  267.     ldr r0,GPIOB_GPIODATA
  268.     ldr r1,[r0]
  269.     cmp r1,#0x01
  270.     bne exit_interrupt_d
  271.     bl change_dir_to_left
  272.  
  273.     pop {lr}
  274.     ;str [lr,#4], lr
  275.     bx lr
  276.  
  277.  
  278.  
  279.     .align 0x100    ; Placera rutinen nedan i programminnet pÃ¥ en adress som slutar med 00
  280. ;***********************************************
  281. ;*
  282. ;* Placera din avbrottsrutin för GPIO port F här
  283. ;*
  284. intgpiof:
  285.     push {lr}
  286.  
  287.     ; nollställ avbrott
  288.     ldr r1,GPIOF_base
  289.     mov r0,#0xff    ; clear interrupts
  290.     str r0,[r1,#GPIOICR]
  291.  
  292.     ; set general serve to 0x00
  293.     ldr r0,SERVE
  294.     ldr r1,[r0]
  295.     mov r1,#0x00
  296.     str r1,[r0]
  297.  
  298.     ;
  299.     ldr r0,GPIOB_GPIODATA
  300.     ldr r1,[r0]
  301.     cmp r1,#0x80
  302.     bne exit_interrupt_f
  303.     bl change_dir_to_right
  304.  
  305.     pop {lr}
  306.     bx lr
  307.  
  308.  
  309.     .align 0x100    ; Placera i programminnet pÃ¥ en adress som slutar med 00
  310. ;*******************************************************************************************************
  311. ;*
  312. ;* Subrutiner och definition. Inget som ska behöva ändras i labben, däremot kan ni använda eller lägga
  313. ;* till definitioner i tabellen nedan.
  314. ;*
  315.  
  316. ;   inituart
  317. ;   Destroys r0, r1
  318. ;   inituart (assume almost all is default: no analog activated, UART0 already enabled by default) Could add code to check and setup if not correct
  319. ;   NOTE: Drawback with this approach: unsure if reset of cpu works!
  320. ;   enable UART0 (clock gating) (set 1 in bit 0 in RCGCUART at 0x400F.E000, offset 0x618)
  321.  
  322. ;*****************************************************
  323. ;*
  324. ;* Konstanter som lagras i programminnet
  325. ;*
  326. ;* Används tillsammans med offset konstanterna nedan
  327. ;*
  328. ;*****************************************************
  329. UART0_base  .field  0x4000c000, 32  ; Startadress för UART
  330.  
  331. GPIOA_base  .field  0x40004000, 32  ; General Purpose IO port A startadress
  332. GPIOB_base  .field  0x40005000, 32  ; General Purpose IO port B startadress
  333. GPIOC_base  .field  0x40006000, 32  ; General Purpose IO port C startadress
  334. GPIOD_base  .field  0x40007000, 32  ; General Purpose IO port D startadress
  335. GPIOE_base  .field  0x40024000, 32  ; General Purpose IO port E startadress
  336. GPIOF_base  .field  0x40025000, 32  ; General Purpose IO port F startadress
  337.  
  338. GPIO_HBCTL  .field  0x400FE06C, 32  ; GPIO bussval
  339.  
  340. NVIC_base   .field  0xe000e000, 32  ; Nested Vectored Interrupt Controller
  341.  
  342. GPIO_KEY    .field  0x4c4f434b, 32  ; Nyckelvärde för upplÃ¥sning av konfiguration
  343.  
  344. RCGCUART    .field  0x400FE618, 32  ; Starta UART portar
  345. RCGCGPIO    .field  0x400fe608, 32  ; Starta GPIO portar
  346.  
  347. ;*****************************************************
  348. ; Konstanter som inte lagras i programminnet
  349. ;
  350. ; Används som offset tillsammans med base-definitioner
  351. ; ovan.
  352. ;*****************************************************
  353. UARTDR      .equ    0x0000  ; Data register
  354. UARTFR      .equ    0x0018  ; Flag register
  355. UARTIBRD    .equ    0x0024  ; Baud rate styrning1
  356. UARTFBRD    .equ    0x0028  ; Baud rate styrning2
  357. UARTLCRH    .equ    0x002c  ;
  358. UARTCTL     .equ    0x0030  ; Control register
  359.  
  360.  
  361.  
  362. ;------------------- our variables -------------------;
  363. ; FIELDS
  364. GPIOB_GPIODATA  .field  0x400053fc, 32      ; reference to data register on the port B
  365. SERVE_L         .field  0x20001000, 32      ; is player L serving?
  366. SERVE_R         .field  0x20001004, 32      ; is player R serving?
  367. MOVE_DIR        .field  0x20001008, 32      ; ball direction
  368. POINTS_L        .field  0x20001020, 32      ; points of player L
  369. POINTS_R        .field  0x20001024, 32      ; points of player R
  370. SERVE           .field  0x20001028, 32      ; serve general
  371. ;------------------- our variables -------------------;
  372.  
  373.  
  374.  
  375. GPIODATA    .equ    0x0000  ; Data register
  376. GPIODIR     .equ    0x0400  ; Direction select
  377. GPIOIS      .equ    0x0404  ; interrupt sense
  378. GPIOIBE     .equ    0x0408  ; interrupt both edges
  379. GPIOIEV     .equ    0x040c  ; interrupt event
  380. GPIOIM      .equ    0x0410  ; interrupt mask
  381. GPIORIS     .equ    0x0414  ; raw interrupt status
  382. GPIOMIS     .equ    0x0418  ; masked interrupt status
  383. GPIOICR     .equ    0x041c  ; interrupt clear
  384. GPIOAFSEL   .equ    0x0420  ; alternate function select
  385. GPIODR2R    .equ    0x0500  ; 2 mA Drive select
  386. GPIODR4R    .equ    0x0504  ; 4 mA Drive select
  387. GPIODR8R    .equ    0x0508  ; 8 mA Drive select
  388. GPIOODR     .equ    0x050c  ; Open drain select
  389. GPIOPUR     .equ    0x510   ; pull-up select
  390. GPIOPDR     .equ    0x514   ; pull-down select
  391. GPIOSLR     .equ    0x518   ; slew rate control select
  392. GPIODEN     .equ    0x51c   ; digital enable
  393. GPIOLOCK    .equ    0x520   ; lock register
  394. GPIOCR      .equ    0x524   ; commit
  395. GPIOAMSEL   .equ    0x528   ; analog mode select
  396. GPIOPCTL    .equ    0x52c   ; port control
  397.  
  398. NVIC_EN0    .equ    0x100   ; Enable avbrott 0-31
  399. NVIC_PRI0   .equ    0x400   ; Styr prioritet avbrott 0-3
  400. NVIC_PRI1   .equ    0x404   ; Styr prioritet avbrott 4-7
  401. NVIC_PRI7   .equ    0x41c   ; Styr prioritet avbrott 28-31
  402. NVIC_PRI12  .equ    0x430   ; Styr prioritet avbrott 48-51
  403.  
  404. Bakgrundstext   .string "Bakgrundsprogram",13,10,0
  405. Lefttext    .string "    AVBROTT v",0xe4, "nster",13,10,0
  406. Leftstar    .string "          *",13,10,0
  407. Righttext   .string "              AVBROTT h",0xf6, "ger",13,10,0
  408. Rightstar   .string "                    *",13,10,0
  409.  
  410.     .align 2
  411.  
  412. ;* SKBAK: Skriver ut texten "Bakgrundsprogram" i långsam fart
  413. ;* Förstör r3, r2, r1, r0
  414. SKBAK:
  415.     cpsid   i
  416.     push {lr}
  417.     adr r3,Bakgrundstext
  418.     bl  slowprintstring
  419.     pop {lr}
  420.     cpsie i
  421.     bx  lr
  422.  
  423.  
  424. ;* SKAVV: Skriver ut texten "Avbrott vänster" följt av 5 rader med en stjärna
  425. ;* Förstör r3, r2, r1, r0
  426. SKAVV:
  427.     adr r3,Lefttext
  428.     push {lr}
  429.     bl  slowprintstring
  430.     mov r2,#5
  431. leftloop:
  432.     mov r1,#600
  433.     bl  DELAY
  434.     adr r3,Leftstar
  435.     bl  slowprintstring
  436.     subs r2,r2,#1
  437.     bne leftloop
  438.     pop {lr}
  439.     bx  lr
  440.  
  441. ;* SKAVH: Skriver ut texten "Avbrott höger" följt av 5 rader med en stjärna
  442. ;* Förstör r3, r2, r1, r0
  443. SKAVH:
  444.     adr r3,Righttext
  445.     push {lr}
  446.     bl  slowprintstring
  447.     mov r2,#5
  448. rightloop:
  449.     mov r1,#600
  450.     bl  DELAY
  451.     adr r3,Rightstar
  452.     bl  slowprintstring
  453.     subs r2,r2,#1
  454.     bne rightloop
  455.     pop {lr}
  456.     bx  lr
  457.  
  458. ;* DELAY:
  459. ;* r1 = antal ms, förstör r1
  460. DELAY:
  461.     push {r0}
  462. loop_millisecond:
  463.     mov r0,#0x1300   ;CHANGE IT BACK TO #0x1300
  464. loop_delay:
  465.     subs r0,r0,#1
  466.     bne loop_delay
  467.     subs r1,r1,#1
  468.     bne loop_millisecond
  469.     pop {r0}
  470.     bx  lr
  471.  
  472. ;* inituart: Sätter upp seriell kommunikation (starta UART0, sätt baudrate 115200, 8N1 format)
  473. inituart:
  474.     ldr r1,RCGCUART
  475.     ldr r0,[r1]
  476.     orr r0,#0x01
  477.     str r0,[r1]
  478.  
  479. ;   aktivera  GPIO Port A
  480.     ldr r1,RCGCGPIO
  481.     ldr r0,[r1]
  482.     orr r0,#0x01
  483.     str r0,[r1]
  484.  
  485.     nop
  486.     nop
  487.     nop
  488.  
  489. ;   Anslut pin 0 och 1 pÃ¥ GPIO port A till UART function (förvalt redan för UART0)
  490. ;   TillÃ¥t alt funktion och slÃ¥ pÃ¥ digital I/O pÃ¥ port A pin 0 och 1
  491.     ldr r1,GPIOA_base
  492.     ldr r0,[r1,#GPIOAFSEL]
  493.     orr r0,#0x03
  494.     str r0,[r1,#GPIOAFSEL]
  495.  
  496.     ldr r0,[r1,#GPIODEN]
  497.     orr r0,#0x03
  498.     str r0,[r1,#GPIODEN]
  499.  
  500. ;   Sätt klockfrekvens för uart, beräknas som BRD = 16 MHz / (16 * 115200) = 8.680556 => BRDI = 8, BRDF=0.6805556, DIVFRAC=(0.6805556*64+0.5)=44
  501. ;      Slutlig inställning av klocka för uart:
  502. ;         8 till UARTIBRD (bit 15 till 0 i UARTIBRD)
  503.     ldr r1,UART0_base
  504.     mov r0,#0x08
  505.     str r0,[r1,#UARTIBRD]
  506.  
  507. ;        44 till UARTFBRD (bit 5 to 0 i UARTFBRD)
  508.     mov r0,#44
  509.     str r0,[r1,#UARTFBRD]
  510.  
  511. ;   initiera 8 bit, ingen FIFO buffert, 1 stop bit, ingen paritetsbit (0x60 to bit 7 till 0 i UARTLCRH)
  512.     mov r0,#0x60
  513.     str r0,[r1,#UARTLCRH]
  514.  
  515. ;   aktivera uart (0 till bitarna 15 and 14, 0 till bit 11, 0x6 till bitarna 9 to 7, 0x01 till bitarna 5 downto 0 i UARTCTL)
  516.  
  517.     mov r0,#0x0301
  518.     str r0,[r1,#UARTCTL]
  519.  
  520.     bx  lr
  521.  
  522.     .align 0x10
  523.  
  524. ; initGPIOB, sätt GPIO port B pin 7 till 0 som utgångar
  525. ; förstör r0, r1
  526. initGPIOB:
  527.     ldr r1,RCGCGPIO
  528.     ldr r0,[r1]
  529.     orr r0,#0x02    ; Aktivera GPIO port B
  530.     str r0,[r1]
  531.     nop  ; 5 klockcykler innan porten fÃ¥r användas
  532.     nop
  533.     nop
  534.  
  535.     ldr r1,GPIO_HBCTL   ; Välj bus för GPIOB
  536.     ldr r0,[r1]
  537.     bic r0,#0x02       ; välj apb bus för GPIOB (nollställ bit 1)
  538.     str r0,[r1]
  539.  
  540.     ldr r1,GPIOB_base
  541.     mov r0,#0xff    ; alla pinnar är utgÃ¥ngar
  542.     str r0,[r1,#GPIODIR]
  543.  
  544.     mov r0,#0       ; alla pinnar fungerar som GPIO-port
  545.     str r0,[r1,#GPIOAFSEL]
  546.  
  547.     mov r0,#0x00    ; Förhindra analog funktion
  548.     str r0,[r1,#GPIOAMSEL]
  549.  
  550.     mov r0,#0x00    ; Använd port B som GPIO utan speciella funktioner
  551.     str r0,[r1,#GPIOPCTL]
  552.  
  553.     mov r0,#0x00    ; Inga pullup pinnar pÃ¥ port B
  554.     str r0,[r1,#GPIOPUR]
  555.  
  556.     mov r0,#0xff    ; alla pinnar är digital I/O
  557.     str r0,[r1,#GPIODEN]
  558.  
  559.     bx  lr
  560.  
  561.  
  562. ; initGPIOD, sätt pinnar 2,3,6,7 som ingångar
  563. ; destroy r0, r1
  564. initGPIOD:
  565.     ldr r1,RCGCGPIO
  566.     ldr r0,[r1]
  567.     orr r0,#0x08    ; aktivera GPIO port D clocking
  568.     str r0,[r1]
  569.     nop  ; 5 klockcykler innan porten kan användas
  570.     nop
  571.     nop
  572.  
  573.     ldr r1,GPIO_HBCTL   ; använd inte ahb för GPIOD
  574.     ldr r0,[r1]
  575.     bic r0,#0x08       ; använd apb bus för GPIOD
  576.     str r0,[r1]
  577.  
  578.     ldr r1,GPIOD_base
  579.     ldr r0,GPIO_KEY
  580.     str r0,[r1,#GPIOLOCK]       ; lÃ¥s upp port F configurationsregister
  581.  
  582.     mov r0,#0xcc    ; tillÃ¥t de 4 pinnarna i porten att konfigureras
  583.     str r0,[r1,#GPIOCR]
  584.  
  585.     mov r0,#0x0     ; alla som ingÃ¥ngar
  586.     str r0,[r1,#GPIODIR]
  587.  
  588.     mov r0,#0       ; alla portens bitar som GPIO
  589.     str r0,[r1,#GPIOAFSEL]
  590.  
  591.     mov r0,#0x00    ; förhindra analog funktionalitet
  592.     str r0,[r1,#GPIOAMSEL]
  593.  
  594.     mov r0,#0x00    ; använd port D som GPIO utan speciella funktioner
  595.     str r0,[r1,#GPIOPCTL]
  596.  
  597.     mov r0,#0x00    ; Ingen pullup pÃ¥ port D
  598.     str r0,[r1,#GPIOPUR]
  599.  
  600.     mov r0,#0xff    ; alla pinnar som digital I/O
  601.     str r0,[r1,#GPIODEN]
  602.  
  603.     bx  lr
  604.  
  605. ; initGPIOE, sätt pinnar bit 0-5 som utgångar
  606. ; destroy r0, r1
  607. initGPIOE:
  608.     ldr r1,RCGCGPIO
  609.     ldr r0,[r1]
  610.     orr r0,#0x10    ; aktivera GPIO port E
  611.     str r0,[r1]
  612.     nop  ; 5 klockcykler innan porten används
  613.     nop
  614.     nop
  615.  
  616.     ldr r1,GPIO_HBCTL   ; Använd inte ahb (high performance bus) för GPIOE
  617.     ldr r0,[r1]
  618.     bic r0,#0x10       ; använd apb bus for GPIOE
  619.     str r0,[r1]
  620.  
  621.     mov r0,#0x3f        ; alla pinnar ska vara utgÃ¥ngar
  622.     str r0,[r1,#GPIODIR]
  623.  
  624.     mov r0,#0       ; alla portens bitar som GPIO
  625.     str r0,[r1,#GPIOAFSEL]
  626.  
  627.     mov r0,#0x00    ; förhindra analog funktionalitet
  628.     str r0,[r1,#GPIOAMSEL]
  629.  
  630.     mov r0,#0x00    ; använd port E som GPIO utan speciell funktionailtet
  631.     str r0,[r1,#GPIOPCTL]
  632.  
  633.     mov r0,#0x00    ; Ingen pullup pÃ¥ port E
  634.     str r0,[r1,#GPIOPUR]
  635.  
  636.     mov r0,#0x3f    ; alla pinnar som digital I/O
  637.     str r0,[r1,#GPIODEN]
  638.  
  639.     bx  lr
  640.  
  641.  
  642. ; initGPIOF, sätt pin 0-3 som utgångar, pin 4 som ingång med pullup
  643. ; förstör r0, r1
  644.  
  645. initGPIOF:
  646.     ldr r1,RCGCGPIO
  647.     ldr r0,[r1]
  648.     orr r0,#0x20    ; aktivera GPIO port F
  649.     str r0,[r1]
  650.     nop  ; 5 klockcykler innan porten kan användas
  651.     nop
  652.     nop
  653.  
  654.     ldr r1,GPIO_HBCTL   ; Välj bustyp för GPIOF
  655.     ldr r0,[r1]
  656.     bic r0,#0x20    ; välj GPIOF port ansluten till apb bus
  657.     str r0,[r1]
  658.  
  659.     ldr r1,GPIOF_base
  660.     ldr r0,GPIO_KEY
  661.     str r0,[r1,#GPIOLOCK]       ; lÃ¥s upp port F configurationsregister
  662.  
  663.     mov r0,#0x1f    ; tillåẗ alla 5 bitarna bli konfigurerade
  664.     str r0,[r1,#GPIOCR]
  665.  
  666.     mov r0,#0x00    ; förhindra analog function
  667.     str r0,[r1,#GPIOAMSEL]
  668.  
  669.     mov r0,#0x00    ; använd port F som GPIO
  670.     str r0,[r1,#GPIOPCTL]
  671.  
  672.     mov r0,#0x0f    ; använd bit 0-3 som utgÃ¥ngar (Tryck INTE pÃ¥ högra svarta knappen pÃ¥ Darma!)
  673.     str r0,[r1,#GPIODIR]
  674.  
  675.     mov r0,#0       ; alla pinnar ska vara GPIO
  676.     str r0,[r1,#GPIOAFSEL]
  677.  
  678.     mov r0,#0x10    ; svag pull-up för switch ingÃ¥ng
  679.     str r0,[r1,#GPIOPUR]
  680.  
  681.     mov r0,#0xff    ; alla pinnar som  digitala I/O
  682.     str r0,[r1,#GPIODEN]
  683.  
  684.     bx  lr
  685.  
  686.  
  687. ; initint, initiera avbrottshanteringen
  688. ; förstör r0,r1
  689. ; Tillåt avbrott från pin 7 port D och pin 4 port F
  690. initint:
  691.     ; TillÃ¥t inte avbrott
  692.     cpsid   i
  693.  
  694.     ; Generera avbrott frÃ¥n port D, GPIO port D är avbrott nr 3 (vector 19)
  695.     ; positiv flank, hög prioritet pÃ¥ avbrott
  696.  
  697.     ; Generera avbrott frÃ¥n port F, GPIO port F är avbrott nr 30 (vector 46)
  698.     ; positiv flank, lÃ¥g prioritet pÃ¥ avbrott
  699.  
  700.     ; avbrott aktiveras pÃ¥ insignalens flank
  701.     ldr r1,GPIOF_base
  702.     mov r0,#0x00    ; edge detection
  703.     str r0,[r1,#GPIOIS]
  704.  
  705.     ; nollställ avbrott
  706.     mov r0,#0xff    ; clear interrupts
  707.     str r0,[r1,#GPIOICR]
  708.  
  709.     ; Endast stigande flank (ignorera fallande flank)
  710.     mov r0,#0x00    ; Use IEV to control
  711.     str r0,[r1,#GPIOIBE]
  712.  
  713.     mov r0,#0x10    ; stigande flank
  714.     str r0,[r1,#GPIOIEV]
  715.  
  716.     ; nollställ avbrott
  717.     mov r0,#0xff    ; clear interrupts
  718.     str r0,[r1,#GPIOICR]
  719.  
  720.     ; tillÃ¥t avbrott frÃ¥n bit 4
  721.     mov r0,#0x10    ; Send interrupt to controller
  722.     str r0,[r1,#GPIOIM]
  723.  
  724.     ; NVIC_priority interrupt 30 (
  725.     ldr r1,NVIC_base
  726.     ldr r0,[r1,#NVIC_PRI7]      ; Set priority 5
  727.     mvn r2,#0x00e00000  ; nollställ bit 23 till 21
  728.     and r0,r2
  729.     orr r0,#0x00a00000
  730.     str r0,[r1,#NVIC_PRI7]
  731.  
  732.     ; NVIC_enable tillÃ¥t avbrott nr 30 (port F)
  733.     ldr r0,[r1,#NVIC_EN0]
  734.     orr r0,#0x40000000
  735.     str r0,[r1,#NVIC_EN0]
  736.  
  737.     ; avbrott aktiveras av stigande flank
  738.     ldr r1,GPIOD_base
  739.     mov r0,#0x00    ; edge detection
  740.     str r0,[r1,#GPIOIS]
  741.  
  742.     ; nollställ avbrott
  743.     mov r0,#0xff    ; clear interrupts
  744.     str r0,[r1,#GPIOICR]
  745.  
  746.     ; ignorera fallande flank
  747.     mov r0,#0x00    ; Use IEV to control
  748.     str r0,[r1,#GPIOIBE]
  749.  
  750.     ; stigande flank edge
  751.     mov r0,#0xcc    ; rising edge
  752.     str r0,[r1,#GPIOIEV]
  753.  
  754.     ;clear interrupts
  755.     mov r0,#0xff    ; clear interrupts
  756.     str r0,[r1,#GPIOICR]
  757.  
  758.     ; tillÃ¥t avbrott frÃ¥n bit 7
  759.     mov r0,#0x80    ; Send interrupt to controller
  760.     str r0,[r1,#GPIOIM]
  761.  
  762.     ; NVIC_priority avbrott
  763.     ldr r1,NVIC_base
  764.     ldr r0,[r1,#NVIC_PRI0]      ; Set priority 2
  765.     bic r0,r0,#0xe0000000       ; nollställ bit 31-29
  766.     orr r0,r0,#0x40000000
  767.     str r0,[r1,#NVIC_PRI0]
  768.  
  769.     ; NVIC_enable port D avbrott
  770.     ldr r0,[r1,#NVIC_EN0]
  771.     orr r0,#0x00000008          ; tillÃ¥t avbrott nr 3
  772.     str r0,[r1,#NVIC_EN0]
  773.  
  774.     ; enable interrupts
  775.     cpsie   i
  776.  
  777.     bx  lr
  778.  
  779.  
  780. ; Startadress i r3, sträng avslutas med värdet 0
  781. ; förstör r0, r1, r3
  782. slowprintstring:
  783.     push {lr}
  784. nextchar:
  785.     ldrb r0,[r3],#1
  786.     cmp r0,#0
  787.     beq slowprintstringdone
  788.     bl printchar
  789.     mov r1,#40   ;CHANGE IT BACK TO #40
  790.     bl DELAY
  791.     b   nextchar
  792. slowprintstringdone:
  793.     pop {lr}
  794.     bx lr
  795.  
  796. printchar:
  797. ;   Skriv ut tecken placerat i r0
  798. ;   Läs bit 5 (TXFF) i UART0_FR, vänta tills den blivit 0
  799. ;   skriv bit 7-0 i UART0_DR
  800.     push {r1}
  801. loop1:
  802.     ldr r1,UART0_base
  803.     ldr r1,[r1,#UARTFR]
  804.     ands r1,#0x20       ; Kontrollera om sändarbuffert är full
  805.     bne loop1           ; Hopp om full
  806.     ldr r1,UART0_base
  807.     str r0,[r1,#UARTDR] ; Skicka tecken
  808.     pop {r1}
  809.     bx lr
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement