Skip to content

Instantly share code, notes, and snippets.

@BobBurns
Created August 25, 2015 01:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save BobBurns/f49eae3a1f1e58aa7040 to your computer and use it in GitHub Desktop.
Save BobBurns/f49eae3a1f1e58aa7040 to your computer and use it in GitHub Desktop.
@ program: systick_tst.s
@ programmer: reb
@ device: stm32L152c discovery eval board
@ description: blink led with systick count down
@ uses systick interrupt routine
@
@ how to compile and flash:
@ arm-none-eabi-as -mcpu=cortex-m3 systick_tst.s -o systick_tst.o
@ arm-none-eabi-ld -v -T stm32.ld -nostartfiles -o systick_tst.elf systick_tst.o
@ arm-none-eabi-objcopy -O binary systick_tst.elf systick_tst.bin
@ then from st-link (https://github.com/texane/stlink)
@ ./st-flash write ../systick_tst/systick_tst.bin 0x08000000
.thumb
.syntax unified
@ Equates
temp .req r0
.equ STACKINIT, 0x20005000
.equ RCC_CR, 0x40023800
.equ RCC_AHBRSTR, 0x40023810 @ reset register
.equ RCC_AHBENR, 0x4002381C @ enable clock
.equ RCC_APB2ENR, 0x40023820
.equ GPIOB_MODER, 0x40020400 @ port B mode
.equ GPIOB_OTYPER, 0x40020404 @ type push-pull
.equ GPIOB_OSPEEDR, 0x40020408 @ port pin clock speed
.equ GPIOB_PUPDR, 0x4002040C @ pull-up pull-down
.equ GPIOB_ODR, 0x40020414 @ output data
.equ GPIOA, 0x40020000
.equ _MODER, 0x00
.equ _OTYPER, 0x04
.equ _OSPEEDR, 0x08
.equ _PUPDR, 0x0C
.equ SYSCFG, 0x40010000
.equ _EXTICR1, 0x08
.equ EXTI, 0x40010400
.equ _IMR, 0x00
.equ _RTSR, 0x08
.equ _PR, 0x14
.equ SYSTICK, 0xE000E010
.equ _CTRL, 0x00
.equ _LOAD, 0x04
.equ _CALIB, 0x0C
.equ _CURRENT, 0x08
.equ VTOR, 0xE000ED08
.equ SETENA0, 0xE000E100
.equ IPR0, 0xE000E400
.equ LEDDELAY, 800000
.section .text
.org 0
@ Vectors
vectors:
.word STACKINIT
.word _start + 1
.word _nmi_handler + 1
.word _hard_fault + 1
.word _memory_fault + 1
.word _bus_fault + 1
.word _usage_fault + 1
.org 0x0000003C
.word _systick_handler + 1 @ set lsb for thumb code
_start:
@ init led
ldr r6, = RCC_AHBRSTR
ldr r5, [r6]
orr r5, r5, 0x03 @ set GPIOB GPIOA reset bit
str r5, [r6]
ldr r5, [r6]
mvn r4, 0x03
movt r4, 0xffff
and r5, r5, r4 @ clear GPIO GPIOA reset bit
str r5, [r6]
@ next enable clock on GPIO port B
ldr r6, = RCC_AHBENR
ldr r5, [r6]
orr r5, r5, 0x02
str r5, [r6]
@ now set port B pin 7 to output
ldr r6, = GPIOB_MODER
ldr r5, [r6]
mov temp, 0xc0
mvn r4, temp, lsl 8
movt r4, 0xffff
and r5, r5, r4 @ clear bits 15 14
mov temp, 0x40
orr r5, r5, temp, lsl 8 @ set bits 15:14 0 1
str r5, [r6]
@ type = push-pull
ldr r6, =GPIOB_OTYPER
ldr r5, [r6]
mvn r4, 0x80
movt r4, 0xffff
and r5, r5, r4
str r5, [r6] @ clear bit 7
@ speed 400kHz
ldr r6, =GPIOB_OSPEEDR
ldr r5, [r6]
mov temp, 0xc0
mvn r4, temp, lsl 8
movt r4, 0xffff
and r5, r5, r4
str r5, [r6]
@ pull up pull down none
ldr r6, = GPIOB_PUPDR
ldr r5, [r6]
mov temp, 0xc0
mvn r4, temp, lsl 8
movt r4, 0xffff
and r5, r5, r4
str r5, [r6]
@ init push button pa0
@ mode input is default
ldr r6, =GPIOA
ldr r5, [r6, _OTYPER]
mov temp, 0x01
mvn r4, temp
movt r4, 0xffff
and r5, r5, r4
str r5, [r6, _OTYPER]
ldr r5, [r6, _OSPEEDR]
mov temp, 0x03
mvn r4, temp
movt r4, 0xffff
and r5, r5, r4
bfc r4, 0, 32
mov temp, 0x01
orr r5, r5, temp
str r5, [r6, _OSPEEDR]
ldr r5, [r6, _PUPDR]
mov temp, 0x03
mvn r4, temp
movt r4, 0xffff
and r5, r5, r4
str r5, [r6, _PUPDR]
@ enable hsi clocki
ldr r6, = RCC_CR
ldr r5, [r6]
orr r5, r5, 0x01
str r5, [r6]
@ init systick
ldr r6, =SYSTICK
ldr r5, [r6, _CTRL]
bic r5, r5, 1
str r5, [r6, _CTRL] @clear enable
ldr r5, [r6, _CTRL]
bic r5, r5, 0x02
str r5, [r6, _CTRL] @ disable systick interrupt
ldr r5, [r6, _CTRL]
bic r5, r5, 0x04 @ select external clock
str r5, [r6, _CTRL]
mov temp, 0x01
mov r4, temp, lsl 8
orr r4, r4, 0x06 @ = 106 hex = 262
movt r4, 0x0000
str r4, [r6, _LOAD] @ set systick load
mov r4, 0x00
str r4, [r6, _CURRENT]
ldr r6, =SYSTICK
ldr r5, [r6, _CTRL]
orr r5, r5, 0x02
str r5, [r6, _CTRL] @ enable systick interrupt
ldr r5, [r6, _CTRL]
orr r5, r5, 0x01
str r5, [r6, _CTRL] @ enable systick counter
loop: mov temp, 0x03
mov r4, temp, lsl 8
orr r4, r4, 0xe8 @ =1000
movt r4, 0x0000
mov r10, r4
newlp:
cmp r10, 0x00
bne newlp
ldr r6, =GPIOB_ODR
ldrb r5, [r6]
eor r5, r5, 0x80
str r5, [r6]
b loop
ldr r6, =GPIOB_ODR
ldrb r5, [r6]
eor r5, r5, 0x80
str r5, [r6]
b loop
@ if any int gets triggered, just loop
_dummy:
_nmi_handler:
_hard_fault:
_memory_fault:
_bus_fault:
_usage_fault:
add r0, 1
add r1, 1
b _dummy
@ isr routine
_systick_handler:
sub r10, r10, 1
bx lr
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment