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
- ;* 180219 Fix initGPIOE, GPIODATA def
- ;*
- ;*
- ;* 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
- ;*
- .align 4
- main:
- bl inituart
- bl initGPIOB
- bl initGPIOD
- bl initGPIOE
- bl initGPIOF
- bl initint
- cpsid i
- ; clear E port
- ldr r1,GPIOE_GPIODATA
- ;ldr r10,OFFSET_COUNTER
- ;mov r9,#0x00
- mov r10,#0x00
- str r10,[r1]
- ; clear timer
- ldr r0,DIGIT_0
- mov r1,#0x00
- str r1,[r0]
- cpsie i
- mainloop: ; Ta bort
- WFI
- b mainloop ; Ta bort
- MUX:
- push {lr}
- ldr r1,GPIOE_GPIODATA
- cmp r10,#0x04 ;r10 lagrar vilket segment vi är på
- bne continue ;om r10 inte är 4 fortsätter vi rita nästa segment
- bl reset_r10 ;om r10 är 4 börjar vi om på första segmentet
- continue:
- ;ldr r2,DIGIT_0 kanske inte behövs ;ladda adress för alla segment
- ;ldrb r1,[r2,#r10] ;ladda byte för segmentet vi är på mha offset
- bl set_number ;
- ldr r1,GPIOE_GPIODATA ;ladda in GPIO E adress
- strb r10,[r1] ;sätt värdet på port E till r10 för visa siffra på rätt segment
- add r10,r10,#0x01 ;inkrementera r10 med för att komma till nästa segment
- pop {lr}
- bx lr
- finish_MUX:
- pop {lr}
- bx lr
- ; takes an argument inside of r10
- set_number:
- push {lr}
- ldr r1,DIGIT_0 ;hämta adress till alla segmenten
- add r2,r1,r10 ;r2 får något värde 2000100x beroende på vad r10 är
- adr r3,SJUSEGTAB ;japp
- ldrb r5,[r2] ;laddar värde av r2
- add r3,r3,r5 ;reference to an adress from the chart
- ldrb r4,[r3] ;reference to a value from the chart
- ldr r5,GPIOB_GPIODATA ;
- strb r4,[r5] ;load a number to PORT B
- pop {lr}
- bx lr
- reset_r10:
- push {lr}
- mov r10,#0x00
- pop {lr}
- bx lr
- BCD:
- push {lr}
- ldr r0,DIGIT_0
- ldrb r1,[r0]
- add r1,#0x01
- cmp r1,#0x0A
- beq digit_2_sub
- strb r1,[r0]
- b exit_sub_f
- digit_2_sub:
- ; zero out digit at index 0
- ldr r0,DIGIT_0
- mov r1,#0x00
- strb r1,[r0]
- ldr r0,DIGIT_1
- ldrb r1,[r0]
- add r1,#0x01
- cmp r1,#0x06
- beq digit_3_sub
- strb r1,[r0]
- b exit_sub_f
- digit_3_sub:
- ; zero out digit at index 1
- ldr r0,DIGIT_1
- mov r1,#0x00
- strb r1,[r0]
- ldr r0,DIGIT_2
- ldrb r1,[r0]
- add r1,#0x01
- cmp r1,#0x0A
- beq digit_4_sub
- strb r1,[r0]
- b exit_sub_f
- digit_4_sub:
- ; zero out digit at index 1
- ldr r0,DIGIT_2
- mov r1,#0x00
- strb r1,[r0]
- ldr r0,DIGIT_3
- ldrb r1,[r0]
- add r1,#0x01
- cmp r1,#0x06
- beq clear_timer
- strb r1,[r0]
- b exit_sub_f
- clear_timer:
- ldr r0,DIGIT_0
- mov r1,#0x00
- str r1,[r0]
- b exit_sub_f
- exit_sub_f:
- 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:
- ldr r1,GPIOD_base
- mov r0,#0xff ; clear interrupts
- str r0,[r1,#GPIOICR]
- push {lr}
- bl MUX
- pop {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:
- ; Här ska avbrottsrutin aktiverad av port F finnas
- ldr r1,GPIOF_base
- mov r0,#0xff ; clear interrupts
- str r0,[r1,#GPIOICR]
- push {lr}
- bl BCD
- 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
- ; ***********************************************
- ; chart of numbers
- SJUSEGTAB .byte 0x3F ; 0
- .byte 0x06 ; 1
- .byte 0x5B ; 2
- .byte 0x4F ; 3
- .byte 0x66 ; 4
- .byte 0x6D ; 5
- .byte 0x7D ; 6
- .byte 0x07 ; 7
- .byte 0x7F ; 8
- .byte 0x6F ; 9
- ;***************************************************
- ; Our variables
- ;***************************************************
- GPIOB_GPIODATA .field 0x400053fc, 32
- GPIOE_GPIODATA .field 0x4002407c, 32
- GPIOF_GPIODATA .field 0x4002507c, 32
- DIGIT_0 .field 0x20001000, 32
- DIGIT_1 .field 0x20001001, 32
- DIGIT_2 .field 0x20001002, 32
- DIGIT_3 .field 0x20001003, 32
- OFFSET_COUNTER .field 0x20001010, 32
- ;INDEX_0 .field 0x20001010, 32
- ;INDEX_1 .field 0x20001011, 32
- ;INDEX_2 .field 0x20001012, 32
- ;INDEX_3 .field 0x20001013, 32
- ;*****************************************************
- ; 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
- GPIODATA .equ 0x03fc ; 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:
- push {lr}
- adr r3,Bakgrundstext
- bl slowprintstring
- pop {lr}
- 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
- 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]
- ldr r1,GPIOE_base
- 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
- 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