免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2812 | 回复: 6
打印 上一主题 下一主题

中断接收失败(RM9200) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-06 22:32 |只看该作者 |倒序浏览
5可用积分
在应用程序主函数中调用中断0初始化函数,然后有个while循环。不断循环的过程中接受中断。可是现在进不了中断服务程序,发一个终端信号过来及提示“Spurious Interrupt detected”,这是执行了init.c这个文件中的AT91F_SpuriousHandler()函数。然后再来中断信号就啥反应都没了。很纳闷,关键是以前调试过是可以的,怎么现在突然就不行了。

这是中断0的初始化函数:
  1. [/code]void Irq0Init()
  2. {
  3.         AT91C_BASE_PIOB->PIO_PDR |= AT91C_PIO_PB29;
  4.         AT91C_BASE_PIOB->PIO_ASR |= AT91C_PB29_IRQ0;
  5.         AT91F_PMC_EnablePeriphClock((AT91PS_PMC) AT91C_BASE_PMC, AT91C_ID_IRQ0);
  6.         AT91F_AIC_ConfigureIt(
  7.                 AT91C_BASE_AIC,
  8.                 AT91C_ID_IRQ0,
  9.                 AT91C_AIC_PRIOR_HIGHEST,
  10.                 AT91C_AIC_SRCTYPE_EXT_POSITIVE_EDGE,
  11.                 AT91F_ASM_IRQ0_Handler
  12.                 );
  13.         AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_IRQ0);
  14. }
  15. [code]
复制代码

这是中断处理函数:
  1. [/code]
  2. void AT91F_IRQ0_Handler() //WriteVXIDataLow()
  3. {
  4.         ushort command;
  5.         char buf[3];
  6.         irq0_flag=1;

  7.         command = *(VXI_REG_E);
  8.         dataLow = command & 0x00FF;
  9.         dataHigh = (command >> 8) & 0x00FF;
  10.        
  11.                
  12.                
  13.         sprintf(buf,"\r0x%x%x\n",dataHigh,dataLow);
  14.         AT91F_DBGU_Printk(buf);
  15.                
  16.         writeDataFlag = 1;       

  17. }
  18. [code]
复制代码

没辙了,请各位大侠给指点指点!

主函数为:
  1. int main()
  2. {
  3.         unsigned int i=0;

  4.         AT91F_DBGU_Printk("\n\n\r-I- ======================================\n\r");
  5.         AT91F_DBGU_Printk("-I- FFT-RM9200 Zhongduan Test\n\r");
  6.         AT91F_DBGU_Printk("-I- --------------------------------------\n\r");
  7.     //***************************************************************************
  8.     //
  9.     //          进行中断的初始化
  10.     //
  11.     //***************************************************************************
  12.    
  13.     //1-1 引脚PB29设置为IRQ0的功能

  14.         AT91F_PIO_CfgPeriph(
  15.                             AT91C_BASE_PIOB, // PIO controller base address
  16.                                 ((unsigned int) AT91C_PB29_IRQ0),
  17.                                                 0); // Peripheral B


  18.         AT91F_AIC_ConfigureIt (
  19.                 AT91C_BASE_AIC,                        // AIC base address
  20.                 AT91C_ID_IRQ0,                         // System peripheral ID
  21.                 AT91C_AIC_PRIOR_HIGHEST,               // Max priority
  22.                 AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED,
  23.                 AT91F_IRQ0_ASM_HANDLER );
  24.                        
  25. // Enable IRQ0 interrupt
  26.         AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_IRQ0);
  27.    
  28.    
  29.    

  30.         while(1)
  31.       {
  32.           //如果检查到,IRQ0中断发生的标志,则向串口输出数据
  33.           if(irq0_flag==1)
  34.              {
  35.                      AT91F_DBGU_Printk("-I- FFT-RM9200 Zhongduan generate\n\r");
  36.                      i=i+1;
  37.                      irq0_flag=0;
  38.              }       

  39.           }
  40. }
复制代码

[ 本帖最后由 yjz98 于 2009-7-7 14:51 编辑 ]

论坛徽章:
5
2 [报告]
发表于 2009-07-06 23:03 |只看该作者
把代码先用[code][/code]封起来

论坛徽章:
5
3 [报告]
发表于 2009-07-07 09:17 |只看该作者
不是很明白.

1. 应用程序中做中断处理?

"然后有个while循环。不断循环的过程中接受中断。"
2. While的代码呢? 你这是polling方式, 还是中断方式?

论坛徽章:
0
4 [报告]
发表于 2009-07-07 11:01 |只看该作者

回复 #3 yidou 的帖子

int main()
{
        unsigned int i=0;
    //          进行中断的初始化
      
    //1-1 引脚PB29设置为IRQ0的功能

        AT91F_PIO_CfgPeriph(
                            AT91C_BASE_PIOB, // PIO controller base address
                                ((unsigned int) AT91C_PB29_IRQ0),
                                                0); // Peripheral B


        AT91F_AIC_ConfigureIt (
                AT91C_BASE_AIC,                        // AIC base address
                AT91C_ID_IRQ0,                         // System peripheral ID
                AT91C_AIC_PRIOR_HIGHEST,               // Max priority
                AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED,
                AT91F_IRQ0_ASM_HANDLER );
                       
// Enable IRQ0 interrupt
        AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_IRQ0);  
   
   

        while(1)
      {
          //如果检查到,IRQ0中断发生的标志,则向串口输出数据
          if(irq0_flag==1)
             {
                     AT91F_DBGU_Printk("-I- FFT-RM9200 Zhongduan generate\n\r");
                     i=i+1;
                     irq0_flag=0;
             }       

          }
}

用示波器看了 明明有中断信号产生,就是收不到

论坛徽章:
5
5 [报告]
发表于 2009-07-07 11:38 |只看该作者
啥时候 irq0_flag = 1?
标志位没有置位.

论坛徽章:
0
6 [报告]
发表于 2009-07-07 14:55 |只看该作者

回复 #5 yidou 的帖子

我发帖的时候没搞对,在中断服务程序里对其进行了置为,现在的关键是进不了中断服务程序。你帮我看看在中断初始化那段有什么问题吗?以前收到过中断,现在不行了,用jtag可以探测内核,也可以通过调试串口收到打印出的字符,可就是接收不到中断,感觉是ARM里关于中断这一块坏了一样,不过这只是胡乱猜测而已,呵呵。

反汇编看到程序一直停在
                                00000010  [0xeafffffe]  b 0x10     这一行。

[ 本帖最后由 yjz98 于 2009-7-7 14:57 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2009-07-07 22:46 |只看该作者

回复 #5 yidou 的帖子

现在表面上暂时看解决了问题,不是老是进入伪中断处理吗?我把伪中断向量在AIC初始化的时候也指向了中断处理函数,这样的话就可以进入中断服务函数了。不知道这样会不会有其他的副作用出来。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP