
도와주세요!!
글 수 15,339
2003.02.10 18:40:56 (*.38.182.2)
8066
이지부트에 인터럽트 핸들러를 추가해보고 있거든요.
즉, start.S를 빌려서 제가 만든 어플리케이션으로 뛰도록 만들었습니다.
그리고 나서 인터럽트를 받을수 있도록 고치는중인데요...
이지부트의 컴파일과 링크단위가 디렉토리이고, 제가 만든 인터럽트 핸들러
는 제 어플리케이션 디렉토리에 있는고로, start.S에서 직접 어드레스로 뛰도
럭 만들었어요.
_start: b Reset
b =0xC0F00400
b =0xC0F00414
b =0xC0F00428
b =0xC0F0043C
b =0xC0F00450
b =0xC0F00454
b =0xC0F00468
그리고,, 인터럽트 인에블 시키고, 레벨 셋팅하는 루틴 추가하고..
// unmask all interrupt
ldr r0, =SA1110_REG_BASE_INTERRUPT
mov r1, #0xff
str r1, [r0,
#SA1110_REG_OFFSET_ICMR]
// interrupt control level setup -
currently set up as IRQ
ldr r0, =SA1110_REG_BASE_INTERRUPT
mov r1, #0x00
str r1, [r0,
#SA1110_REG_OFFSET_ICLR]
// jump to init function
// init function is just after
exception vectors
ldr r0, =EZ_M01_APP_ENTRY (제 어플
리케이션 엔트리)
mov pc, r0
그리고,
entry.S 를
...초략
// 0xC0F0044F + 0x4 = 0xC0F00454
IRQ_handler_asm:
ldmia sp!, {r8}
stmfd sp!, {r0-r12,lr}
bl IRQ_handler_app
ldmfd sp!, {r0-r12, lr}
subs pc,r14,#4
//0xC0F00453 + 0x14 = 0xC0F00468
FIQ_handler_asm:
ldmia sp!, {r8}
stmfd sp!, {r0-r12,lr}
bl FIQ_handler_app
ldmfd sp!, {r0-r12, lr}
subs pc,r14,#4
// 0xC0F0047C
bl init // 제 어플리케이션.
b _ram_entry
제 어플리케이션에서
// baud rate divisior(BRD) = 1 when baud rate is 115200
*(UTCR1) = 0x0;
*(UTCR2) = 0x1;
// all clear UTCR3
*(UTCR3) = 0x0;
// parity disable
*(UTCR0) &= ~PARITY_ENABLE;
// data bit 8 bit
*(UTCR0) |= EIGHT_BIT_DATA;
// stop bit 1 bit
*(UTCR0) &= ~TWO_STOP_BIT;
*(UTCR3) &= ~UTCR3_LBM;
// enable interrupt
*(UTCR3) |= TX_ENABLE;
*(UTCR3) |= RX_ENBALE;
// temporary for interrupt test
*(UTCR3) |= UTCR3_RIE;
이렇게 UART인터럽트 인에블 시키고,
제가 열심히 자판을 두드리면, 인터럽트가 걸려서, 제가 만든 인터럽트 핸들
러로 오도록
즉, start.S를 빌려서 제가 만든 어플리케이션으로 뛰도록 만들었습니다.
그리고 나서 인터럽트를 받을수 있도록 고치는중인데요...
이지부트의 컴파일과 링크단위가 디렉토리이고, 제가 만든 인터럽트 핸들러
는 제 어플리케이션 디렉토리에 있는고로, start.S에서 직접 어드레스로 뛰도
럭 만들었어요.
_start: b Reset
b =0xC0F00400
b =0xC0F00414
b =0xC0F00428
b =0xC0F0043C
b =0xC0F00450
b =0xC0F00454
b =0xC0F00468
그리고,, 인터럽트 인에블 시키고, 레벨 셋팅하는 루틴 추가하고..
// unmask all interrupt
ldr r0, =SA1110_REG_BASE_INTERRUPT
mov r1, #0xff
str r1, [r0,
#SA1110_REG_OFFSET_ICMR]
// interrupt control level setup -
currently set up as IRQ
ldr r0, =SA1110_REG_BASE_INTERRUPT
mov r1, #0x00
str r1, [r0,
#SA1110_REG_OFFSET_ICLR]
// jump to init function
// init function is just after
exception vectors
ldr r0, =EZ_M01_APP_ENTRY (제 어플
리케이션 엔트리)
mov pc, r0
그리고,
entry.S 를
...초략
// 0xC0F0044F + 0x4 = 0xC0F00454
IRQ_handler_asm:
ldmia sp!, {r8}
stmfd sp!, {r0-r12,lr}
bl IRQ_handler_app
ldmfd sp!, {r0-r12, lr}
subs pc,r14,#4
//0xC0F00453 + 0x14 = 0xC0F00468
FIQ_handler_asm:
ldmia sp!, {r8}
stmfd sp!, {r0-r12,lr}
bl FIQ_handler_app
ldmfd sp!, {r0-r12, lr}
subs pc,r14,#4
// 0xC0F0047C
bl init // 제 어플리케이션.
b _ram_entry
제 어플리케이션에서
// baud rate divisior(BRD) = 1 when baud rate is 115200
*(UTCR1) = 0x0;
*(UTCR2) = 0x1;
// all clear UTCR3
*(UTCR3) = 0x0;
// parity disable
*(UTCR0) &= ~PARITY_ENABLE;
// data bit 8 bit
*(UTCR0) |= EIGHT_BIT_DATA;
// stop bit 1 bit
*(UTCR0) &= ~TWO_STOP_BIT;
*(UTCR3) &= ~UTCR3_LBM;
// enable interrupt
*(UTCR3) |= TX_ENABLE;
*(UTCR3) |= RX_ENBALE;
// temporary for interrupt test
*(UTCR3) |= UTCR3_RIE;
이렇게 UART인터럽트 인에블 시키고,
제가 열심히 자판을 두드리면, 인터럽트가 걸려서, 제가 만든 인터럽트 핸들
러로 오도록