Загрузка данных


	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, #0x41
	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 r3, =50000
	bl Delay

	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

	
	; 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

	
	; 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 r3, =50000
	bl Delay
	
	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
	
	; 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