Created
August 25, 2015 01:36
-
-
Save BobBurns/f49eae3a1f1e58aa7040 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@ 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