首先在一開始 配置 中斷向量時就會配置出
b ResetHandler
b HandlerUndef ;handler for Undefined mode
b HandlerSWI ;handler for SWI interrupt
b HandlerPabort ;handler for PAbort
b HandlerDabort ;handler for DAbort
b . ;reserved
b HandlerIRQ ;handler for IRQ interrupt
b HandlerFIQ ;handler for FIQ interrupt
這是一般一開始的配置
接下來就直接跳到 ResetHandler 去了
只有發生中斷時才會再回來這裡找
這裡的位址是 0x0000_0000 一開始的頭
發生中斷後 會回來這裡找 是那裡發生中斷再對著中斷跳到 nGCS6 所寫的中斷向量表
所以在 Initial 時一定也要配置好 中斷向量表
這裡 SRAM 的容量沒有用完 所以才會劃一半
跳到中斷向量表後 再去找 所對應的 向量後
再跳到 所對應的 函式去做
例子
在 main 中寫好中斷
static void __irq Eint0_ISR(void)
{
ClearPending(BIT_EINT0);
Uart_Printf("EINT0 is occurred.\n");
}
static void __irq Eint2_ISR(void)
{
ClearPending(BIT_EINT2);
Uart_Printf("EINT2 is occurred.\n");
}
static void __irq Eint11_19_ISR(void)
{
if(rEINTPEND & (1<<11))
{
Uart_Printf("EINT11 is occurred.\n");
rEINTPEND=(1<<11);
ClearPending(BIT_EINT8_23);
}
else if(rEINTPEND & (1<<19))
{
Uart_Printf("EINT19 is occurred.\n");
rEINTPEND=(1<<19);
ClearPending(BIT_EINT8_23);
}
else
{
Uart_Printf("others ENTs are occurred\n");
rEINTPEND=0xffffff;
ClearPending(BIT_EINT8_23);
}
}
發生 Eint0_ISR 中斷後會跳到
b HandlerIRQ ;handler for IRQ interrupt
回到 SRAM 的中斷向量表的頭
#define _ISR_STARTADDRESS 0x33ffff00
算出 偏移量
#define pISR_EINT0 (*(unsigned *)(_ISR_STARTADDRESS+0x20))
後回到 main 的
static void __irq Eint0_ISR(void)
{
ClearPending(BIT_EINT0);
Uart_Printf("EINT0 is occurred.\n");
}
完成中斷
以上例子取自 開發光碟 //2440
留言列表