Advertisement
Guest User

lab_1

a guest
May 18th, 2018
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ARM 8.55 KB | None | 0 0
  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;
  3. ;; Mall för lab1 i TSEA28 Datorteknik Y
  4. ;;
  5. ;; 171208 K.Palmkvist
  6. ;;
  7.  
  8.     ;; Ange att koden är för thumb mode
  9.     .thumb
  10.     .text
  11.     .align 2
  12.  
  13.     ;; Ange att labbkoden startar här efter initiering
  14.     .global main
  15.    
  16. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  17. ;;  Placera programmet här
  18.  
  19. main:               ; Start av programmet
  20.    
  21.     bl      inituart
  22.     bl      initGPIOB
  23.     bl      initGPIOF
  24.  
  25.     bl      setcode
  26.  
  27. start:
  28.     bl      activatealarm
  29. mainswitchclear:
  30.     bl      clearinput
  31. mainswitchget:
  32.     push    {lr}
  33.     bl      getkey
  34.     pop     {lr}
  35. mainswitch2:
  36.     mov     r0,#0x09
  37.     subs    r0,r4
  38.     bmi mainswitch3
  39.     bl      addkey
  40.     bl  mainswitchget
  41. mainswitch3:
  42.     mov     r0,#0x0F
  43.     subs    r0,r4
  44.     bne     mainswitchclear
  45.     bl      checkcode
  46. mainswitch4:
  47.     mov     r0,#0x01
  48.     subs    r0,r4
  49.  
  50.  
  51.     beq unlockalarm
  52.     bl  printstring
  53.     bl  start
  54.  
  55. mainswitch5:
  56.  
  57.     bl      getkey
  58.     mov     r0,#0x09
  59.     subs    r0,r4
  60.     bmi     hopp
  61.     bl      addkey
  62.     bl      mainswitch5
  63.  
  64. hopp:
  65.     mov     r0,#0x0C
  66.     cmp     r0,r4
  67.     bne     checkifa
  68.     bl      checknewcode
  69.     mov     r1,#0x01
  70.     subs    r1,r0
  71.     bne     mainswitch5
  72.     bl      changecode
  73.     bl      mainswitch5
  74.  
  75. checkifa:
  76.     mov     r0,#0x0A
  77.     cmp     r0,r4
  78.     beq     start
  79.     bl      mainswitch5
  80.  
  81.     ;bl         getkey
  82.     ;mov    r0,#0x0A
  83.     ;subs   r0,r4
  84.     ;bne    mainswitch5
  85.     ;bl         start
  86.  
  87. unlockalarm:
  88.     bl      deactivatealarm
  89.     bl      mainswitch5
  90.  
  91.  
  92.  
  93. printstring:
  94.     push    {lr}
  95.     .align 4
  96.     adr     r4,text
  97.     mov     r5,#15
  98. printloop:
  99.     cmp     r5,#0
  100.     beq     returnsub
  101.     ldrb    r0,[r4],#1
  102.     bl      printchar
  103.     sub     r5,r5,#1
  104.     bl      printloop
  105. returnsub:
  106.     pop     {lr}
  107.     mov     pc,lr
  108.  
  109. text:
  110.     .string "Felaktig kod!", 10, 13
  111.  
  112. getkey:
  113.     ldr     r1,GPIOB_GPIODATA
  114. switch1:
  115.     ldr     r2,[r1]
  116.     ands    r2,r2,#0x10
  117.     beq     switch1
  118.     ldr     r2,[r1]
  119.     and     r4,r2,#0x0F
  120. switch2:
  121.     ldr     r2,[r1]
  122.     ands    r2,r2,#0x10
  123.     bne     switch2
  124.     mov     pc,lr
  125.  
  126. clearinput:
  127.     ldr r0,CODE_SLOT_A
  128.     ldr r1,CODE_SLOT_B
  129.     ldr r2,CODE_SLOT_C
  130.     ldr r3,CODE_SLOT_D
  131.  
  132.     mov r4,#0xFF
  133.  
  134.     strb r4,[r0]
  135.     strb r4,[r1]
  136.     strb r4,[r2]
  137.     strb r4,[r3]
  138.  
  139.     mov pc,lr
  140.  
  141. addkey:
  142.     ldr     r0,NEW_CODE_A
  143.     ldr     r1,[r0]
  144.     lsr     r1,#8
  145.     str     r1,[r0]
  146.     ldr     r2,CODE_SLOT_A
  147.     ldrb    r3,[r2]
  148.     ldr     r0,NEW_CODE_D
  149.     strb    r3,[r0]
  150.     ldr     r3,[r2]
  151.     lsr     r3,#8
  152.     str     r3,[r2]
  153.     ldr     r3,CODE_SLOT_D
  154.     strb    r4,[r3]
  155.     mov pc,lr
  156.  
  157. activatealarm:
  158.     ldr r1,GPIOF_GPIODATA
  159.     ldr r2,[r1]
  160.     orr r2,r2,#0x0F         ;reset values
  161.     ands r2,r2,#0x02        ;set to correct value, 2
  162.     str r2,[r1]
  163.     mov pc,lr
  164.  
  165. deactivatealarm:
  166.     ldr r1,GPIOF_GPIODATA
  167.     ldr r2,[r1]
  168.     orr r2,r2,#0x0F         ;reset values
  169.     ands r2,r2,#0x08        ;set to correct value, 8
  170.     str r2,[r1]
  171.     mov pc,lr
  172.  
  173. setcode:
  174.     ; correct code : 1111
  175.     ldr r0,CORRECT_CODE_A
  176.     ldr r1,CORRECT_CODE_B
  177.     ldr r2,CORRECT_CODE_C
  178.     ldr r3,CORRECT_CODE_D
  179.  
  180.     mov r4,#0x01
  181.     mov r5,#0x01
  182.     mov r6,#0x01
  183.     mov r7,#0x01
  184.  
  185.     strb r4,[r0]
  186.     strb r5,[r1]
  187.     strb r6,[r2]
  188.     strb r7,[r3]
  189.  
  190.     mov pc,lr
  191.  
  192. checkcode:
  193.     push {lr}
  194.     ldr r0,CORRECT_CODE_A
  195.     ldr r1,CODE_SLOT_A
  196.     ldrb r2,[r0]
  197.     ldrb    r3,[r1]
  198.     cmp r2,r3
  199.     bne returncheckcode
  200.     ldr r0,CORRECT_CODE_B
  201.     ldr r1,CODE_SLOT_B
  202.     ldrb r2,[r0]
  203.     ldrb    r3,[r1]
  204.     cmp r2,r3
  205.     bne returncheckcode
  206.     ldr r0,CORRECT_CODE_C
  207.     ldr r1,CODE_SLOT_C
  208.     ldrb r2,[r0]
  209.     ldrb r3,[r1]
  210.     cmp r2,r3
  211.     bne returncheckcode
  212.     ldr r0,CORRECT_CODE_D
  213.     ldr r1,CODE_SLOT_D
  214.     ldrb r2,[r0]
  215.     ldrb r3,[r1]
  216.     cmp r2,r3
  217.     bne returncheckcode
  218.     mov r4,#0x01
  219.     pop {lr}
  220.     mov pc,lr
  221.  
  222. returncheckcode:
  223.     mov r4,#0x00
  224.     pop {lr}
  225.     mov pc,lr
  226.  
  227.  
  228. changecode:
  229.  
  230.     ldr r0,NEW_CODE_A
  231.     ldr r1,CORRECT_CODE_A
  232.  
  233.     ldr r2,[r0]
  234.     ldr r3,[r1]
  235.  
  236.     str r2,[r1]
  237.  
  238.     mov pc,lr
  239.  
  240. checknewcode:
  241.     push {lr}
  242.     ldr r1,NEW_CODE_A
  243.     ldr r2,CODE_SLOT_A
  244.  
  245.     ldr r3,[r1]
  246.     ldr r5,[r2]
  247.  
  248.     cmp r3,r5
  249.  
  250.     beq returnchecknewcode
  251.     mov r0,#0x00
  252.     pop {lr}
  253.     mov pc,lr
  254.  
  255. returnchecknewcode:
  256.     mov r0,#0x01
  257.     pop {lr}
  258.     mov pc,lr
  259.  
  260. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;,
  261. ;;;
  262. ;;; Allt här efter ska inte ändras
  263. ;;;
  264. ;;; Rutiner för initiering
  265. ;;; Se labmanual för vilka namn som ska användas
  266. ;;;
  267.    
  268.     .align 4
  269.  
  270. ;;  Initiering av seriekommunikation
  271. ;;  Förstör r0, r1
  272.    
  273. inituart:
  274.     ldr r1,RCGCUART     ; Koppla in serieport
  275.     mov r0,#0x01
  276.     str r0,[r1]
  277.  
  278.     ldr r1,RCGCGPIO
  279.     ldr r0,[r1]
  280.     orr r0,r0,#0x01
  281.     str r0,[r1]     ; Koppla in GPIO port A
  282.  
  283.     nop         ; vänta lite
  284.     nop
  285.     nop
  286.  
  287.     ldr r1,GPIOA_GPIOAFSEL
  288.     mov r0,#0x03
  289.     str r0,[r1]     ; pinnar PA0 och PA1 som serieport
  290.  
  291.     ldr r1,GPIOA_GPIODEN
  292.     mov r0,#0x03
  293.     str r0,[r1]     ; Digital I/O på PA0 och PA1
  294.  
  295.     ldr r1,UART0_UARTIBRD
  296.     mov r0,#0x08
  297.     str r0,[r1]     ; Sätt hastighet till 115200 baud
  298.     ldr r1,UART0_UARTFBRD
  299.     mov r0,#44
  300.     str r0,[r1]     ; Andra värdet för att få 115200 baud
  301.  
  302.     ldr r1,UART0_UARTLCRH
  303.     mov r0,#0x60
  304.     str r0,[r1]     ; 8 bit, 1 stop bit, ingen paritet, ingen FIFO
  305.    
  306.     ldr r1,UART0_UARTCTL
  307.     mov r0,#0x0301
  308.     str r0,[r1]     ; Börja använda serieport
  309.  
  310.     mov pc,lr
  311.  
  312.     ;; Tvinga startadress för konstanter till ordgräns
  313.     .align 4
  314.  
  315. ; Definitioner för registeradresser (32-bitars konstanter)
  316. GPIOHBCTL   .field  0x400FE06C, 32
  317. RCGCUART    .field  0x400FE618, 32
  318. RCGCGPIO    .field  0x400fe608, 32
  319. UART0_UARTIBRD  .field  0x4000c024, 32
  320. UART0_UARTFBRD  .field  0x4000c028, 32
  321. UART0_UARTLCRH  .field  0x4000c02c, 32
  322. UART0_UARTCTL   .field  0x4000c030, 32
  323. UART0_UARTFR    .field  0x4000c018, 32
  324. UART0_UARTDR    .field  0x4000c000, 32
  325. GPIOA_GPIOAFSEL .field  0x40004420, 32
  326. GPIOA_GPIODEN   .field  0x4000451c, 32
  327. GPIOB_GPIODATA  .field  0x400053fc, 32
  328. GPIOB_GPIODIR   .field  0x40005400, 32
  329. GPIOB_GPIOAFSEL .field  0x40005420, 32
  330. GPIOB_GPIOPUR   .field  0x40005510, 32
  331. GPIOB_GPIODEN   .field  0x4000551c, 32
  332. GPIOB_GPIOAMSEL .field  0x40005528, 32
  333. GPIOB_GPIOPCTL  .field  0x4000552c, 32
  334. GPIOF_GPIODATA  .field  0x4002507c, 32
  335. GPIOF_GPIODIR   .field  0x40025400, 32
  336. GPIOF_GPIOAFSEL .field  0x40025420, 32
  337. GPIOF_GPIODEN   .field  0x4002551c, 32
  338. GPIOF_GPIOLOCK  .field  0x40025520, 32
  339. GPIOKEY     .field  0x4c4f434b, 32
  340. GPIOF_GPIOPUR   .field  0x40025510, 32
  341. GPIOF_GPIOCR    .field  0x40025524, 32
  342. GPIOF_GPIOAMSEL .field  0x40025528, 32
  343. GPIOF_GPIOPCTL  .field  0x4002552c, 32
  344.  
  345. CORRECT_CODE_A .field   0x20001010, 32
  346. CORRECT_CODE_B .field   0x20001011, 32
  347. CORRECT_CODE_C .field   0x20001012, 32
  348. CORRECT_CODE_D .field   0x20001013, 32
  349.  
  350. NEW_CODE_A .field 0x020001020, 32 ; adress to new code, if changing
  351. NEW_CODE_B .field 0x020001021, 32
  352. NEW_CODE_C .field 0x020001022, 32
  353. NEW_CODE_D .field 0x020001023, 32
  354.  
  355. CODE_SLOT_A .field  0x20001000, 32
  356. CODE_SLOT_B .field  0x20001001, 32
  357. CODE_SLOT_C .field  0x20001002, 32
  358. CODE_SLOT_D .field  0x20001003, 32
  359.  
  360.  
  361. ;; Initiering av port F
  362. ;; Förstör r0, r1, r2
  363. initGPIOF:
  364.     ldr r1,RCGCGPIO
  365.     ldr r0,[r1]
  366.     orr r0,r0,#0x20     ; Koppla in GPIO port F
  367.     str r0,[r1]
  368.     nop             ; Vänta lite
  369.     nop
  370.     nop
  371.  
  372.     ldr r1,GPIOHBCTL    ; Använd apb för GPIO
  373.     ldr r0,[r1]
  374.     mvn r2,#0x2f        ; bit 5-0 = 0, övriga = 1
  375.     and r0,r0,r2
  376.     str r0,[r1]
  377.  
  378.     ldr r1,GPIOF_GPIOLOCK
  379.     ldr r0,GPIOKEY
  380.     str r0,[r1]     ; Lås upp port F konfigurationsregister
  381.  
  382.     ldr r1,GPIOF_GPIOCR
  383.     mov r0,#0x1f        ; tillåt konfigurering av alla bitar i porten
  384.     str r0,[r1]
  385.  
  386.     ldr r1,GPIOF_GPIOAMSEL
  387.     mov r0,#0x00        ; Koppla bort analog funktion
  388.     str r0,[r1]
  389.  
  390.     ldr r1,GPIOF_GPIOPCTL
  391.     mov r0,#0x00        ; använd port F som GPIO
  392.     str r0,[r1]
  393.  
  394.     ldr r1,GPIOF_GPIODIR
  395.     mov r0,#0x0e        ; styr LED (3 bits), andra bitar är ingångar
  396.     str r0,[r1]
  397.  
  398.     ldr r1,GPIOF_GPIOAFSEL
  399.     mov r0,#0       ; alla portens bitar är GPIO
  400.     str r0,[r1]
  401.  
  402.     ldr r1,GPIOF_GPIOPUR
  403.     mov r0,#0x11        ; svag pull-up för tryckknapparna
  404.     str r0,[r1]
  405.  
  406.     ldr r1,GPIOF_GPIODEN
  407.     mov r0,#0xff        ; alla pinnar som digital I/O
  408.     str r0,[r1]
  409.  
  410.     mov pc,lr
  411.  
  412.  
  413. ;; Initiering av port B
  414. ;; Förstör r0, r1
  415. initGPIOB:
  416.     ldr r1,RCGCGPIO
  417.     ldr r0,[r1]
  418.     orr r0,r0,#0x02     ; koppla in GPIO port B
  419.     str r0,[r1]
  420.     nop         ; vänta lite
  421.     nop
  422.     nop
  423.  
  424.     ldr r1,GPIOB_GPIODIR
  425.     mov r0,#0x0     ; alla bitar är ingångar
  426.     str r0,[r1]
  427.  
  428.     ldr r1,GPIOB_GPIOAFSEL
  429.     mov r0,#0       ; alla portens bitar är GPIO
  430.     str r0,[r1]
  431.  
  432.     ldr r1,GPIOB_GPIOAMSEL
  433.     mov r0,#0x00        ; använd inte analoga funktioner
  434.     str r0,[r1]
  435.  
  436.     ldr r1,GPIOB_GPIOPCTL
  437.     mov r0,#0x00        ; använd inga specialfunktioner på port B
  438.     str r0,[r1]
  439.  
  440.     ldr r1,GPIOB_GPIOPUR
  441.     mov r0,#0x00        ; ingen pullup på port B
  442.     str r0,[r1]
  443.  
  444.     ldr r1,GPIOB_GPIODEN
  445.     mov r0,#0xff        ; alla pinnar är digital I/O
  446.     str r0,[r1]
  447.  
  448.     mov pc,lr
  449.  
  450.  
  451. ;; Utskrift av ett tecken på serieport
  452. ;; r0 innehåller tecken att skriva ut (1 byte)
  453. ;; returnerar först när tecken skickats
  454. ;; förstör r1 och r2
  455. printchar:
  456.     ldr r1,UART0_UARTFR     ; peka på serieportens statusregister
  457. loop1:
  458.     ldr r2,[r1]         ; hämta statusflaggor
  459.     ands r2,r2,#0x20        ; kan ytterligare tecken skickas?
  460.     bne loop1           ; nej, försök igen
  461.     ldr r1,UART0_UARTDR     ; ja, peka på serieportens dataregister
  462.     str r0,[r1]         ; skicka tecken
  463.     mov pc,lr
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement