Chinaunix首页 | 论坛 | 博客
  • 博客访问: 933883
  • 博文数量: 153
  • 博客积分: 4195
  • 博客等级: 上校
  • 技术积分: 2631
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-22 11:32
文章存档

2012年(7)

2010年(35)

2009年(111)

分类:

2009-06-26 14:11:52

最近在研究低功耗,刚好要用到处理器的快速中断处理,发现之前的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上下载。
 
 
阅读(1167) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

土土狗2009-07-02 10:17:18

就万用表串在1117的out上测量的。

chinaunix网友2009-07-02 09:33:37

我具体没有测过,问了强哥说是正常的,你是通过什么方式来测core的电流的,需要一些特殊的设备么?

土土狗2009-07-02 09:31:02

请问博主你用SEP4020,VCORE的电流可以做到多少ma? 我现在有70多ma是不是不正常啊?normal模式。