打印
[其他ST产品]

有关STR7 EIC

[复制链接]
2803|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
crazybee|  楼主 | 2007-9-17 12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
EIC->IVR = (u32)T3TIMI_IRQHandler;

EIC->SIR[T3TIMI_IRQChannel] = ((u16)T3TIMI_IRQHandler << 16);

EIC_IRQChannelConfig(T3TIMI_IRQChannel, ENABLE);

EIC_IRQChannelPriorityConfig(T3TIMI_IRQChannel, 1);

EIC->IVR 这里的高16位,置成中断ISR入口地址的高16位!  可以随便给个中断ISR吗? 不同的ISR高16位不一样,怎么?

沙发
ARM白痴| | 2007-9-17 16:51 | 只看该作者

我也不知道0xE59F0000怎么来的...

void EIC_Init(void)
{
  extern u32 T0TIMI_Addr;
  u8 bCounter;
  u32 dOffset=((u32)&T0TIMI_Addr);

  /* Disable FIQ and IRQ interrupts */
  EIC->ICR = 0x00000000; 

  /* Disable all channels interrupts */
  EIC->IER = 0x00000000; 

  /* Clear all pending bits */
  EIC->IPR = 0xFFFFFFFF; 

  /* Disable all FIQ channels interrupts and clear FIQ */
  EIC->FIR = 0x0000000C; 

  /* channels pending bits */
  /* Ste the current priority level to zero */                         
  EIC->CIPR = 0x00000000; 

  /* IVR = high half of load PC instruction */
  EIC->IVR  = 0xE59F0000; 

  dOffset = (dOffset+0x00007E0)<<16;

  /* Initialize SIRn registers */
  for(bCounter=0; bCounter<32; bCounter++) 
  {
    EIC->SIR[bCounter] = dOffset|0xF0000000;
    dOffset += 0x00000004 << 16;
  }
}

使用特权

评论回复
板凳
ARM白痴| | 2007-9-17 16:55 | 只看该作者

查看710的存储器空间映射,0xE59F0000是空的

使用特权

评论回复
地板
JIANG_WX| | 2007-9-17 17:15 | 只看该作者

EIC->IVR = (u32)T3TIMI_IRQHandler???

EIC->IVR = (u32)T3TIMI_IRQHandler???
你从哪里看到上述使用方法的?看来你对ARM7的EIC还不是很清楚.
关于EIC的正确使用,请参考以下代码:

/*******************************************************************************
* Function Name  : EIC_Init
* Description    : Initialise the EIC using the load PC instruction
*                  (PC = PC +offset)
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void EIC_Init(void)
{
  extern u32 T0TIMI_Addr;
  u8 bCounter;
  u32 dOffset=((u32)&T0TIMI_Addr);

  /* Disable FIQ and IRQ interrupts */
  EIC->ICR = 0x00000000; 

  /* Disable all channels interrupts */
  EIC->IER = 0x00000000; 

  /* Clear all pending bits */
  EIC->IPR = 0xFFFFFFFF; 

  /* Disable all FIQ channels interrupts and clear FIQ */
  EIC->FIR = 0x0000000C; 

  /* channels pending bits */
  /* Ste the current priority level to zero */                         
  EIC->CIPR = 0x00000000; 

  /* IVR = high half of load PC instruction */
  EIC->IVR  = 0xE59F0000; 

  dOffset = (dOffset+0x00007E0)<<16;

  /* Initialize SIRn registers */
  for(bCounter=0; bCounter<32; bCounter++) 
  {
    EIC->SIR[bCounter] = dOffset|0xF0000000;
    dOffset += 0x00000004 << 16;
  }
}
注:在vector表(从地址0开始)的后面定义:
   T0TIMI_Addr DCD T0TIMIIRQHandler

使用特权

评论回复
5
starm| | 2007-9-17 18:49 | 只看该作者

不同的ISR高16位不一样,怎么?

所有isr代码必须在同一个 64KB 区域。 也就是isr高十六位必须一样, 这是str7的特点?

使用特权

评论回复
6
crazybee|  楼主 | 2007-9-18 08:37 | 只看该作者

回JIANG_WX ,ARM白痴 !

上面的代码是COPY自KEIL下例程!和你发的,IRQ中断管理方式不同!

KEIL 实现中是将IVR中的内部当成当前IRQ的中断入口地址来实现的!

你发的这个是将IVR内容当成 LDR PC,[PC,#offset]这条指来实现!

/* IVR = high half of load PC instruction */
  EIC->IVR  = 0xE59F0000;   是指令代码!

这里有没有讨论STR7的群啊?

使用特权

评论回复
7
ARM白痴| | 2007-9-18 08:55 | 只看该作者

不明白2个地方,请问JIANG_WX,谢谢

1.
/* IVR = high half of load PC instruction */
  EIC->IVR  = 0xE59F0000; 
0xE59F0000怎么来的?0xE59Fxxxx这些空间本来就是空的.
2.
dOffset = (dOffset+0x00007E0)<<16;

  /* Initialize SIRn registers */
  for(bCounter=0; bCounter<32; bCounter++) 
  {
    EIC->SIR[bCounter] = dOffset|0xF0000000;
    dOffset += 0x00000004 << 16;
  }


0x00007E0是什么?
dOffset|0xF0000000?

使用特权

评论回复
8
crazybee|  楼主 | 2007-9-18 19:52 | 只看该作者

楼下的

楼下的,不是告诉你了嘛,
/* IVR = high half of load PC instruction */
  EIC->IVR  = 0xE59F0000; 

IVR[31-15] -》是LDR PC指令啊!

dOffset = (dOffset+0x00007E0)<<16;是第一个IRQ通道的入口地址!

使用特权

评论回复
9
ARM白痴| | 2007-9-19 11:26 | 只看该作者

感谢楼上的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

149

主题

800

帖子

5

粉丝