113 lines
2.3 KiB
ArmAsm
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
|
|
|