//----------------------------------------------
// void EXTI4_IRQHandler(void)
//----------------------------------------------
.section .text.EXTI4_IRQHandler
.align
.global EXTI4_IRQHandler
.type EXTI4_IRQHandler, %function
EXTI4_IRQHandler:
push {r0-r3,lr}
ldr r0,=GPIO_BASE
ldr r1,=MEM_BASE
ldrh r2,[r1] //,#RSN_RDA] //load Status
EXTI4_IRQHandler_start:
READPORT_R0 r3,GPIOB
and r3,#7
eor r3,#7
tbb [pc,r3]
EXTI4_IRQHandler_table:
.byte (EXTI4_IRQHandler_case_0 - EXTI4_IRQHandler_table)/2 //case 0 - exit
.byte (EXTI4_IRQHandler_case_SYNC - EXTI4_IRQHandler_table)/2 //case 1 - only SYNC down
.byte (EXTI4_IRQHandler_case_0 - EXTI4_IRQHandler_table)/2 //case 2 = case 0
.byte (EXTI4_IRQHandler_case_DIN - EXTI4_IRQHandler_table)/2 //case 3 - SYNC|DIN down
.byte (EXTI4_IRQHandler_case_0 - EXTI4_IRQHandler_table)/2 //case 4 = case 0
.byte (EXTI4_IRQHandler_case_DOUT - EXTI4_IRQHandler_table)/2 //case 5 - SYNC|DOUT down
.byte (EXTI4_IRQHandler_case_0 - EXTI4_IRQHandler_table)/2 //case 6 = case 0
.byte (EXTI4_IRQHandler_case_0 - EXTI4_IRQHandler_table)/2 //case 7 = case 0
.align
EXTI4_IRQHandler_case_0:
//reset exti port
ldr r2,=(EXTI_PR1)
ldr r3,=EXTI_LINE_4
str r3,[r2]
//release RPLY|VA87DIR
SETGPIO_R0 r3,GPIOB,#(RPLY|VA87DIR)
pop {r0-r3,lr}
bx lr
EXTI4_IRQHandler_case_SYNC:
b EXTI4_IRQHandler_start
//--------------get Status-----------------
EXTI4_IRQHandler_case_DIN:
RESETGPIO_R0 r3,GPIOB,#(VA87DIR)
SETPORT_R0 r3,GPIOA,MODER,MODER_O
SETODRPORT_R0 r2,GPIOA //Out status from r2
RESETGPIO_R0 r3,GPIOB,#(RPLY)
irq4_din_rsn_h_wait:
READPORT_R0 r3,GPIOB
tst r3,#(DIN)
beq irq4_din_rsn_h_wait
and r2,#0
SETPORT_R0 r3,GPIOA,MODER,MODER_I
//-----------end din-----------------
//save operation
strb r2,[r1,SET_OPA]
//strh r2,[r1] //,#RSN_RDA] //RSN_RD=0
//reset exti port
ldr r2,=(EXTI_PR1)
ldr r3,=EXTI_LINE_4
str r3,[r2]
//release RPLY|VA87DIR
SETGPIO_R0 r3,GPIOB,#(RPLY|VA87DIR)
pop {r0-r3,lr}
bx lr
//--------------set CMD-----------------
EXTI4_IRQHandler_case_DOUT:
RESETGPIO_R0 r3,GPIOB,#(RPLY)
//SETPORT_R0 r3,GPIOA,MODER,MODER_I //may be delete?
irq4_rsn_dout_h_wait:
READPORT_R0 r3,GPIOA
READPORT_R0 r2,GPIOB
tst r2,#(DOUT)
beq irq4_rsn_dout_h_wait
strh r3,[r1,#RSN_WRA]
tst r3,#0x100 //GOR?
beq EXTI4_IRQHandler_case_DOUT_end
ldrh r2,=0 //cmd
strh r2,[r1,#RSN_RDA] //RSN_RD=0
strh r2,[r1,#RDN_RDA] //RDN_RD=0
//-----------end dout-----------------
EXTI4_IRQHandler_case_DOUT_end:
//reset exti port
ldr r2,=(EXTI_PR1)
ldr r3,=EXTI_LINE_4
str r3,[r2]
//release RPLY|VA87DIR
SETGPIO_R0 r3,GPIOB,#(RPLY|VA87DIR)
pop {r0-r3,lr}
bx lr
//----------------------------------------------
// void EXTI9_5_IRQHandler(void)
//----------------------------------------------
.section .text.EXTI9_5_IRQHandler
.align
.global EXTI9_5_IRQHandler
.type EXTI9_5_IRQHandler, %function
EXTI9_5_IRQHandler:
push {r0-r3,lr}
ldr r0,=GPIO_BASE
ldr r1,=MEM_BASE
ldrh r2,[r1,#RDN_RDA] //load Data
EXTI9_5_IRQHandler_start:
READPORT_R0 r3,GPIOB
and r3,#7
eor r3,#7
tbb [pc,r3]
EXTI9_5_IRQHandler_table:
.byte (EXTI9_5_IRQHandler_case_0 - EXTI9_5_IRQHandler_table)/2 //case 0 - exit
.byte (EXTI9_5_IRQHandler_case_SYNC - EXTI9_5_IRQHandler_table)/2 //case 1 - only SYNC down
.byte (EXTI9_5_IRQHandler_case_0 - EXTI9_5_IRQHandler_table)/2 //case 2 = case 0
.byte (EXTI9_5_IRQHandler_case_DIN - EXTI9_5_IRQHandler_table)/2 //case 3 - SYNC|DIN down
.byte (EXTI9_5_IRQHandler_case_0 - EXTI9_5_IRQHandler_table)/2 //case 4 = case 0
.byte (EXTI9_5_IRQHandler_case_DOUT - EXTI9_5_IRQHandler_table)/2 //case 5 - SYNC|DOUT down
.byte (EXTI9_5_IRQHandler_case_0 - EXTI9_5_IRQHandler_table)/2 //case 6 = case 0
.byte (EXTI9_5_IRQHandler_case_0 - EXTI9_5_IRQHandler_table)/2 //case 7 = case 0
.align
EXTI9_5_IRQHandler_case_0:
//reset exti port
ldr r2,=(EXTI_PR1)
ldr r3,=EXTI_LINE_5
str r3,[r2]
pop {r0-r3,lr}
bx lr
EXTI9_5_IRQHandler_case_SYNC:
b EXTI9_5_IRQHandler_start
EXTI9_5_IRQHandler_case_DIN:
RESETGPIO_R0 r3,GPIOB,#(VA87DIR)
SETPORT_R0 r3,GPIOA,MODER,MODER_O
SETODRPORT_R0 r2, GPIOA
RESETGPIO_R0 r3,GPIOB,#(RPLY)
irq5_din_rdn_h_wait:
READPORT_R0 r3,GPIOB
tst r3,#(DIN)
beq irq5_din_rdn_h_wait
SETPORT_R0 r3,GPIOA,MODER,MODER_I
SETGPIO_R0 r3,GPIOB,#(RPLY|VA87DIR)
//-----------end din-----------------
ldrh r3,[r1]//,#RSN_RDA] //eq 0
bic r3,#0x80 // 7 bit (TR)
strh r3,[r1]//,#RSN_RDA]
//reset exti port
ldr r2,=(EXTI_PR1)
ldr r3,=EXTI_LINE_5
str r3,[r2]
pop {r0-r3,lr}
bx lr
EXTI9_5_IRQHandler_case_DOUT:
RESETGPIO_R0 r3,GPIOB,#(RPLY)
//SETPORT_R0 r3,GPIOA,MODER,MODER_I
irq5_rdn_dout_h_wait:
READPORT_R0 r3,GPIOA
READPORT_R0 r2,GPIOB
tst r2,#(DOUT)
beq irq5_rdn_dout_h_wait
strh r3,[r1,#RDN_WRA]
SETGPIO_R0 r3,GPIOB,#(RPLY)
//-----------end dout-----------------
ldrh r3,[r1]//,#RSN_RDA] //eq 0
bic r3,#0x80 // 7 bit (TR)
strh r3,[r1]//,#RSN_RDA]
//reset exti port
ldr r2,=(EXTI_PR1)
ldr r3,=EXTI_LINE_5
str r3,[r2]
pop {r0-r3,lr}
bx lr
//-----------end EXTI9_5_IRQHandler-------------
[свернуть]