Загрузка данных
THUMB
RCC_APB2ENR EQU 0x40021018
AFIO_EXTICR2 EQU 0x4001000C
AFIO_EXTICR3 EQU 0x40010010
AFIO_EXTICR4 EQU 0x40010014
EXTI_IMR EQU 0x40010400
EXTI_RTSR EQU 0x40010408
EXTI_FTSR EQU 0x4001040C
EXTI_PR EQU 0x40010414
GPIOA_CRL EQU 0x40010800
GPIOA_CRH EQU 0x40010804
GPIOA_ODR EQU 0x4001080C
GPIOA_BSRR EQU 0x40010810
GPIOB_CRL EQU 0x40010C00
GPIOB_CRH EQU 0x40010C04
GPIOB_ODR EQU 0x40010C0C
GPIOB_BSRR EQU 0x40010C10
NVIC_ISER0 EQU 0xE000E100
NVIC_ISER1 EQU 0xE000E104
SCB_AIRCR EQU 0xE000ED0C
NVIC_IPR0 EQU 0xE000E400
PER_BB_BASE EQU 0x42000000
PER_BASE EQU 0x40000000
GPIOA_ODR_OFF EQU 0x0001080C
GPIOB_ODR_OFF EQU 0x00010C0C
GPIOA_IDR_OFF EQU 0x00010808
GPIOB_IDR_OFF EQU 0x00010C08
PA5_ODR_BB EQU PER_BB_BASE + GPIOA_ODR_OFF * 32 + 5 * 4
PB0_ODR_BB EQU PER_BB_BASE + GPIOB_ODR_OFF * 32 + 0 * 4
PB13_ODR_BB EQU PER_BB_BASE + GPIOB_ODR_OFF * 32 + 13 * 4
PA8_IDR_BB EQU PER_BB_BASE + GPIOA_IDR_OFF * 32 + 8 * 4
PB5_IDR_BB EQU PER_BB_BASE + GPIOB_IDR_OFF * 32 + 5 * 4
PB15_IDR_BB EQU PER_BB_BASE + GPIOB_IDR_OFF * 32 + 15 * 4
AREA LAB2MAIN, CODE, READONLY
EXPORT main
EXPORT EXTI9_5_IRQHandler
EXPORT EXTI15_10_IRQHandler
main
LDR R0, =RCC_APB2ENR
LDR R1, [R0]
ORR R1, R1, #0x0D
STR R1, [R0]
; Set PA5=1, PA8=1 (pull-up)
LDR R0, =GPIOA_BSRR
LDR R1, =(1 << 5) :OR: (1 << 8)
STR R1, [R0]
; PB0=1, PB13=1, PB5 and PB15 for pull-down
LDR R0, =GPIOB_BSRR
LDR R1, =(1 << 0) :OR: (1 << 13) :OR: (1 << 21) :OR: (1 << 31)
STR R1, [R0]
;PA5 output push-pull
LDR R0, =GPIOA_CRL
LDR R1, [R0]
LDR R2, =0xFF0FFFFF
AND R1, R1, R2
LDR R2, =0x00200000
ORR R1, R1, R2
STR R1, [R0]
;PA8 input pull-up/down
LDR R0, =GPIOA_CRH
LDR R1, [R0]
LDR R2, =0xFFFFFFF0
AND R1, R1, R2
ORR R1, R1, #0x8
STR R1, [R0]
;PB0 output, PB5 input pull-up/down
LDR R0, =GPIOB_CRL
LDR R1, [R0]
LDR R2, =0xFF0FFFF0
AND R1, R1, R2
LDR R2, =0x00800002
ORR R1, R1, R2
STR R1, [R0]
;PB13 output, PB15 input pull-up/down
LDR R0, =GPIOB_CRH
LDR R1, [R0]
LDR R2, =0x0F0FFFFF
AND R1, R1, R2
LDR R2, =0x80200000
ORR R1, R1, R2
STR R1, [R0]
;EXTI5 to PB5
LDR R0, =AFIO_EXTICR2
LDR R1, [R0]
BIC R1, R1, #0xF0
ORR R1, R1, #0x10
STR R1, [R0]
;EXTI8 to PA8
LDR R0, =AFIO_EXTICR3
LDR R1, [R0]
BIC R1, R1, #0x0F
STR R1, [R0]
;EXTI15 to PB15
LDR R0, =AFIO_EXTICR4
LDR R1, [R0]
BIC R1, R1, #0xF000
ORR R1, R1, #0x1000
STR R1, [R0]
; Configure rising edge for PB5, PB15
LDR R0, =EXTI_RTSR
LDR R1, [R0]
LDR R2, =(1 << 5) :OR: (1 << 15)
ORR R1, R1, R2
BIC R1, R1, #(1 << 8)
STR R1, [R0]
; Configure falling edge for PA8
LDR R0, =EXTI_FTSR
LDR R1, [R0]
ORR R1, R1, #(1 << 8)
LDR R2, =(1 << 5) :OR: (1 << 15)
BIC R1, R1, R2
STR R1, [R0]
; Unmask EXTI5, EXTI8, EXTI15
LDR R0, =EXTI_IMR
LDR R1, [R0]
LDR R2, =(1 << 5) :OR: (1 << 8) :OR: (1 << 15)
ORR R1, R1, R2
STR R1, [R0]
;priorgroup: 5 (4 groups, 4 subgroups)
LDR R0, =SCB_AIRCR
LDR R1, =0x05FA0500
STR R1, [R0]
; Set IRQ23 to Group 1, Sub 0 (0x40)
LDR R0, =NVIC_IPR0
MOV R1, #0x40
STRB R1, [R0, #23]
; Set IRQ40 to Group 2, Sub 0 (0x80)
MOV R1, #0x80
STRB R1, [R0, #40]
; Enable IRQ23 in NVIC
LDR R0, =NVIC_ISER0
MOV R1, #(1 << 23)
STR R1, [R0]
; Enable IRQ40 in NVIC
LDR R0, =NVIC_ISER1
MOV R1, #(1 << 8)
STR R1, [R0]
; Enable global interrupts
CPSIE I
loop
WFI
B loop
EXTI9_5_IRQHandler
PUSH {LR}
LDR R0, =EXTI_PR
LDR R1, [R0]
LDR R2, =(1 << 5) :OR: (1 << 8)
TST R1, R2
BEQ exti9_5_exit
; Clear pending flags
STR R2, [R0]
DSB
; Check PB5 (Active HIGH)
TST R1, #(1 << 5)
BEQ check_pa8
LDR R0, =PB5_IDR_BB
LDR R2, [R0]
CMP R2, #0
BEQ check_pa8
; Turn ON GREEN (PB0)
LDR R0, =PB0_ODR_BB
MOV R2, #0
STR R2, [R0]
LDR R3, =5000000
BL Delay
; Turn OFF GREEN
MOV R2, #1
STR R2, [R0]
check_pa8
; Check PA8 (Active LOW)
TST R1, #(1 << 8)
BEQ exti9_5_exit
LDR R0, =PA8_IDR_BB
LDR R2, [R0]
CMP R2, #0
BNE exti9_5_exit
; Turn ON RED (PA5)
LDR R0, =PA5_ODR_BB
MOV R2, #0
STR R2, [R0]
LDR R3, =5000000
BL Delay
; Turn OFF RED
MOV R2, #1
STR R2, [R0]
exti9_5_exit
POP {LR}
BX LR
EXTI15_10_IRQHandler
PUSH {LR}
LDR R0, =EXTI_PR
LDR R1, [R0]
TST R1, #(1 << 15)
BEQ exti15_10_exit
; Clear pending flag
MOV R2, #(1 << 15)
STR R2, [R0]
DSB
; Check PB15 (Active HIGH)
LDR R0, =PB15_IDR_BB
LDR R2, [R0]
CMP R2, #0
BEQ exti15_10_exit
; Turn ON BLUE (PB13)
LDR R0, =PB13_ODR_BB
MOV R2, #0
STR R2, [R0]
LDR R3, =5000000
BL Delay
; Turn OFF BLUE
MOV R2, #1
STR R2, [R0]
exti15_10_exit
POP {LR}
BX LR
Delay
SUBS R3, R3, #1
BNE Delay
BX LR
ALIGN
END