Advertisement
Guest User

lab_3

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