Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;*******************************
- ;*
- ;* Malldokument för Lab2 i Datorteknik Y på Darma
- ;*
- ;* KPa 180212
- ;*
- ;*
- ;* Lab 2: Använd två portar för avbrott: Port F pin 4 och Port D pin 7
- ;*
- ;* Port B pin 0-7 definierat som utgångar
- ;* Port D pin 7 definierat som ingång, pin 7 avbrott på stigande flank
- ;* Port E pin 0-5 definierat som utgångar
- ;* Port F pin 0-3 definierat som utgångar
- ;* Port F pin 4 definierat som ingång med pull-up, pin 4 avbrott på stigande flank
- ;*
- ;* Fördefinierade subrutiner
- ;*
- ;* inituart: Initiera uart0 till 115200 baud, 8N1.
- ;* initGPIOB: Initiera port B
- ;* initGPIOD: Initiera port D
- ;* initGPIOE: Initiera port E
- ;* initGPIOF: Initiera port F
- ;* initint: Initiera NVIC för GPIOF prio 5, GPIOD prio 2
- ;* SKBAK: Skriv ut "Bakgrundsprogram"
- ;* SKAVH: Skriv ut " Avbrott höger"
- ;* SKAVV: Skriv ut " Avbrott vänster"
- ;* DELAY: Fördröjning, r1=antal ms att vänta
- ;*
- .thumb ; Kod ska vara för Thumb mode
- .text ; Programkod ska placeras i programminnet
- .align 2 ; Börja på en jämn adress
- .global main ; main finns definierad här
- .global intgpiod ; intgpiod är definierad här
- .global intgpiof ; intgpiof är definierad här
- .align 0x100 ; Starta main på en adress som slutar med två nollor.
- ;*************************************************************************
- ;*
- ;* Placera din ditt huvudprogram (main) här
- ;*
- main:
- bl inituart
- bl initGPIOB
- bl initGPIOD
- bl initGPIOF
- bl initint
- bl clear_score
- bl init_ball
- bl init_serve
- game_loop:
- ; game_loop, checks if someone is serving, else moves the ball
- ldr r0,SERVE
- ldr r1,[r0]
- cmp r1,#0xFF
- beq game_loop
- bl check_ball_dir
- b game_loop
- move_ball:
- mov r1, #100
- bl DELAY
- ; check if 'ball' is outside the diodes
- ; if it is, score to correct player
- cmp r0,#0
- beq add_points_l
- cmp r0, #256
- beq add_points_r
- bl game_loop
- check_ball_dir:
- ; checks the direction of ball
- ldr r2,MOVE_DIR
- ldr r12,[r2]
- cmp r12,#0x00
- ; goes into move_ball_left if direction is 0x00 else move_ball_right
- beq move_ball_left
- b move_ball_right
- move_ball_left:
- ; shift the GPOIB data one bit to the left
- ldr r3,GPIOB_GPIODATA
- ldr r0,[r3]
- lsl r0, #1
- str r0,[r3]
- bl move_ball
- move_ball_right:
- ; shift the GPIOB data one bit to the right
- ldr r3,GPIOB_GPIODATA
- ldr r0,[r3]
- lsr r0, #1
- str r0,[r3]
- b move_ball
- add_points_l:
- push {lr}
- ; incrementing points to left player by 1
- ldr r0,POINTS_L
- ldr r1,[r0]
- ADD r1,#1
- str r1,[r0]
- ; set serving for player R
- ldr r0,SERVE_L
- mov r1,#0xFF
- str r1,[r0]
- ; set direction to L
- ldr r0,MOVE_DIR
- mov r1,#0x00
- str r1,[r0]
- ; set general serve to 0xFF
- ldr r0,SERVE
- ldr r1,[r0]
- mov r1,#0xFF
- str r1,[r0]
- ; disable serving for player L
- ldr r0,SERVE_R
- mov r1,#0x00
- str r1,[r0]
- ; make left diode to shine red
- ldr r3,GPIOB_GPIODATA
- mov r1, #0x80
- str r1, [r3]
- pop {lr}
- bx lr
- add_points_r:
- push {lr}
- ; incrementing points to right player by 1
- ldr r0,POINTS_R
- ldr r1,[r0]
- ADD r1,#1
- str r1,[r0]
- ; set serving for player R
- ldr r0,SERVE_R
- mov r1,#0xFF
- str r1,[r0]
- ; set direction to R
- ldr r0,MOVE_DIR
- mov r1,#0xFF
- str r1,[r0]
- ; set general serve to 0xFF
- ldr r0,SERVE
- ldr r1,[r0]
- mov r1,#0xFF
- str r1,[r0]
- ; make right diode to shine red
- ldr r3,GPIOB_GPIODATA
- mov r1, #0x01
- str r1, [r3]
- ; disable serving for player L
- ldr r0,SERVE_L
- mov r1,#0x00
- str r1,[r0]
- pop {lr}
- bx lr
- ; clears the score of two players, used in initializing
- clear_score:
- ; clear score of player L
- ldr r0,POINTS_L
- ldr r1,[r0]
- mov r1,#0x00
- str r1,[r0]
- ; clear score of player L
- ldr r0,POINTS_R
- ldr r1,[r0]
- mov r1,#0x00
- str r1,[r0]
- bx lr
- change_dir_to_left:
- ; changes the direction field of ball to 0x00
- push {lr,r0,r1}
- ldr r0,MOVE_DIR
- ldr r1,[r0]
- mov r1,#0x00
- str r1,[r0]
- pop {lr,r0,r1}
- bx lr
- change_dir_to_right:
- ; changes the direction field of ball to 0xFF
- push {lr,r0,r1}
- ldr r0,MOVE_DIR
- ldr r1,[r0]
- mov r1,#0xFF
- str r1,[r0]
- pop {lr,r0,r1}
- bx lr
- init_ball:
- ; initializes the ball, sets it to left diode
- ldr r3,GPIOB_GPIODATA
- mov r1, #0x128
- str r1, [r3]
- bx lr
- init_serve:
- ; set main serve var
- ldr r0,SERVE
- ldr r1,[r0]
- mov r1,#0xFF
- str r1,[r0]
- ; set L serve status to FF
- ldr r0,SERVE_L
- ldr r1,[r0]
- mov r1,#0xFF
- str r1,[r0]
- ; set R serve status to 00
- ldr r0,SERVE_R
- ldr r1,[r0]
- mov r1,#0x00
- str r1,[r0]
- bx lr
- exit_interrupt_d:
- ; exit routine for interruption from GPIO D
- bl add_points_l
- pop {lr}
- bx lr
- exit_interrupt_f:
- ; exit routine for interruption from GPIO F
- bl add_points_r
- pop {lr}
- bx lr
- .align 0x100 ; Starta avbrottrutin för GPIO port D på en adress som slutar med två nollor
- ;**********************************************
- ;*
- ;* Placera din avbrottrutin för GPIO port D här
- ;*
- intgpiod:
- push {lr}
- ; nollställ avbrott
- ldr r1,GPIOD_base
- mov r0,#0xff ; clear interrupts
- str r0,[r1,#GPIOICR]
- ; set general serve to 0x00
- ldr r0,SERVE
- ldr r1,[r0]
- mov r1,#0x00
- str r1,[r0]
- ldr r0,GPIOB_GPIODATA
- ldr r1,[r0]
- cmp r1,#0x01
- bne exit_interrupt_d
- bl change_dir_to_left
- pop {lr}
- ;str [lr,#4], lr
- bx lr
- .align 0x100 ; Placera rutinen nedan i programminnet på en adress som slutar med 00
- ;***********************************************
- ;*
- ;* Placera din avbrottsrutin för GPIO port F här
- ;*
- intgpiof:
- push {lr}
- ; nollställ avbrott
- ldr r1,GPIOF_base
- mov r0,#0xff ; clear interrupts
- str r0,[r1,#GPIOICR]
- ; set general serve to 0x00
- ldr r0,SERVE
- ldr r1,[r0]
- mov r1,#0x00
- str r1,[r0]
- ;
- ldr r0,GPIOB_GPIODATA
- ldr r1,[r0]
- cmp r1,#0x80
- bne exit_interrupt_f
- bl change_dir_to_right
- pop {lr}
- bx lr
- .align 0x100 ; Placera i programminnet på en adress som slutar med 00
- ;*******************************************************************************************************
- ;*
- ;* Subrutiner och definition. Inget som ska behöva ändras i labben, däremot kan ni använda eller lägga
- ;* till definitioner i tabellen nedan.
- ;*
- ; inituart
- ; Destroys r0, r1
- ; inituart (assume almost all is default: no analog activated, UART0 already enabled by default) Could add code to check and setup if not correct
- ; NOTE: Drawback with this approach: unsure if reset of cpu works!
- ; enable UART0 (clock gating) (set 1 in bit 0 in RCGCUART at 0x400F.E000, offset 0x618)
- ;*****************************************************
- ;*
- ;* Konstanter som lagras i programminnet
- ;*
- ;* Används tillsammans med offset konstanterna nedan
- ;*
- ;*****************************************************
- UART0_base .field 0x4000c000, 32 ; Startadress för UART
- GPIOA_base .field 0x40004000, 32 ; General Purpose IO port A startadress
- GPIOB_base .field 0x40005000, 32 ; General Purpose IO port B startadress
- GPIOC_base .field 0x40006000, 32 ; General Purpose IO port C startadress
- GPIOD_base .field 0x40007000, 32 ; General Purpose IO port D startadress
- GPIOE_base .field 0x40024000, 32 ; General Purpose IO port E startadress
- GPIOF_base .field 0x40025000, 32 ; General Purpose IO port F startadress
- GPIO_HBCTL .field 0x400FE06C, 32 ; GPIO bussval
- NVIC_base .field 0xe000e000, 32 ; Nested Vectored Interrupt Controller
- GPIO_KEY .field 0x4c4f434b, 32 ; Nyckelvärde för upplåsning av konfiguration
- RCGCUART .field 0x400FE618, 32 ; Starta UART portar
- RCGCGPIO .field 0x400fe608, 32 ; Starta GPIO portar
- ;*****************************************************
- ; Konstanter som inte lagras i programminnet
- ;
- ; Används som offset tillsammans med base-definitioner
- ; ovan.
- ;*****************************************************
- UARTDR .equ 0x0000 ; Data register
- UARTFR .equ 0x0018 ; Flag register
- UARTIBRD .equ 0x0024 ; Baud rate styrning1
- UARTFBRD .equ 0x0028 ; Baud rate styrning2
- UARTLCRH .equ 0x002c ;
- UARTCTL .equ 0x0030 ; Control register
- ;------------------- our variables -------------------;
- ; FIELDS
- GPIOB_GPIODATA .field 0x400053fc, 32 ; reference to data register on the port B
- SERVE_L .field 0x20001000, 32 ; is player L serving?
- SERVE_R .field 0x20001004, 32 ; is player R serving?
- MOVE_DIR .field 0x20001008, 32 ; ball direction
- POINTS_L .field 0x20001020, 32 ; points of player L
- POINTS_R .field 0x20001024, 32 ; points of player R
- SERVE .field 0x20001028, 32 ; serve general
- ;------------------- our variables -------------------;
- GPIODATA .equ 0x0000 ; Data register
- GPIODIR .equ 0x0400 ; Direction select
- GPIOIS .equ 0x0404 ; interrupt sense
- GPIOIBE .equ 0x0408 ; interrupt both edges
- GPIOIEV .equ 0x040c ; interrupt event
- GPIOIM .equ 0x0410 ; interrupt mask
- GPIORIS .equ 0x0414 ; raw interrupt status
- GPIOMIS .equ 0x0418 ; masked interrupt status
- GPIOICR .equ 0x041c ; interrupt clear
- GPIOAFSEL .equ 0x0420 ; alternate function select
- GPIODR2R .equ 0x0500 ; 2 mA Drive select
- GPIODR4R .equ 0x0504 ; 4 mA Drive select
- GPIODR8R .equ 0x0508 ; 8 mA Drive select
- GPIOODR .equ 0x050c ; Open drain select
- GPIOPUR .equ 0x510 ; pull-up select
- GPIOPDR .equ 0x514 ; pull-down select
- GPIOSLR .equ 0x518 ; slew rate control select
- GPIODEN .equ 0x51c ; digital enable
- GPIOLOCK .equ 0x520 ; lock register
- GPIOCR .equ 0x524 ; commit
- GPIOAMSEL .equ 0x528 ; analog mode select
- GPIOPCTL .equ 0x52c ; port control
- NVIC_EN0 .equ 0x100 ; Enable avbrott 0-31
- NVIC_PRI0 .equ 0x400 ; Styr prioritet avbrott 0-3
- NVIC_PRI1 .equ 0x404 ; Styr prioritet avbrott 4-7
- NVIC_PRI7 .equ 0x41c ; Styr prioritet avbrott 28-31
- NVIC_PRI12 .equ 0x430 ; Styr prioritet avbrott 48-51
- Bakgrundstext .string "Bakgrundsprogram",13,10,0
- Lefttext .string " AVBROTT v",0xe4, "nster",13,10,0
- Leftstar .string " *",13,10,0
- Righttext .string " AVBROTT h",0xf6, "ger",13,10,0
- Rightstar .string " *",13,10,0
- .align 2
- ;* SKBAK: Skriver ut texten "Bakgrundsprogram" i långsam fart
- ;* Förstör r3, r2, r1, r0
- SKBAK:
- cpsid i
- push {lr}
- adr r3,Bakgrundstext
- bl slowprintstring
- pop {lr}
- cpsie i
- bx lr
- ;* SKAVV: Skriver ut texten "Avbrott vänster" följt av 5 rader med en stjärna
- ;* Förstör r3, r2, r1, r0
- SKAVV:
- adr r3,Lefttext
- push {lr}
- bl slowprintstring
- mov r2,#5
- leftloop:
- mov r1,#600
- bl DELAY
- adr r3,Leftstar
- bl slowprintstring
- subs r2,r2,#1
- bne leftloop
- pop {lr}
- bx lr
- ;* SKAVH: Skriver ut texten "Avbrott höger" följt av 5 rader med en stjärna
- ;* Förstör r3, r2, r1, r0
- SKAVH:
- adr r3,Righttext
- push {lr}
- bl slowprintstring
- mov r2,#5
- rightloop:
- mov r1,#600
- bl DELAY
- adr r3,Rightstar
- bl slowprintstring
- subs r2,r2,#1
- bne rightloop
- pop {lr}
- bx lr
- ;* DELAY:
- ;* r1 = antal ms, förstör r1
- DELAY:
- push {r0}
- loop_millisecond:
- mov r0,#0x1300 ;CHANGE IT BACK TO #0x1300
- loop_delay:
- subs r0,r0,#1
- bne loop_delay
- subs r1,r1,#1
- bne loop_millisecond
- pop {r0}
- bx lr
- ;* inituart: Sätter upp seriell kommunikation (starta UART0, sätt baudrate 115200, 8N1 format)
- inituart:
- ldr r1,RCGCUART
- ldr r0,[r1]
- orr r0,#0x01
- str r0,[r1]
- ; aktivera GPIO Port A
- ldr r1,RCGCGPIO
- ldr r0,[r1]
- orr r0,#0x01
- str r0,[r1]
- nop
- nop
- nop
- ; Anslut pin 0 och 1 på GPIO port A till UART function (förvalt redan för UART0)
- ; Tillåt alt funktion och slå på digital I/O på port A pin 0 och 1
- ldr r1,GPIOA_base
- ldr r0,[r1,#GPIOAFSEL]
- orr r0,#0x03
- str r0,[r1,#GPIOAFSEL]
- ldr r0,[r1,#GPIODEN]
- orr r0,#0x03
- str r0,[r1,#GPIODEN]
- ; 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
- ; Slutlig inställning av klocka för uart:
- ; 8 till UARTIBRD (bit 15 till 0 i UARTIBRD)
- ldr r1,UART0_base
- mov r0,#0x08
- str r0,[r1,#UARTIBRD]
- ; 44 till UARTFBRD (bit 5 to 0 i UARTFBRD)
- mov r0,#44
- str r0,[r1,#UARTFBRD]
- ; initiera 8 bit, ingen FIFO buffert, 1 stop bit, ingen paritetsbit (0x60 to bit 7 till 0 i UARTLCRH)
- mov r0,#0x60
- str r0,[r1,#UARTLCRH]
- ; 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)
- mov r0,#0x0301
- str r0,[r1,#UARTCTL]
- bx lr
- .align 0x10
- ; initGPIOB, sätt GPIO port B pin 7 till 0 som utgångar
- ; förstör r0, r1
- initGPIOB:
- ldr r1,RCGCGPIO
- ldr r0,[r1]
- orr r0,#0x02 ; Aktivera GPIO port B
- str r0,[r1]
- nop ; 5 klockcykler innan porten får användas
- nop
- nop
- ldr r1,GPIO_HBCTL ; Välj bus för GPIOB
- ldr r0,[r1]
- bic r0,#0x02 ; välj apb bus för GPIOB (nollställ bit 1)
- str r0,[r1]
- ldr r1,GPIOB_base
- mov r0,#0xff ; alla pinnar är utgångar
- str r0,[r1,#GPIODIR]
- mov r0,#0 ; alla pinnar fungerar som GPIO-port
- str r0,[r1,#GPIOAFSEL]
- mov r0,#0x00 ; Förhindra analog funktion
- str r0,[r1,#GPIOAMSEL]
- mov r0,#0x00 ; Använd port B som GPIO utan speciella funktioner
- str r0,[r1,#GPIOPCTL]
- mov r0,#0x00 ; Inga pullup pinnar på port B
- str r0,[r1,#GPIOPUR]
- mov r0,#0xff ; alla pinnar är digital I/O
- str r0,[r1,#GPIODEN]
- bx lr
- ; initGPIOD, sätt pinnar 2,3,6,7 som ingångar
- ; destroy r0, r1
- initGPIOD:
- ldr r1,RCGCGPIO
- ldr r0,[r1]
- orr r0,#0x08 ; aktivera GPIO port D clocking
- str r0,[r1]
- nop ; 5 klockcykler innan porten kan användas
- nop
- nop
- ldr r1,GPIO_HBCTL ; använd inte ahb för GPIOD
- ldr r0,[r1]
- bic r0,#0x08 ; använd apb bus för GPIOD
- str r0,[r1]
- ldr r1,GPIOD_base
- ldr r0,GPIO_KEY
- str r0,[r1,#GPIOLOCK] ; lås upp port F configurationsregister
- mov r0,#0xcc ; tillåt de 4 pinnarna i porten att konfigureras
- str r0,[r1,#GPIOCR]
- mov r0,#0x0 ; alla som ingångar
- str r0,[r1,#GPIODIR]
- mov r0,#0 ; alla portens bitar som GPIO
- str r0,[r1,#GPIOAFSEL]
- mov r0,#0x00 ; förhindra analog funktionalitet
- str r0,[r1,#GPIOAMSEL]
- mov r0,#0x00 ; använd port D som GPIO utan speciella funktioner
- str r0,[r1,#GPIOPCTL]
- mov r0,#0x00 ; Ingen pullup på port D
- str r0,[r1,#GPIOPUR]
- mov r0,#0xff ; alla pinnar som digital I/O
- str r0,[r1,#GPIODEN]
- bx lr
- ; initGPIOE, sätt pinnar bit 0-5 som utgångar
- ; destroy r0, r1
- initGPIOE:
- ldr r1,RCGCGPIO
- ldr r0,[r1]
- orr r0,#0x10 ; aktivera GPIO port E
- str r0,[r1]
- nop ; 5 klockcykler innan porten används
- nop
- nop
- ldr r1,GPIO_HBCTL ; Använd inte ahb (high performance bus) för GPIOE
- ldr r0,[r1]
- bic r0,#0x10 ; använd apb bus for GPIOE
- str r0,[r1]
- mov r0,#0x3f ; alla pinnar ska vara utgångar
- str r0,[r1,#GPIODIR]
- mov r0,#0 ; alla portens bitar som GPIO
- str r0,[r1,#GPIOAFSEL]
- mov r0,#0x00 ; förhindra analog funktionalitet
- str r0,[r1,#GPIOAMSEL]
- mov r0,#0x00 ; använd port E som GPIO utan speciell funktionailtet
- str r0,[r1,#GPIOPCTL]
- mov r0,#0x00 ; Ingen pullup på port E
- str r0,[r1,#GPIOPUR]
- mov r0,#0x3f ; alla pinnar som digital I/O
- str r0,[r1,#GPIODEN]
- bx lr
- ; initGPIOF, sätt pin 0-3 som utgångar, pin 4 som ingång med pullup
- ; förstör r0, r1
- initGPIOF:
- ldr r1,RCGCGPIO
- ldr r0,[r1]
- orr r0,#0x20 ; aktivera GPIO port F
- str r0,[r1]
- nop ; 5 klockcykler innan porten kan användas
- nop
- nop
- ldr r1,GPIO_HBCTL ; Välj bustyp för GPIOF
- ldr r0,[r1]
- bic r0,#0x20 ; välj GPIOF port ansluten till apb bus
- str r0,[r1]
- ldr r1,GPIOF_base
- ldr r0,GPIO_KEY
- str r0,[r1,#GPIOLOCK] ; lås upp port F configurationsregister
- mov r0,#0x1f ; tillåẠalla 5 bitarna bli konfigurerade
- str r0,[r1,#GPIOCR]
- mov r0,#0x00 ; förhindra analog function
- str r0,[r1,#GPIOAMSEL]
- mov r0,#0x00 ; använd port F som GPIO
- str r0,[r1,#GPIOPCTL]
- mov r0,#0x0f ; använd bit 0-3 som utgångar (Tryck INTE på högra svarta knappen på Darma!)
- str r0,[r1,#GPIODIR]
- mov r0,#0 ; alla pinnar ska vara GPIO
- str r0,[r1,#GPIOAFSEL]
- mov r0,#0x10 ; svag pull-up för switch ingång
- str r0,[r1,#GPIOPUR]
- mov r0,#0xff ; alla pinnar som digitala I/O
- str r0,[r1,#GPIODEN]
- bx lr
- ; initint, initiera avbrottshanteringen
- ; förstör r0,r1
- ; Tillåt avbrott från pin 7 port D och pin 4 port F
- initint:
- ; Tillåt inte avbrott
- cpsid i
- ; Generera avbrott från port D, GPIO port D är avbrott nr 3 (vector 19)
- ; positiv flank, hög prioritet på avbrott
- ; Generera avbrott från port F, GPIO port F är avbrott nr 30 (vector 46)
- ; positiv flank, låg prioritet på avbrott
- ; avbrott aktiveras på insignalens flank
- ldr r1,GPIOF_base
- mov r0,#0x00 ; edge detection
- str r0,[r1,#GPIOIS]
- ; nollställ avbrott
- mov r0,#0xff ; clear interrupts
- str r0,[r1,#GPIOICR]
- ; Endast stigande flank (ignorera fallande flank)
- mov r0,#0x00 ; Use IEV to control
- str r0,[r1,#GPIOIBE]
- mov r0,#0x10 ; stigande flank
- str r0,[r1,#GPIOIEV]
- ; nollställ avbrott
- mov r0,#0xff ; clear interrupts
- str r0,[r1,#GPIOICR]
- ; tillåt avbrott från bit 4
- mov r0,#0x10 ; Send interrupt to controller
- str r0,[r1,#GPIOIM]
- ; NVIC_priority interrupt 30 (
- ldr r1,NVIC_base
- ldr r0,[r1,#NVIC_PRI7] ; Set priority 5
- mvn r2,#0x00e00000 ; nollställ bit 23 till 21
- and r0,r2
- orr r0,#0x00a00000
- str r0,[r1,#NVIC_PRI7]
- ; NVIC_enable tillåt avbrott nr 30 (port F)
- ldr r0,[r1,#NVIC_EN0]
- orr r0,#0x40000000
- str r0,[r1,#NVIC_EN0]
- ; avbrott aktiveras av stigande flank
- ldr r1,GPIOD_base
- mov r0,#0x00 ; edge detection
- str r0,[r1,#GPIOIS]
- ; nollställ avbrott
- mov r0,#0xff ; clear interrupts
- str r0,[r1,#GPIOICR]
- ; ignorera fallande flank
- mov r0,#0x00 ; Use IEV to control
- str r0,[r1,#GPIOIBE]
- ; stigande flank edge
- mov r0,#0xcc ; rising edge
- str r0,[r1,#GPIOIEV]
- ;clear interrupts
- mov r0,#0xff ; clear interrupts
- str r0,[r1,#GPIOICR]
- ; tillåt avbrott från bit 7
- mov r0,#0x80 ; Send interrupt to controller
- str r0,[r1,#GPIOIM]
- ; NVIC_priority avbrott
- ldr r1,NVIC_base
- ldr r0,[r1,#NVIC_PRI0] ; Set priority 2
- bic r0,r0,#0xe0000000 ; nollställ bit 31-29
- orr r0,r0,#0x40000000
- str r0,[r1,#NVIC_PRI0]
- ; NVIC_enable port D avbrott
- ldr r0,[r1,#NVIC_EN0]
- orr r0,#0x00000008 ; tillåt avbrott nr 3
- str r0,[r1,#NVIC_EN0]
- ; enable interrupts
- cpsie i
- bx lr
- ; Startadress i r3, sträng avslutas med värdet 0
- ; förstör r0, r1, r3
- slowprintstring:
- push {lr}
- nextchar:
- ldrb r0,[r3],#1
- cmp r0,#0
- beq slowprintstringdone
- bl printchar
- mov r1,#40 ;CHANGE IT BACK TO #40
- bl DELAY
- b nextchar
- slowprintstringdone:
- pop {lr}
- bx lr
- printchar:
- ; Skriv ut tecken placerat i r0
- ; Läs bit 5 (TXFF) i UART0_FR, vänta tills den blivit 0
- ; skriv bit 7-0 i UART0_DR
- push {r1}
- loop1:
- ldr r1,UART0_base
- ldr r1,[r1,#UARTFR]
- ands r1,#0x20 ; Kontrollera om sändarbuffert är full
- bne loop1 ; Hopp om full
- ldr r1,UART0_base
- str r0,[r1,#UARTDR] ; Skicka tecken
- pop {r1}
- bx lr
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement