Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;
- ;; Mall för lab1 i TSEA28 Datorteknik Y
- ;;
- ;; 171208 K.Palmkvist
- ;;
- ;; Ange att koden är för thumb mode
- .thumb
- .text
- .align 2
- ;; Ange att labbkoden startar här efter initiering
- .global main
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; Placera programmet här
- main: ; Start av programmet
- bl inituart
- bl initGPIOB
- bl initGPIOF
- bl setcode
- start:
- bl activatealarm
- mainswitchclear:
- bl clearinput
- mainswitchget:
- push {lr}
- bl getkey
- pop {lr}
- mainswitch2:
- mov r0,#0x09
- subs r0,r4
- bmi mainswitch3
- bl addkey
- bl mainswitchget
- mainswitch3:
- mov r0,#0x0F
- subs r0,r4
- bne mainswitchclear
- bl checkcode
- mainswitch4:
- mov r0,#0x01
- subs r0,r4
- beq unlockalarm
- bl printstring
- bl start
- mainswitch5:
- bl getkey
- mov r0,#0x09
- subs r0,r4
- bmi hopp
- bl addkey
- bl mainswitch5
- hopp:
- mov r0,#0x0C
- cmp r0,r4
- bne checkifa
- bl checknewcode
- mov r1,#0x01
- subs r1,r0
- bne mainswitch5
- bl changecode
- bl mainswitch5
- checkifa:
- mov r0,#0x0A
- cmp r0,r4
- beq start
- bl mainswitch5
- ;bl getkey
- ;mov r0,#0x0A
- ;subs r0,r4
- ;bne mainswitch5
- ;bl start
- unlockalarm:
- bl deactivatealarm
- bl mainswitch5
- printstring:
- push {lr}
- .align 4
- adr r4,text
- mov r5,#15
- printloop:
- cmp r5,#0
- beq returnsub
- ldrb r0,[r4],#1
- bl printchar
- sub r5,r5,#1
- bl printloop
- returnsub:
- pop {lr}
- mov pc,lr
- text:
- .string "Felaktig kod!", 10, 13
- getkey:
- ldr r1,GPIOB_GPIODATA
- switch1:
- ldr r2,[r1]
- ands r2,r2,#0x10
- beq switch1
- ldr r2,[r1]
- and r4,r2,#0x0F
- switch2:
- ldr r2,[r1]
- ands r2,r2,#0x10
- bne switch2
- mov pc,lr
- clearinput:
- ldr r0,CODE_SLOT_A
- ldr r1,CODE_SLOT_B
- ldr r2,CODE_SLOT_C
- ldr r3,CODE_SLOT_D
- mov r4,#0xFF
- strb r4,[r0]
- strb r4,[r1]
- strb r4,[r2]
- strb r4,[r3]
- mov pc,lr
- addkey:
- ldr r0,NEW_CODE_A
- ldr r1,[r0]
- lsr r1,#8
- str r1,[r0]
- ldr r2,CODE_SLOT_A
- ldrb r3,[r2]
- ldr r0,NEW_CODE_D
- strb r3,[r0]
- ldr r3,[r2]
- lsr r3,#8
- str r3,[r2]
- ldr r3,CODE_SLOT_D
- strb r4,[r3]
- mov pc,lr
- activatealarm:
- ldr r1,GPIOF_GPIODATA
- ldr r2,[r1]
- orr r2,r2,#0x0F ;reset values
- ands r2,r2,#0x02 ;set to correct value, 2
- str r2,[r1]
- mov pc,lr
- deactivatealarm:
- ldr r1,GPIOF_GPIODATA
- ldr r2,[r1]
- orr r2,r2,#0x0F ;reset values
- ands r2,r2,#0x08 ;set to correct value, 8
- str r2,[r1]
- mov pc,lr
- setcode:
- ; correct code : 1111
- ldr r0,CORRECT_CODE_A
- ldr r1,CORRECT_CODE_B
- ldr r2,CORRECT_CODE_C
- ldr r3,CORRECT_CODE_D
- mov r4,#0x01
- mov r5,#0x01
- mov r6,#0x01
- mov r7,#0x01
- strb r4,[r0]
- strb r5,[r1]
- strb r6,[r2]
- strb r7,[r3]
- mov pc,lr
- checkcode:
- push {lr}
- ldr r0,CORRECT_CODE_A
- ldr r1,CODE_SLOT_A
- ldrb r2,[r0]
- ldrb r3,[r1]
- cmp r2,r3
- bne returncheckcode
- ldr r0,CORRECT_CODE_B
- ldr r1,CODE_SLOT_B
- ldrb r2,[r0]
- ldrb r3,[r1]
- cmp r2,r3
- bne returncheckcode
- ldr r0,CORRECT_CODE_C
- ldr r1,CODE_SLOT_C
- ldrb r2,[r0]
- ldrb r3,[r1]
- cmp r2,r3
- bne returncheckcode
- ldr r0,CORRECT_CODE_D
- ldr r1,CODE_SLOT_D
- ldrb r2,[r0]
- ldrb r3,[r1]
- cmp r2,r3
- bne returncheckcode
- mov r4,#0x01
- pop {lr}
- mov pc,lr
- returncheckcode:
- mov r4,#0x00
- pop {lr}
- mov pc,lr
- changecode:
- ldr r0,NEW_CODE_A
- ldr r1,CORRECT_CODE_A
- ldr r2,[r0]
- ldr r3,[r1]
- str r2,[r1]
- mov pc,lr
- checknewcode:
- push {lr}
- ldr r1,NEW_CODE_A
- ldr r2,CODE_SLOT_A
- ldr r3,[r1]
- ldr r5,[r2]
- cmp r3,r5
- beq returnchecknewcode
- mov r0,#0x00
- pop {lr}
- mov pc,lr
- returnchecknewcode:
- mov r0,#0x01
- pop {lr}
- mov pc,lr
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;,
- ;;;
- ;;; Allt här efter ska inte ändras
- ;;;
- ;;; Rutiner för initiering
- ;;; Se labmanual för vilka namn som ska användas
- ;;;
- .align 4
- ;; Initiering av seriekommunikation
- ;; Förstör r0, r1
- inituart:
- ldr r1,RCGCUART ; Koppla in serieport
- mov r0,#0x01
- str r0,[r1]
- ldr r1,RCGCGPIO
- ldr r0,[r1]
- orr r0,r0,#0x01
- str r0,[r1] ; Koppla in GPIO port A
- nop ; vänta lite
- nop
- nop
- ldr r1,GPIOA_GPIOAFSEL
- mov r0,#0x03
- str r0,[r1] ; pinnar PA0 och PA1 som serieport
- ldr r1,GPIOA_GPIODEN
- mov r0,#0x03
- str r0,[r1] ; Digital I/O på PA0 och PA1
- ldr r1,UART0_UARTIBRD
- mov r0,#0x08
- str r0,[r1] ; Sätt hastighet till 115200 baud
- ldr r1,UART0_UARTFBRD
- mov r0,#44
- str r0,[r1] ; Andra värdet för att få 115200 baud
- ldr r1,UART0_UARTLCRH
- mov r0,#0x60
- str r0,[r1] ; 8 bit, 1 stop bit, ingen paritet, ingen FIFO
- ldr r1,UART0_UARTCTL
- mov r0,#0x0301
- str r0,[r1] ; Börja använda serieport
- mov pc,lr
- ;; Tvinga startadress för konstanter till ordgräns
- .align 4
- ; Definitioner för registeradresser (32-bitars konstanter)
- GPIOHBCTL .field 0x400FE06C, 32
- RCGCUART .field 0x400FE618, 32
- RCGCGPIO .field 0x400fe608, 32
- UART0_UARTIBRD .field 0x4000c024, 32
- UART0_UARTFBRD .field 0x4000c028, 32
- UART0_UARTLCRH .field 0x4000c02c, 32
- UART0_UARTCTL .field 0x4000c030, 32
- UART0_UARTFR .field 0x4000c018, 32
- UART0_UARTDR .field 0x4000c000, 32
- GPIOA_GPIOAFSEL .field 0x40004420, 32
- GPIOA_GPIODEN .field 0x4000451c, 32
- GPIOB_GPIODATA .field 0x400053fc, 32
- GPIOB_GPIODIR .field 0x40005400, 32
- GPIOB_GPIOAFSEL .field 0x40005420, 32
- GPIOB_GPIOPUR .field 0x40005510, 32
- GPIOB_GPIODEN .field 0x4000551c, 32
- GPIOB_GPIOAMSEL .field 0x40005528, 32
- GPIOB_GPIOPCTL .field 0x4000552c, 32
- GPIOF_GPIODATA .field 0x4002507c, 32
- GPIOF_GPIODIR .field 0x40025400, 32
- GPIOF_GPIOAFSEL .field 0x40025420, 32
- GPIOF_GPIODEN .field 0x4002551c, 32
- GPIOF_GPIOLOCK .field 0x40025520, 32
- GPIOKEY .field 0x4c4f434b, 32
- GPIOF_GPIOPUR .field 0x40025510, 32
- GPIOF_GPIOCR .field 0x40025524, 32
- GPIOF_GPIOAMSEL .field 0x40025528, 32
- GPIOF_GPIOPCTL .field 0x4002552c, 32
- CORRECT_CODE_A .field 0x20001010, 32
- CORRECT_CODE_B .field 0x20001011, 32
- CORRECT_CODE_C .field 0x20001012, 32
- CORRECT_CODE_D .field 0x20001013, 32
- NEW_CODE_A .field 0x020001020, 32 ; adress to new code, if changing
- NEW_CODE_B .field 0x020001021, 32
- NEW_CODE_C .field 0x020001022, 32
- NEW_CODE_D .field 0x020001023, 32
- CODE_SLOT_A .field 0x20001000, 32
- CODE_SLOT_B .field 0x20001001, 32
- CODE_SLOT_C .field 0x20001002, 32
- CODE_SLOT_D .field 0x20001003, 32
- ;; Initiering av port F
- ;; Förstör r0, r1, r2
- initGPIOF:
- ldr r1,RCGCGPIO
- ldr r0,[r1]
- orr r0,r0,#0x20 ; Koppla in GPIO port F
- str r0,[r1]
- nop ; Vänta lite
- nop
- nop
- ldr r1,GPIOHBCTL ; Använd apb för GPIO
- ldr r0,[r1]
- mvn r2,#0x2f ; bit 5-0 = 0, övriga = 1
- and r0,r0,r2
- str r0,[r1]
- ldr r1,GPIOF_GPIOLOCK
- ldr r0,GPIOKEY
- str r0,[r1] ; Lås upp port F konfigurationsregister
- ldr r1,GPIOF_GPIOCR
- mov r0,#0x1f ; tillåt konfigurering av alla bitar i porten
- str r0,[r1]
- ldr r1,GPIOF_GPIOAMSEL
- mov r0,#0x00 ; Koppla bort analog funktion
- str r0,[r1]
- ldr r1,GPIOF_GPIOPCTL
- mov r0,#0x00 ; använd port F som GPIO
- str r0,[r1]
- ldr r1,GPIOF_GPIODIR
- mov r0,#0x0e ; styr LED (3 bits), andra bitar är ingångar
- str r0,[r1]
- ldr r1,GPIOF_GPIOAFSEL
- mov r0,#0 ; alla portens bitar är GPIO
- str r0,[r1]
- ldr r1,GPIOF_GPIOPUR
- mov r0,#0x11 ; svag pull-up för tryckknapparna
- str r0,[r1]
- ldr r1,GPIOF_GPIODEN
- mov r0,#0xff ; alla pinnar som digital I/O
- str r0,[r1]
- mov pc,lr
- ;; Initiering av port B
- ;; Förstör r0, r1
- initGPIOB:
- ldr r1,RCGCGPIO
- ldr r0,[r1]
- orr r0,r0,#0x02 ; koppla in GPIO port B
- str r0,[r1]
- nop ; vänta lite
- nop
- nop
- ldr r1,GPIOB_GPIODIR
- mov r0,#0x0 ; alla bitar är ingångar
- str r0,[r1]
- ldr r1,GPIOB_GPIOAFSEL
- mov r0,#0 ; alla portens bitar är GPIO
- str r0,[r1]
- ldr r1,GPIOB_GPIOAMSEL
- mov r0,#0x00 ; använd inte analoga funktioner
- str r0,[r1]
- ldr r1,GPIOB_GPIOPCTL
- mov r0,#0x00 ; använd inga specialfunktioner på port B
- str r0,[r1]
- ldr r1,GPIOB_GPIOPUR
- mov r0,#0x00 ; ingen pullup på port B
- str r0,[r1]
- ldr r1,GPIOB_GPIODEN
- mov r0,#0xff ; alla pinnar är digital I/O
- str r0,[r1]
- mov pc,lr
- ;; Utskrift av ett tecken på serieport
- ;; r0 innehåller tecken att skriva ut (1 byte)
- ;; returnerar först när tecken skickats
- ;; förstör r1 och r2
- printchar:
- ldr r1,UART0_UARTFR ; peka på serieportens statusregister
- loop1:
- ldr r2,[r1] ; hämta statusflaggor
- ands r2,r2,#0x20 ; kan ytterligare tecken skickas?
- bne loop1 ; nej, försök igen
- ldr r1,UART0_UARTDR ; ja, peka på serieportens dataregister
- str r0,[r1] ; skicka tecken
- mov pc,lr
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement