0% found this document useful (0 votes)
104 views16 pages

COS10004 Lecture 8.1 LED Flash (Part 1) - Pulling A GPIO Pin Low

This document discusses pulling a GPIO pin low to turn off an LED by writing to the appropriate GPIO register. It explains that pulling a pin low is similar to pulling it high, which involves writing a 1 to the correct bit position in the GPIO register that controls writing 0s. Implementing a delay between turning the LED on and off requires using a busy wait timer with a comparison and loop, which will be covered in the next lecture.

Uploaded by

Hồ Thành An
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
104 views16 pages

COS10004 Lecture 8.1 LED Flash (Part 1) - Pulling A GPIO Pin Low

This document discusses pulling a GPIO pin low to turn off an LED by writing to the appropriate GPIO register. It explains that pulling a pin low is similar to pulling it high, which involves writing a 1 to the correct bit position in the GPIO register that controls writing 0s. Implementing a delay between turning the LED on and off requires using a busy wait timer with a comparison and loop, which will be covered in the next lecture.

Uploaded by

Hồ Thành An
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 16

COS10004 Computer Systems

Lecture 8.1 Arm ASM – LED Flash (part 1) -


pulling a GPIO pin low

Dr Chris McCarthy
OUR ARM ASM AGENDA
–  assignment (mov, ldr)
–  arithmetic (add, sub, mul, div)
–  labels, branch (b)
–  registers, GPIO
–  selection (cmp, tst)
–  functions, parameters (bl)
–  stack (push, pop)
–  building up immediate constants
–  ARM timer
–  Turn on|off GPIO (gpio.s) (OK01, OK02)
25/9/20 COS10004 Computer Systems 2
FROM WEEK 7

See https://www.youtube.com/watch?v=Rd9kvVs1lSQ for my tutorial on wiring this


circuit
TURNING ON AN LED
BASE = $FE000000 ; $ means HEX
GPIO_OFFSET=$200000

mov r0,BASE
orr r0,GPIO_OFFSET ;r0 now equals 0xFE200000

mov r1,#1
lsl r1,#24 ;write 1 into r1, lsl 24 times to move the 1 to bit 24
str r1,[r0,#4] ;write it into 5th (16/4+1)block of function register

mov r1,#1
lsl r1,#18 ;write 1 into r1, lsl 18 times to move the 1 to bit 18
str r1,[r0,#28] ;write it into first block of pull-up register

loop$:
b loop$ ;loop forever
TURNING ON AN LED
BASE = $FE000000 ; $ means HEX
GPIO_OFFSET=$200000

mov r0,BASE
What about these numbers ?
orr r0,GPIO_OFFSET ;r0 now equals 0xFE200000
Where did they come from
mov r1,#1 And what do they mean ?
lsl r1,#24 ;write 1 into r1, lsl 24 times to move the 1 to bit 24
str r1,[r0,#4] ;write it into 5th (16/4+1)block of function register These numbers all refer to
settings and programming of
mov r1,#1 the GPIO registers.
lsl r1,#18 ;write 1 into r1, lsl 18 times to move the 1 to bit 18
str r1,[r0,#28] ;write it into first block of pull-up register To understand this part of the
Code we need to understand
loop$:
what the GPIO chip is, and
b loop$ ;loop forever
how we interface with it to
read to and write from the
GPIO header pins.
GPIO LAYOUT FOR RPI 2B, 3B AND 4
MAKING THE LED FLASH (OK2)
•  pseudocode:
Program the GPIO 18 for output
Enable
wait
Disable
wait
We need to wait because
repeat the LED will flash too fast to
see. The clock speed of the
ARM – 700MHz – 1.2GHz.
Lab 8 Task resource on Canvas
25/9/20 COS10004 Computer Systems 7
MAKING THE LED FLASH (OK2)
•  pseudocode:
Program the GPIO 18 for output
Enable
wait
Disable
wait
We need to wait because
repeat the LED will flash too fast to
see. The clock speed of the
ARM – 700MHz – 1.2GHz.
Lab 8 Task resource on Canvas
25/9/20 COS10004 Computer Systems 8
FUNCTIONALITY NEEDED
•  Pull GPIO18 low (disable led)
•  Insert delay between led enable and disable
•  Lets deal with turning off LED first!
RECALL PSUEDO CODE
•  store location of GPIO (BASE + GPIOADDR) in r0
•  Enable “writing” for GPIO18 (our LED)
–  we need to set certain bits in the “function” register
to program GPIO18 for writing
•  Set output of GPIO18
–  Light on: set bit in the appropriate “write 1” register
–  Light off: set bit in the appropriate “write 0” register
•  loop forever
RECALL PSUEDO CODE
•  store location of GPIO (BASE + GPIOADDR) in r0
•  Enable “writing” for GPIO18 (our LED)
–  we need to set certain bits in the “function” register
to program GPIO18 for writing
•  Set output of GPIO18
–  Light on: set bit in the appropriate “write 1” register
–  Light off: set bit in the appropriate “write 0” register
•  loop forever
start of the BASE+ Each pin programmed by a
GPIO (RPi 2/3). Add 3-bit number. Those
this address to
everything in the 1. SELECT FUNCTION numbers are packed into
30 bits of each word
GPIO

Add 4 bytes (1 word) each time we go


above 30 bits (10 GPIO pins)
25/9/20 COS10004 Computer Systems 12
3 registers control Each pin programmed
by a 1-bit number. 32
writing 0, writing 1
or reading each
pin.
2. SET VALUE (R/W) numbers are packed
into 32 bits of each
word.

Some GPIO pins need


to be sent a 0 to turn
the pin on, others need
a 1 to turn on.
TURNING OFF THE LED (GPIO 18)
BASE = $FE000000
GPIO_OFFSET = $200000
mov r0,BASE
orr r0,GPIO_OFFSET
;start of GPIO
... ;program GPIO for output, turn on LED
Remember? The GPIO has (at
;set bit 18 offset):
mov r1,#1
Offset 0 bytes: Function registers
lsl r1,#18 Offset 28 bytes: Set high registers
;write to "set low” register Offset 40 bytes: Set low registers
str r1,[r0,#40] Offset 52 bytes: Read registers.
See RPiGPIO.xlsx

25/9/20 COS10004 Computer Systems 14


INSERT DELAY WITH BUSY WAIT TIMER
•  Pseudocode:
–  Program GPIO18 LED for output
–  Loop1:
•  Turn LED on (pull GPIO18 high)
•  Busy wait
•  Turn LED off (pull GPIO18 low)
•  Busy wait
–  branch to loop1

25/9/20 COS10004 Computer Systems 15


SUMMARY
•  To make LED flash we turn LED on an off with
inserted time delays
•  Pulling a GPIO register pin low follows same
pattern as pulling high
–  Write “1” to the appropriate position in the “off”
register
–  Everything else is the same!
•  Busy wait time needs a comparison and a loop:
–  Next lecture we discuss how to do this!

You might also like