打印

ATMEL at91sam7x DMA可以,中断不退出

[复制链接]
2944|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
WJL5766|  楼主 | 2010-5-23 11:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
打算设计使用ssc传输数据,ssc采用loop模式,发和收管脚连接。在不采用dma和中断时候,寄存器收发都是正常的,采用DMA形式,数据收发也是可以的,但在采用中断触发的时候,可以进入中断函数,但是执行完,中断却不退出,感觉中断配置没问题,很费解。
   下面是调试程序,请大家帮看看问题出在哪。
void AT91F_AIC_configure(void)
{
        AT91PS_AIC pAIC=AT91C_BASE_AIC;
  // Disable the interrupt
    pAIC->FAIC_IDCR |= 1 << AT91C_ID_SSC;
      
     // Configure mode and handler
        pAIC->FAIC_SVR[AT91C_ID_SSC] = (unsigned int) SSC_handler;
        pAIC->FAIC_SMR[AT91C_ID_SSC] = AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE|0x0;
      
     // Clear interrupt
     
      pAIC->FAIC_ICCR |= 1 << AT91C_ID_SSC;
}
     
void SSC_handler(void)
{
    unsigned int receivedata;
    AT91PS_SSC ssc = AT91C_BASE_SSC;
    AT91PS_AIC pAIC=AT91C_BASE_AIC;

   //disable aic
        pAIC->FAIC_IDCR |= 1 << AT91C_ID_SSC;
        if(ssc->FSSC_SR & AT91C_SSC_RXRDY)
      {
          receivedata=ssc->FSSC_RHR;
        printf("receivedata=%x\r\n",receivedata);
        }
  //clear aic
        pAIC->FAIC_ICCR |= 1 << AT91C_ID_SSC;
  //enable aic
        pAIC->FAIC_IECR |= 1 << AT91C_ID_SSC;

     pAIC->FAIC_EOICR=1 << AT91C_ID_SSC;
}
void AT91F_ssc_send(unsigned int senddata)
{
    AT91PS_SSC ssc = AT91C_BASE_SSC;
    AT91PS_AIC pAIC=AT91C_BASE_AIC;   
    while ((ssc->FSSC_SR & AT91C_SSC_TXRDY) == 0);
    ssc->FSSC_THR = senddata;
   
    printf("senddata=%x\r\n",senddata);
}
void SSC_test(void)
{
         AT91F_ssc_send(0x5a;
   printf("had send\r\n");

}
进入中断函数SSC_handler执行完应该退出中断,但是程序不知道去了哪里,没有打印printf("senddata=%x\r\n",senddata);这句。

相关帖子

沙发
xinzha| | 2010-5-23 12:28 | 只看该作者
是发生中断之后直接调用这个函数,还是有上面一层中断处理函数来调用这个?如果有上一层的把上一层的贴出来看看吧。

使用特权

评论回复
板凳
WJL5766|  楼主 | 2010-5-23 13:03 | 只看该作者
发生中断后自动直接调用的,没有嵌套中断

使用特权

评论回复
地板
xinzha| | 2010-5-23 13:21 | 只看该作者
如果是直接调用这个函数,那么在函数声明的时候要加__irq,向编译器声明这是个中断处理函数,arm对于普通函数和中断处理函数的处理有巨大差异,不能混用。

使用特权

评论回复
5
WJL5766|  楼主 | 2010-5-23 13:53 | 只看该作者
哦,我改成__irq void SSC_handler(void) 后编译报错,是不是要包含什么库函数?第一次用这个,见谅

使用特权

评论回复
6
xinzha| | 2010-5-23 14:34 | 只看该作者
要写成void __irq ssc_handler(void)这种形式,另外这个可能跟编译器有关,我用的rvds,内嵌编译器是armcc

使用特权

评论回复
7
WJL5766|  楼主 | 2010-5-23 14:37 | 只看该作者
好的,多谢,明天上班试一下

使用特权

评论回复
8
WJL5766|  楼主 | 2010-5-24 09:53 | 只看该作者
改成 void __irq ssc_handler(void) 也还是报错,报错是  
error: exported '=',' , ',' ';' , 'asm' or '__attribute__' before 'ssc_handler'
是和编译器有关吗

使用特权

评论回复
9
xinzha| | 2010-5-24 10:25 | 只看该作者
应该是,你去查一下你的编译器声明ISR的关键字吧。

使用特权

评论回复
10
WJL5766|  楼主 | 2010-5-24 13:57 | 只看该作者
用的编译器是WinARM,看例程中用的__inline 。我在头函数中#define __inline,然后对函数定义为__inline void ssc_handler(void),编译是可以通过,但是还是进入中断出不来,是我用的中断修饰符不对吗,应该是什么样子的,还是说有其他原因,请再帮分析下原因吧,谢谢

使用特权

评论回复
11
xinzha| | 2010-5-24 16:15 | 只看该作者
__inline是内联,跟__irq差别是很大的,主要是在中断发生时,arm要做一系列跟普通调用不一样的操作,如果还是按照普通函数处理,必然会导致一些问题。而如果你的异常处理函数中已经做了完整的保护,也是可以这么写的,看不到你的工程,我也不能下结论。
WinARM确实是没听说过,不知道它的关键字是什么样的。

使用特权

评论回复
12
WJL5766|  楼主 | 2010-5-24 21:52 | 只看该作者
看WinARM例程中断服务函数用的__ramfunc,我采用__ramfunc void ssc_handler(void)还是不行,不知道__ramfunc是不是中断的修饰符,有知道的希望给点建议,看看是哪里的问题,谢谢

使用特权

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

本版积分规则

4

主题

17

帖子

0

粉丝