Witaj,
Zrobiłem kilka dużych projektów na tym STR912. Nie mam jednak kodu pod ręką więc napisze coś co Ci może pomóc a resztę wieczorem.
ARM, ma dwie linie przerwań, jedna IRQ druga FIQ, i tyle. Ten VIC jest zewnętrzny i nie ma nic do ARMa. Trzeba więc mieć:
1) Handler do IRQ ARMa, zwykle assembler, poszukaj plików *.s a w nich czegoś o nazwie "Vector Table"
2) Włączyć przerwania na poziomie ARM'a, niezależnie od VIC.
Dodano po 9 [minuty]:
Mniej więcej wygląda to tak:
;*******************************************************************************
; Exception vectors
;*******************************************************************************
LDR PC, Reset_Addr
LDR PC, Undefined_Addr
LDR PC, SWI_Addr
LDR PC, Prefetch_Addr
LDR PC, Abort_Addr
NOP ; Reserved vector
LDR PC, IRQ_Addr
...
IRQ_Addr DCD IRQHandler
...
;*******************************************************************************
;* Function Name : IRQHandler
;* Description : This function is called when IRQ exception is entered.
;* Input : none
;* Output : none
;*******************************************************************************
IRQHandler
portSAVE_CONTEXT ; Save the context of the current task.
LDR r0, = VectorAddress
LDR r0, [r0] ; Read the routine address
LDR r1, = VectorAddressDaisy
LDR r1, [r1]
MOV lr, pc
bx r0
LDR r0, = VectorAddress ; Write to the VectorAddress to clear the
STR r0, [r0] ; respective interrupt in the internal interrupt
LDR r1, = VectorAddressDaisy ; Write to the VectorAddressDaisy to clear the
STR r1,[r1] ; respective interrupt in the internal interrupt
portRESTORE_CONTEXT ; Restore the context of the selected task.
Tu akurat z FreeRTOS, stąd "portSAVE_CONTEXT", zwykle w tym miejscu ma być zapis na stos rejestrów. Ważne jest to że kod pobiera adres do którego ma skoczyć z VIC!
A jeszcze jedno. Po resecie, w kodzie assemblera musi się znaleźć inicjalizacja adresu stosu dla IRQ. Stos IRQ jest niezależny od kilku innych stosów które ARM wykorzystuje (nie ma sensu wyjaśniać zawiłości bo to ogólnie dostępna wiedza). Trzeba się upewnić, że stos jest gdzieś ustalony i że jest zainicjowany. Np, taki kod:
MSR CPSR_c, #Mode_IRQ|I_Bit|F_Bit ; No interrupts
LDR SP, = SFE(IRQ_STACK)