最近在研究低功耗,刚好要用到处理器的快速中断处理,发现之前的sample代码都没有对fiq进行处理,于是花了点时间为sep4020添加了中断处理。
1.为fiq模式添加相应的中断返回,这部分其实还是比较简单的,和irq模式类似,在中断向量表中添加相应的中断返回的代码,如下:
FIQ_DO
sub r14, r14, #4
stmfd sp!, {r14}
mrs r14, spsr
stmfd sp!, {r14}
stmfd sp!, {r0-r7}
;----------------------------- ; search the irq vector and jump to isr
IMPORT FiqVectorHandler
bl FiqVectorHandler
;----------------------------- ; restore the register
ldmfd sp!, {r0-r7}
ldmfd sp!, {r14}
msr spsr_csxf, r14
ldmfd sp!, {pc}^
2.为fiq模式添加中断处理函数,也就是在中断返回中会调用的FiqVectorHandler函数:
INT_VECTOR fvector[] =
{
/* interrupt number, handler */
{ 0, FiqIntKey },
{ 1, FiqIntKey },
{ 2, FiqIntKey },
{ 3, FiqIntKey },
};
void FiqVectorHandler(void)
{
U32 intnum;
U8 i = 0;
intnum = *(RP)(INTC_FIFSR);
while (intnum !=1)
{
intnum = intnum >> 1;
i++;
}
(*fvector[i].handler)();
return;
}
3.配置相应的intc寄存器,打开快速中断使能,关闭快速中断屏蔽
*(RP)INTC_FIMR = 0x0;
*(RP)INTC_FIER = 0xf;
4.配置相应的gpio管脚为快速中断配置
*(RP)GPIO_PORTF_SEL |= 0x0f;
*(RP)GPIO_PORTF_DIR |= 0xf;
*(RP)GPIO_PORTF_INCTL |= 0xf;
*(RP)GPIO_PORTF_INTRCTL |= 0x3f;
*(RP)GPIO_PORTF_INTRCLR |= 0x001F ; //清除中断
*(RP)GPIO_PORTF_INTRCLR = 0x0000 ; //清除中断
在调试过程中发现我认为所有的地方都修改了之后,系统竟然对fiq没有任何反应,跟踪代码之后发现连fiq的中断模式都没有进,仔细分析之后发现原来我们之前的启动代码打开了fiq的中断禁止位,把这点修正了就正常工作了。
以上代码均以sep4020的sample代码示例,各位若有兴趣可到source.armfans.net上下载。
阅读(1360) | 评论(3) | 转发(0) |