Advertisement
Guest User

lab_2

a guest
May 18th, 2018
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ARM 15.34 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. loop_1s:
  51.     mov r1, #1000
  52.     bl  DELAY
  53.     bl  SKBAK
  54.     b   loop_1s ; Ta bort
  55.  
  56.  
  57.     .align 0x100    ; Starta avbrottrutin för GPIO port D pÃ¥ en adress som slutar med tvÃ¥ nollor
  58. ;**********************************************
  59. ;*
  60. ;* Placera din avbrottrutin för GPIO port D här
  61. ;*
  62. intgpiod:
  63.     ; Här ska avbrottrutin aktiverad av port D finnas
  64.  
  65.     push {lr}
  66.  
  67.     ; nollställ avbrott
  68.     ldr r1,GPIOD_base
  69.     mov r0,#0xff    ; clear interrupts
  70.     str r0,[r1,#GPIOICR]
  71.  
  72.     bl  SKAVH
  73.     pop {lr}
  74.     bx lr
  75.  
  76.  
  77.     .align 0x100    ; Placera rutinen nedan i programminnet pÃ¥ en adress som slutar med 00
  78. ;***********************************************
  79. ;*
  80. ;* Placera din avbrottsrutin för GPIO port F här
  81. ;*
  82. intgpiof:
  83.     ; Här ska avbrottrutin aktiverad av port D finnas
  84.  
  85.     ; nollställ avbrott
  86.     ldr r1,GPIOF_base
  87.     mov r0,#0xff    ; clear interrupts
  88.     str r0,[r1,#GPIOICR]
  89.  
  90.     push {lr}
  91.     bl  SKAVV
  92.     pop {lr}
  93.     bx lr
  94.  
  95.  
  96.     .align 0x100    ; Placera i programminnet pÃ¥ en adress som slutar med 00
  97. ;*******************************************************************************************************
  98. ;*
  99. ;* Subrutiner och definition. Inget som ska behöva ändras i labben, däremot kan ni använda eller lägga
  100. ;* till definitioner i tabellen nedan.
  101. ;*
  102.  
  103. ;   inituart
  104. ;   Destroys r0, r1
  105. ;   inituart (assume almost all is default: no analog activated, UART0 already enabled by default) Could add code to check and setup if not correct
  106. ;   NOTE: Drawback with this approach: unsure if reset of cpu works!
  107. ;   enable UART0 (clock gating) (set 1 in bit 0 in RCGCUART at 0x400F.E000, offset 0x618)
  108.  
  109. ;*****************************************************
  110. ;*
  111. ;* Konstanter som lagras i programminnet
  112. ;*
  113. ;* Används tillsammans med offset konstanterna nedan
  114. ;*
  115. ;*****************************************************
  116. UART0_base  .field  0x4000c000, 32  ; Startadress för UART
  117.  
  118. GPIOA_base  .field  0x40004000, 32  ; General Purpose IO port A startadress
  119. GPIOB_base  .field  0x40005000, 32  ; General Purpose IO port B startadress
  120. GPIOC_base  .field  0x40006000, 32  ; General Purpose IO port C startadress
  121. GPIOD_base  .field  0x40007000, 32  ; General Purpose IO port D startadress
  122. GPIOE_base  .field  0x40024000, 32  ; General Purpose IO port E startadress
  123. GPIOF_base  .field  0x40025000, 32  ; General Purpose IO port F startadress
  124.  
  125. GPIO_HBCTL  .field  0x400FE06C, 32  ; GPIO bussval
  126.  
  127. NVIC_base   .field  0xe000e000, 32  ; Nested Vectored Interrupt Controller
  128.  
  129. GPIO_KEY    .field  0x4c4f434b, 32  ; Nyckelvärde för upplÃ¥sning av konfiguration
  130.  
  131. RCGCUART    .field  0x400FE618, 32  ; Starta UART portar
  132. RCGCGPIO    .field  0x400fe608, 32  ; Starta GPIO portar
  133.  
  134. ;*****************************************************
  135. ; Konstanter som inte lagras i programminnet
  136. ;
  137. ; Används som offset tillsammans med base-definitioner
  138. ; ovan.
  139. ;*****************************************************
  140. UARTDR      .equ    0x0000  ; Data register
  141. UARTFR      .equ    0x0018  ; Flag register
  142. UARTIBRD    .equ    0x0024  ; Baud rate styrning1
  143. UARTFBRD    .equ    0x0028  ; Baud rate styrning2
  144. UARTLCRH    .equ    0x002c  ;
  145. UARTCTL     .equ    0x0030  ; Control register
  146.  
  147.  
  148.  
  149. ;------------------- our variables -------------------;
  150. GPIOB_GPIODATA  .field  0x400053fc, 32
  151. ;------------------- our variables -------------------;
  152.  
  153.  
  154.  
  155. GPIODATA    .equ    0x0000  ; Data register
  156. GPIODIR     .equ    0x0400  ; Direction select
  157. GPIOIS      .equ    0x0404  ; interrupt sense
  158. GPIOIBE     .equ    0x0408  ; interrupt both edges
  159. GPIOIEV     .equ    0x040c  ; interrupt event
  160. GPIOIM      .equ    0x0410  ; interrupt mask
  161. GPIORIS     .equ    0x0414  ; raw interrupt status
  162. GPIOMIS     .equ    0x0418  ; masked interrupt status
  163. GPIOICR     .equ    0x041c  ; interrupt clear
  164. GPIOAFSEL   .equ    0x0420  ; alternate function select
  165. GPIODR2R    .equ    0x0500  ; 2 mA Drive select
  166. GPIODR4R    .equ    0x0504  ; 4 mA Drive select
  167. GPIODR8R    .equ    0x0508  ; 8 mA Drive select
  168. GPIOODR     .equ    0x050c  ; Open drain select
  169. GPIOPUR     .equ    0x510   ; pull-up select
  170. GPIOPDR     .equ    0x514   ; pull-down select
  171. GPIOSLR     .equ    0x518   ; slew rate control select
  172. GPIODEN     .equ    0x51c   ; digital enable
  173. GPIOLOCK    .equ    0x520   ; lock register
  174. GPIOCR      .equ    0x524   ; commit
  175. GPIOAMSEL   .equ    0x528   ; analog mode select
  176. GPIOPCTL    .equ    0x52c   ; port control
  177.  
  178. NVIC_EN0    .equ    0x100   ; Enable avbrott 0-31
  179. NVIC_PRI0   .equ    0x400   ; Styr prioritet avbrott 0-3
  180. NVIC_PRI1   .equ    0x404   ; Styr prioritet avbrott 4-7
  181. NVIC_PRI7   .equ    0x41c   ; Styr prioritet avbrott 28-31
  182. NVIC_PRI12  .equ    0x430   ; Styr prioritet avbrott 48-51
  183.  
  184. Bakgrundstext   .string "Bakgrundsprogram",13,10,0
  185. Lefttext    .string "    AVBROTT v",0xe4, "nster",13,10,0
  186. Leftstar    .string "          *",13,10,0
  187. Righttext   .string "              AVBROTT h",0xf6, "ger",13,10,0
  188. Rightstar   .string "                    *",13,10,0
  189.  
  190.     .align 2
  191.  
  192. ;* SKBAK: Skriver ut texten "Bakgrundsprogram" i långsam fart
  193. ;* Förstör r3, r2, r1, r0
  194. SKBAK:
  195.     cpsid   i
  196.     push {lr}
  197.     adr r3,Bakgrundstext
  198.     bl  slowprintstring
  199.     pop {lr}
  200.     cpsie i
  201.     bx  lr
  202.  
  203.  
  204. ;* SKAVV: Skriver ut texten "Avbrott vänster" följt av 5 rader med en stjärna
  205. ;* Förstör r3, r2, r1, r0
  206. SKAVV:
  207.     adr r3,Lefttext
  208.     push {lr}
  209.     bl  slowprintstring
  210.     mov r2,#5
  211. leftloop:
  212.     mov r1,#600
  213.     bl  DELAY
  214.     adr r3,Leftstar
  215.     bl  slowprintstring
  216.     subs r2,r2,#1
  217.     bne leftloop
  218.     pop {lr}
  219.     bx  lr
  220.  
  221. ;* SKAVH: Skriver ut texten "Avbrott höger" följt av 5 rader med en stjärna
  222. ;* Förstör r3, r2, r1, r0
  223. SKAVH:
  224.     adr r3,Righttext
  225.     push {lr}
  226.     bl  slowprintstring
  227.     mov r2,#5
  228. rightloop:
  229.     mov r1,#600
  230.     bl  DELAY
  231.     adr r3,Rightstar
  232.     bl  slowprintstring
  233.     subs r2,r2,#1
  234.     bne rightloop
  235.     pop {lr}
  236.     bx  lr
  237.  
  238. ;* DELAY:
  239. ;* r1 = antal ms, förstör r1
  240. DELAY:
  241.     push {r0}
  242. loop_millisecond:
  243.     mov r0,#0x1300   ;CHANGE IT BACK TO #0x1300
  244. loop_delay:
  245.     subs r0,r0,#1
  246.     bne loop_delay
  247.     subs r1,r1,#1
  248.     bne loop_millisecond
  249.     pop {r0}
  250.     bx  lr
  251.  
  252. ;* inituart: Sätter upp seriell kommunikation (starta UART0, sätt baudrate 115200, 8N1 format)
  253. inituart:
  254.     ldr r1,RCGCUART
  255.     ldr r0,[r1]
  256.     orr r0,#0x01
  257.     str r0,[r1]
  258.  
  259. ;   aktivera  GPIO Port A
  260.     ldr r1,RCGCGPIO
  261.     ldr r0,[r1]
  262.     orr r0,#0x01
  263.     str r0,[r1]
  264.  
  265.     nop
  266.     nop
  267.     nop
  268.  
  269. ;   Anslut pin 0 och 1 pÃ¥ GPIO port A till UART function (förvalt redan för UART0)
  270. ;   TillÃ¥t alt funktion och slÃ¥ pÃ¥ digital I/O pÃ¥ port A pin 0 och 1
  271.     ldr r1,GPIOA_base
  272.     ldr r0,[r1,#GPIOAFSEL]
  273.     orr r0,#0x03
  274.     str r0,[r1,#GPIOAFSEL]
  275.  
  276.     ldr r0,[r1,#GPIODEN]
  277.     orr r0,#0x03
  278.     str r0,[r1,#GPIODEN]
  279.  
  280. ;   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
  281. ;      Slutlig inställning av klocka för uart:
  282. ;         8 till UARTIBRD (bit 15 till 0 i UARTIBRD)
  283.     ldr r1,UART0_base
  284.     mov r0,#0x08
  285.     str r0,[r1,#UARTIBRD]
  286.  
  287. ;        44 till UARTFBRD (bit 5 to 0 i UARTFBRD)
  288.     mov r0,#44
  289.     str r0,[r1,#UARTFBRD]
  290.  
  291. ;   initiera 8 bit, ingen FIFO buffert, 1 stop bit, ingen paritetsbit (0x60 to bit 7 till 0 i UARTLCRH)
  292.     mov r0,#0x60
  293.     str r0,[r1,#UARTLCRH]
  294.  
  295. ;   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)
  296.  
  297.     mov r0,#0x0301
  298.     str r0,[r1,#UARTCTL]
  299.  
  300.     bx  lr
  301.  
  302.     .align 0x10
  303.  
  304. ; initGPIOB, sätt GPIO port B pin 7 till 0 som utgångar
  305. ; förstör r0, r1
  306. initGPIOB:
  307.     ldr r1,RCGCGPIO
  308.     ldr r0,[r1]
  309.     orr r0,#0x02    ; Aktivera GPIO port B
  310.     str r0,[r1]
  311.     nop  ; 5 klockcykler innan porten fÃ¥r användas
  312.     nop
  313.     nop
  314.  
  315.     ldr r1,GPIO_HBCTL   ; Välj bus för GPIOB
  316.     ldr r0,[r1]
  317.     bic r0,#0x02       ; välj apb bus för GPIOB (nollställ bit 1)
  318.     str r0,[r1]
  319.  
  320.     ldr r1,GPIOB_base
  321.     mov r0,#0xff    ; alla pinnar är utgÃ¥ngar
  322.     str r0,[r1,#GPIODIR]
  323.  
  324.     mov r0,#0       ; alla pinnar fungerar som GPIO-port
  325.     str r0,[r1,#GPIOAFSEL]
  326.  
  327.     mov r0,#0x00    ; Förhindra analog funktion
  328.     str r0,[r1,#GPIOAMSEL]
  329.  
  330.     mov r0,#0x00    ; Använd port B som GPIO utan speciella funktioner
  331.     str r0,[r1,#GPIOPCTL]
  332.  
  333.     mov r0,#0x00    ; Inga pullup pinnar pÃ¥ port B
  334.     str r0,[r1,#GPIOPUR]
  335.  
  336.     mov r0,#0xff    ; alla pinnar är digital I/O
  337.     str r0,[r1,#GPIODEN]
  338.  
  339.     bx  lr
  340.  
  341.  
  342. ; initGPIOD, sätt pinnar 2,3,6,7 som ingångar
  343. ; destroy r0, r1
  344. initGPIOD:
  345.     ldr r1,RCGCGPIO
  346.     ldr r0,[r1]
  347.     orr r0,#0x08    ; aktivera GPIO port D clocking
  348.     str r0,[r1]
  349.     nop  ; 5 klockcykler innan porten kan användas
  350.     nop
  351.     nop
  352.  
  353.     ldr r1,GPIO_HBCTL   ; använd inte ahb för GPIOD
  354.     ldr r0,[r1]
  355.     bic r0,#0x08       ; använd apb bus för GPIOD
  356.     str r0,[r1]
  357.  
  358.     ldr r1,GPIOD_base
  359.     ldr r0,GPIO_KEY
  360.     str r0,[r1,#GPIOLOCK]       ; lÃ¥s upp port F configurationsregister
  361.  
  362.     mov r0,#0xcc    ; tillÃ¥t de 4 pinnarna i porten att konfigureras
  363.     str r0,[r1,#GPIOCR]
  364.  
  365.     mov r0,#0x0     ; alla som ingÃ¥ngar
  366.     str r0,[r1,#GPIODIR]
  367.  
  368.     mov r0,#0       ; alla portens bitar som GPIO
  369.     str r0,[r1,#GPIOAFSEL]
  370.  
  371.     mov r0,#0x00    ; förhindra analog funktionalitet
  372.     str r0,[r1,#GPIOAMSEL]
  373.  
  374.     mov r0,#0x00    ; använd port D som GPIO utan speciella funktioner
  375.     str r0,[r1,#GPIOPCTL]
  376.  
  377.     mov r0,#0x00    ; Ingen pullup pÃ¥ port D
  378.     str r0,[r1,#GPIOPUR]
  379.  
  380.     mov r0,#0xff    ; alla pinnar som digital I/O
  381.     str r0,[r1,#GPIODEN]
  382.  
  383.     bx  lr
  384.  
  385. ; initGPIOE, sätt pinnar bit 0-5 som utgångar
  386. ; destroy r0, r1
  387. initGPIOE:
  388.     ldr r1,RCGCGPIO
  389.     ldr r0,[r1]
  390.     orr r0,#0x10    ; aktivera GPIO port E
  391.     str r0,[r1]
  392.     nop  ; 5 klockcykler innan porten används
  393.     nop
  394.     nop
  395.  
  396.     ldr r1,GPIO_HBCTL   ; Använd inte ahb (high performance bus) för GPIOE
  397.     ldr r0,[r1]
  398.     bic r0,#0x10       ; använd apb bus for GPIOE
  399.     str r0,[r1]
  400.  
  401.     mov r0,#0x3f        ; alla pinnar ska vara utgÃ¥ngar
  402.     str r0,[r1,#GPIODIR]
  403.  
  404.     mov r0,#0       ; alla portens bitar som GPIO
  405.     str r0,[r1,#GPIOAFSEL]
  406.  
  407.     mov r0,#0x00    ; förhindra analog funktionalitet
  408.     str r0,[r1,#GPIOAMSEL]
  409.  
  410.     mov r0,#0x00    ; använd port E som GPIO utan speciell funktionailtet
  411.     str r0,[r1,#GPIOPCTL]
  412.  
  413.     mov r0,#0x00    ; Ingen pullup pÃ¥ port E
  414.     str r0,[r1,#GPIOPUR]
  415.  
  416.     mov r0,#0x3f    ; alla pinnar som digital I/O
  417.     str r0,[r1,#GPIODEN]
  418.  
  419.     bx  lr
  420.  
  421.  
  422. ; initGPIOF, sätt pin 0-3 som utgångar, pin 4 som ingång med pullup
  423. ; förstör r0, r1
  424.  
  425. initGPIOF:
  426.     ldr r1,RCGCGPIO
  427.     ldr r0,[r1]
  428.     orr r0,#0x20    ; aktivera GPIO port F
  429.     str r0,[r1]
  430.     nop  ; 5 klockcykler innan porten kan användas
  431.     nop
  432.     nop
  433.  
  434.     ldr r1,GPIO_HBCTL   ; Välj bustyp för GPIOF
  435.     ldr r0,[r1]
  436.     bic r0,#0x20    ; välj GPIOF port ansluten till apb bus
  437.     str r0,[r1]
  438.  
  439.     ldr r1,GPIOF_base
  440.     ldr r0,GPIO_KEY
  441.     str r0,[r1,#GPIOLOCK]       ; lÃ¥s upp port F configurationsregister
  442.  
  443.     mov r0,#0x1f    ; tillåẗ alla 5 bitarna bli konfigurerade
  444.     str r0,[r1,#GPIOCR]
  445.  
  446.     mov r0,#0x00    ; förhindra analog function
  447.     str r0,[r1,#GPIOAMSEL]
  448.  
  449.     mov r0,#0x00    ; använd port F som GPIO
  450.     str r0,[r1,#GPIOPCTL]
  451.  
  452.     mov r0,#0x0f    ; använd bit 0-3 som utgÃ¥ngar (Tryck INTE pÃ¥ högra svarta knappen pÃ¥ Darma!)
  453.     str r0,[r1,#GPIODIR]
  454.  
  455.     mov r0,#0       ; alla pinnar ska vara GPIO
  456.     str r0,[r1,#GPIOAFSEL]
  457.  
  458.     mov r0,#0x10    ; svag pull-up för switch ingÃ¥ng
  459.     str r0,[r1,#GPIOPUR]
  460.  
  461.     mov r0,#0xff    ; alla pinnar som  digitala I/O
  462.     str r0,[r1,#GPIODEN]
  463.  
  464.     bx  lr
  465.  
  466.  
  467. ; initint, initiera avbrottshanteringen
  468. ; förstör r0,r1
  469. ; Tillåt avbrott från pin 7 port D och pin 4 port F
  470. initint:
  471.     ; TillÃ¥t inte avbrott
  472.     cpsid   i
  473.  
  474.     ; Generera avbrott frÃ¥n port D, GPIO port D är avbrott nr 3 (vector 19)
  475.     ; positiv flank, hög prioritet pÃ¥ avbrott
  476.  
  477.     ; Generera avbrott frÃ¥n port F, GPIO port F är avbrott nr 30 (vector 46)
  478.     ; positiv flank, lÃ¥g prioritet pÃ¥ avbrott
  479.  
  480.     ; avbrott aktiveras pÃ¥ insignalens flank
  481.     ldr r1,GPIOF_base
  482.     mov r0,#0x00    ; edge detection
  483.     str r0,[r1,#GPIOIS]
  484.  
  485.     ; nollställ avbrott
  486.     mov r0,#0xff    ; clear interrupts
  487.     str r0,[r1,#GPIOICR]
  488.  
  489.     ; Endast stigande flank (ignorera fallande flank)
  490.     mov r0,#0x00    ; Use IEV to control
  491.     str r0,[r1,#GPIOIBE]
  492.  
  493.     mov r0,#0x10    ; stigande flank
  494.     str r0,[r1,#GPIOIEV]
  495.  
  496.     ; nollställ avbrott
  497.     mov r0,#0xff    ; clear interrupts
  498.     str r0,[r1,#GPIOICR]
  499.  
  500.     ; tillÃ¥t avbrott frÃ¥n bit 4
  501.     mov r0,#0x10    ; Send interrupt to controller
  502.     str r0,[r1,#GPIOIM]
  503.  
  504.     ; NVIC_priority interrupt 30 (
  505.     ldr r1,NVIC_base
  506.     ldr r0,[r1,#NVIC_PRI7]      ; Set priority 5
  507.     mvn r2,#0x00e00000  ; nollställ bit 23 till 21
  508.     and r0,r2
  509.     orr r0,#0x00a00000
  510.     str r0,[r1,#NVIC_PRI7]
  511.  
  512.     ; NVIC_enable tillÃ¥t avbrott nr 30 (port F)
  513.     ldr r0,[r1,#NVIC_EN0]
  514.     orr r0,#0x40000000
  515.     str r0,[r1,#NVIC_EN0]
  516.  
  517.     ; avbrott aktiveras av stigande flank
  518.     ldr r1,GPIOD_base
  519.     mov r0,#0x00    ; edge detection
  520.     str r0,[r1,#GPIOIS]
  521.  
  522.     ; nollställ avbrott
  523.     mov r0,#0xff    ; clear interrupts
  524.     str r0,[r1,#GPIOICR]
  525.  
  526.     ; ignorera fallande flank
  527.     mov r0,#0x00    ; Use IEV to control
  528.     str r0,[r1,#GPIOIBE]
  529.  
  530.     ; stigande flank edge
  531.     mov r0,#0xcc    ; rising edge
  532.     str r0,[r1,#GPIOIEV]
  533.  
  534.     ;clear interrupts
  535.     mov r0,#0xff    ; clear interrupts
  536.     str r0,[r1,#GPIOICR]
  537.  
  538.     ; tillÃ¥t avbrott frÃ¥n bit 7
  539.     mov r0,#0x80    ; Send interrupt to controller
  540.     str r0,[r1,#GPIOIM]
  541.  
  542.     ; NVIC_priority avbrott
  543.     ldr r1,NVIC_base
  544.     ldr r0,[r1,#NVIC_PRI0]      ; Set priority 2
  545.     bic r0,r0,#0xe0000000       ; nollställ bit 31-29
  546.     orr r0,r0,#0x40000000
  547.     str r0,[r1,#NVIC_PRI0]
  548.  
  549.     ; NVIC_enable port D avbrott
  550.     ldr r0,[r1,#NVIC_EN0]
  551.     orr r0,#0x00000008          ; tillÃ¥t avbrott nr 3
  552.     str r0,[r1,#NVIC_EN0]
  553.  
  554.     ; enable interrupts
  555.     cpsie   i
  556.  
  557.     bx  lr
  558.  
  559.  
  560. ; Startadress i r3, sträng avslutas med värdet 0
  561. ; förstör r0, r1, r3
  562. slowprintstring:
  563.     push {lr}
  564. nextchar:
  565.     ldrb r0,[r3],#1
  566.     cmp r0,#0
  567.     beq slowprintstringdone
  568.     bl printchar
  569.     mov r1,#40   ;CHANGE IT BACK TO #40
  570.     bl DELAY
  571.     b   nextchar
  572. slowprintstringdone:
  573.     pop {lr}
  574.     bx lr
  575.  
  576. printchar:
  577. ;   Skriv ut tecken placerat i r0
  578. ;   Läs bit 5 (TXFF) i UART0_FR, vänta tills den blivit 0
  579. ;   skriv bit 7-0 i UART0_DR
  580.     push {r1}
  581. loop1:
  582.     ldr r1,UART0_base
  583.     ldr r1,[r1,#UARTFR]
  584.     ands r1,#0x20       ; Kontrollera om sändarbuffert är full
  585.     bne loop1           ; Hopp om full
  586.     ldr r1,UART0_base
  587.     str r0,[r1,#UARTDR] ; Skicka tecken
  588.     pop {r1}
  589.     bx lr
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement