348 lines
8.9 KiB
ArmAsm
348 lines
8.9 KiB
ArmAsm
#****************************************************************************************#
|
|
# Project: task2 - ASM: Interrupts
|
|
# File: task2.s
|
|
# Hardware: STefi Light v1.1
|
|
# Processor: STM32G431KBT6U
|
|
#****************************************************************************************#
|
|
|
|
.include "G431_addr.s"
|
|
|
|
// Falls in G431_addr.s vorhanden, diesen Block löschen um Fehler zu vermeiden:
|
|
.equ RCC_AHB2ENR, 0x4002104C
|
|
.equ RCC_APB2ENR, 0x40021060
|
|
|
|
.equ GPIOA_MODER, 0x48000000
|
|
.equ GPIOA_ODR, 0x48000014
|
|
|
|
.equ GPIOB_MODER, 0x48000400
|
|
.equ GPIOB_PUPDR, 0x4800040C
|
|
.equ GPIOB_IDR, 0x48000410
|
|
|
|
.equ SYSCFG_BASE, 0x40010000
|
|
.equ SYSCFG_EXTICR1, (SYSCFG_BASE + 0x08)
|
|
.equ SYSCFG_EXTICR2, (SYSCFG_BASE + 0x0C)
|
|
|
|
.equ EXTI_BASE, 0x40010400
|
|
.equ EXTI_IMR1, (EXTI_BASE + 0x00)
|
|
.equ EXTI_FTSR1, (EXTI_BASE + 0x0C)
|
|
.equ EXTI_PR1, (EXTI_BASE + 0x14)
|
|
|
|
.equ NVIC_ISER0, 0xE000E100
|
|
|
|
.equ DBGMCU_CR, 0xE0042004 // Adresse des Debug Configuration Registers
|
|
|
|
#----------------------------------------------------------------------------------------#
|
|
.section .vectortable,"a"
|
|
#----------------------------------------------------------------------------------------#
|
|
|
|
.align 2
|
|
|
|
.word 0x20004000 // initial Stack Pointer
|
|
.word init // initial Program Counter
|
|
.word _ISR_NMI // non-masking interrupt
|
|
.word _ISR_HARDF // hard fault interrupt
|
|
|
|
.space 0x48 // Padding 72 Bytes (Offset 0x10 -> 0x58)
|
|
.word _ISR_EXTI0 // EXTI0_IRQHandler (PB0 / S0) - IRQ 6
|
|
|
|
.space 0x0C // Padding 12 Bytes (Offset 0x5C -> 0x68)
|
|
.word _ISR_EXTI4 // EXTI4_IRQHandler (PB4 / S1) - IRQ 10
|
|
|
|
#----------------------------------------------------------------------------------------#
|
|
.text
|
|
#----------------------------------------------------------------------------------------#
|
|
|
|
.align 2
|
|
.syntax unified
|
|
.thumb
|
|
.thumb_func
|
|
.global init
|
|
.type init, %function
|
|
init:
|
|
CPSID i
|
|
|
|
MOVS r0, #0
|
|
MOVS r1, #0
|
|
MOVS r2, #0
|
|
MOVS r3, #0
|
|
MOVS r4, #0
|
|
MOVS r5, #0
|
|
MOVS r6, #0
|
|
MOVS r7, #0
|
|
MOV r8, r0
|
|
MOV r9, r0
|
|
MOV r10, r0
|
|
MOV r11, r0
|
|
MOV r12, r0
|
|
|
|
#--- enable port clocking (GPIOA, GPIOB)
|
|
LDR r1, =RCC_AHB2ENR
|
|
MOVS r2, #0x03 // Bit 0 (GPIOA) und Bit 1 (GPIOB)
|
|
LDR r0, [r1, #0]
|
|
ORRS r0, r2
|
|
STR r0, [r1, #0]
|
|
|
|
#--- port init
|
|
#- LEDs (PA0 - PA3) als Output
|
|
LDR r1, =GPIOA_MODER
|
|
LDR r2, =0x000000FF
|
|
LDR r0, [r1, #0]
|
|
BICS r0, r2
|
|
LDR r2, =0x00000055
|
|
ORRS r0, r2
|
|
STR r0, [r1, #0]
|
|
|
|
#- switch LED off
|
|
LDR r1, =GPIOA_ODR
|
|
MOVS r2, #0x0F
|
|
LDR r0, [r1, #0]
|
|
ORRS r0, r2
|
|
STR r0, [r1, #0]
|
|
|
|
#- buttons (PB0, PB4) als Input
|
|
LDR r1, =GPIOB_MODER
|
|
LDR r2, =0x00000303 // Maske Bits 0:1 (PB0) und 8:9 (PB4)
|
|
LDR r0, [r1, #0]
|
|
BICS r0, r2
|
|
STR r0, [r1, #0]
|
|
|
|
#- Pull-Up für PB0, PB4
|
|
LDR r1, =GPIOB_PUPDR
|
|
LDR r2, =0x00000303
|
|
LDR r0, [r1, #0]
|
|
BICS r0, r2
|
|
LDR r2, =0x00000101 // 01 = Pull-Up für PB0 und PB4
|
|
ORRS r0, r2
|
|
STR r0, [r1, #0]
|
|
|
|
#--- button interrupt config
|
|
|
|
#- enable clock for SYSCFG module
|
|
LDR r1, =RCC_APB2ENR
|
|
MOVS r2, #0x01
|
|
LDR r0, [r1, #0]
|
|
ORRS r0, r2
|
|
STR r0, [r1, #0]
|
|
|
|
#- connect GPIO pins to EXTI lines
|
|
LDR r1, =SYSCFG_EXTICR1 // EXTI0 (PB0)
|
|
LDR r2, =0x000F // Maske EXTI0 (Bits 3:0)
|
|
LDR r0, [r1, #0]
|
|
BICS r0, r2
|
|
MOVS r2, #0x0001 // Port B (0001)
|
|
ORRS r0, r2
|
|
STR r0, [r1, #0]
|
|
|
|
LDR r1, =SYSCFG_EXTICR2 // EXTI4 (PB4)
|
|
LDR r2, =0x000F // Maske EXTI4 (Bits 3:0)
|
|
LDR r0, [r1, #0]
|
|
BICS r0, r2
|
|
MOVS r2, #0x0001 // Port B (0001)
|
|
ORRS r0, r2
|
|
STR r0, [r1, #0]
|
|
|
|
#- configure EXTI lines (falling edge, unmask)
|
|
LDR r1, =EXTI_FTSR1
|
|
MOVS r2, #0x11 // Bit 0 (EXTI0) und Bit 4 (EXTI4)
|
|
LDR r0, [r1, #0]
|
|
ORRS r0, r2
|
|
STR r0, [r1, #0]
|
|
|
|
LDR r1, =EXTI_IMR1
|
|
MOVS r2, #0x11 // Bit 0 und Bit 4
|
|
LDR r0, [r1, #0]
|
|
ORRS r0, r2
|
|
STR r0, [r1, #0]
|
|
|
|
#- NVIC: enable interrupts EXTI0 (IRQ 6) & EXTI4 (IRQ 10)
|
|
LDR r1, =NVIC_ISER0
|
|
LDR r2, =0x00000440 // Bit 6 (EXTI0) und Bit 10 (EXTI4)
|
|
LDR r0, [r1, #0]
|
|
ORRS r0, r2
|
|
STR r0, [r1, #0]
|
|
|
|
#--- wachhalten während WFI
|
|
LDR r1, =DBGMCU_CR
|
|
LDR r0, [r1, #0]
|
|
MOVS r2, #0x07 // Setzt DBG_SLEEP, DBG_STOP und DBG_STANDBY Bits
|
|
ORRS r0, r2
|
|
STR r0, [r1, #0]
|
|
|
|
CPSIE i
|
|
|
|
#----------------------------------------------------------------------------------------#
|
|
|
|
.align 2
|
|
.syntax unified
|
|
.thumb
|
|
.thumb_func
|
|
.global main
|
|
.type main, %function
|
|
main:
|
|
WFI
|
|
B main
|
|
|
|
#----------------------------------------------------------------------------------------#
|
|
|
|
.align 2
|
|
.syntax unified
|
|
.thumb
|
|
.thumb_func
|
|
.global delay
|
|
.type delay, %function
|
|
delay:
|
|
LDR r0, =106000
|
|
.L1:
|
|
SUBS r0, r0, #1
|
|
BNE .L1
|
|
BX lr
|
|
|
|
#----------------------------------------------------------------------------------------#
|
|
|
|
.align 2
|
|
.global stop
|
|
stop:
|
|
NOP
|
|
B stop
|
|
|
|
#----------------------------------------------------------------------------------------#
|
|
.lp1:
|
|
.ltorg
|
|
#----------------------------------------------------------------------------------------#
|
|
|
|
#----------------------------------------------------------------------------------------#
|
|
.section .exhand,"ax"
|
|
#----------------------------------------------------------------------------------------#
|
|
|
|
.align 2
|
|
.syntax unified
|
|
.thumb
|
|
.type _ISR_NMI, %function
|
|
_ISR_NMI:
|
|
LDR r1, =RCC_AHB2ENR
|
|
MOV r2, #0x01
|
|
LDR r0, [r1, #0]
|
|
ORRS r0, r2
|
|
STR r0, [r1, #0]
|
|
|
|
LDR r1, =GPIOA_MODER
|
|
MOVS r2, #0xFF
|
|
LDR r0, [r1, #0]
|
|
BICS r0, r2
|
|
MOVS r2, #0x44
|
|
ORRS r0, r2
|
|
STR r0, [r1, #0]
|
|
|
|
LDR r1, =GPIOA_ODR
|
|
MOVS r2, #0x0A
|
|
LDR r0, [r1, #0]
|
|
BICS r0, r2
|
|
STR r0, [r1, #0]
|
|
|
|
B _ISR_NMI
|
|
|
|
#----------------------------------------------------------------------------------------#
|
|
|
|
.align 2
|
|
.syntax unified
|
|
.thumb
|
|
.type _ISR_HARDF, %function
|
|
_ISR_HARDF:
|
|
LDR r1, =RCC_AHB2ENR
|
|
MOV r2, #0x01
|
|
LDR r0, [r1, #0]
|
|
ORRS r0, r2
|
|
STR r0, [r1, #0]
|
|
|
|
LDR r1, =GPIOA_MODER
|
|
MOVS r2, #0xFF
|
|
LDR r0, [r1, #0]
|
|
BICS r0, r2
|
|
MOVS r2, #0x11
|
|
ORRS r0, r2
|
|
STR r0, [r1, #0]
|
|
|
|
LDR r1, =GPIOA_ODR
|
|
MOVS r2, #0x05
|
|
LDR r0, [r1, #0]
|
|
BICS r0, r2
|
|
STR r0, [r1, #0]
|
|
|
|
B _ISR_HARDF
|
|
|
|
#----------------------------------------------------------------------------------------#
|
|
|
|
.align 2
|
|
.syntax unified
|
|
.thumb
|
|
.type _ISR_EXTI0, %function
|
|
_ISR_EXTI0:
|
|
PUSH {lr}
|
|
|
|
#--- Entprellen
|
|
BL delay
|
|
|
|
#--- Überprüfen, ob Taster noch gedrückt ist (PB0)
|
|
LDR r0, =GPIOB_IDR
|
|
LDR r1, [r0, #0]
|
|
MOVS r2, #0x01
|
|
TST r1, r2
|
|
BNE _clear_exti0
|
|
|
|
#--- LED0 & LED3 toggeln (1001 = 0x09)
|
|
LDR r0, =GPIOA_ODR
|
|
LDR r1, [r0, #0]
|
|
MOVS r2, #0x09
|
|
EORS r1, r2
|
|
STR r1, [r0, #0]
|
|
|
|
_clear_exti0:
|
|
#--- Interrupt Flag löschen
|
|
LDR r0, =EXTI_PR1
|
|
MOVS r1, #0x01
|
|
STR r1, [r0, #0]
|
|
|
|
POP {pc}
|
|
|
|
#----------------------------------------------------------------------------------------#
|
|
|
|
.align 2
|
|
.syntax unified
|
|
.thumb
|
|
.type _ISR_EXTI4, %function
|
|
_ISR_EXTI4:
|
|
PUSH {lr}
|
|
|
|
#--- Entprellen
|
|
BL delay
|
|
|
|
#--- Überprüfen, ob Taster noch gedrückt ist (PB4)
|
|
LDR r0, =GPIOB_IDR
|
|
LDR r1, [r0, #0]
|
|
MOVS r2, #0x10
|
|
TST r1, r2
|
|
BNE _clear_exti4
|
|
|
|
#--- LED1 & LED2 toggeln (0110 = 0x06)
|
|
LDR r0, =GPIOA_ODR
|
|
LDR r1, [r0, #0]
|
|
MOVS r2, #0x06
|
|
EORS r1, r2
|
|
STR r1, [r0, #0]
|
|
|
|
_clear_exti4:
|
|
#--- Interrupt Flag löschen
|
|
LDR r0, =EXTI_PR1
|
|
MOVS r1, #0x10
|
|
STR r1, [r0, #0]
|
|
|
|
POP {pc}
|
|
|
|
#----------------------------------------------------------------------------------------#
|
|
.lp2:
|
|
.ltorg
|
|
#----------------------------------------------------------------------------------------#
|
|
|
|
.end
|
|
|