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