#****************************************************************************************# # 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