Files
CE2801-Workspace/lab2barnestr/src/main.s
Trevor Barnes 6af6bb4217 finished lab 2
2019-09-30 20:33:52 -05:00

113 lines
2.3 KiB
ArmAsm

# main.s
# Trevor Barnes
# CE2801-031
# Lab 2: Knight Rider Lights
# Description: This routine causes the lights on the demo board to move in a back and forth
# pattern like the lights from Knight Rider
# Lights are on PB5-PB15 except PB11
.syntax unified
.cpu cortex-m4
.thumb
.section .text
# Base RCC
.equ RCC_BASE, 0x40023800
# GPIOB Enable Register
.equ RCC_AHB1ENR, 0x30
# GPIOB Enable
.equ RCC_GPIOBEN, 1<<1
# Bit Set Reset Register
.equ GPIOB_BSRR, 0x18
.equ GPIOB_BASE, 0x40020400
# GPIO Mode Register
.equ GPIO_MODER, 0x00
# GPIO Output Data Register
.equ GPIO_ODR, 0x14
.global main
main:
# Turn on GPIOB in RCC
ldr r1, =RCC_BASE
# Read, Modify, Write
ldr r2, [r1, #RCC_AHB1ENR]
orr r2, r2, #RCC_GPIOBEN
str r2, [r1, #RCC_AHB1ENR]
# Enable PB5-PB10, PB12-PB15 to be outputs
ldr r1, =GPIOB_BASE
ldr r2, [r1, #GPIO_MODER]
movw r3, #0x5400
movt r3, #0x5515
orr r2, r2, r3
movw r3, #0xA800
movt r3, #0xAA2A
bic r2, r2, r3
str r2, [r1, #GPIO_MODER]
# Set the starting on bit (one less than the right most LED bit)
movw r3, #0x0010
scroll_left:
# Move ON bit one position to the left
lsl r3, r3, #1
# Read current data
ldr r2, [r1, #GPIO_ODR]
# Clear previous ON bit, default 0
bic r2, r4
# Write new data
orr r2, r2, r3
# Skip if PB11 "pin"
cmp r3, 0x0800
beq scroll_left
# Write data back
str r2, [r1, #GPIO_ODR]
# Write the current ON bit to be cleared next cycle
mov r4, r3
bl delay
# Loop back until the leftmost pin is on
cmp r3, 0x8000
bne scroll_left
scroll_right:
# Move ON bit one position to the right
lsr r3, r3, #1
# Read current data
ldr r2, [r1, #GPIO_ODR]
# Clear previous ON bit, default 0
bic r2, r4
# Write new data
orr r2, r2, r3
# Skip if PB11 "pin"
cmp r3, 0x0800
beq scroll_right
# Write data back
str r2, [r1, #GPIO_ODR]
# Write the current ON bit to be cleared next cycle
mov r4, r3
bl delay
# Loop back until the rightmost pin is on
cmp r3, 0x0020
bne scroll_right
b scroll_left
delay:
# Arbitrary delay length
ldr r12, =0x00050000
1:
subs r12, r12,#1
# Branch backward to local label if not equal to 0
bne 1b
bx lr