搜索
bottom↓
回复: 3

如何检测AT91SAM两个IO管脚的中断,代码如下,麻烦帮看一下。

[复制链接]

出0入0汤圆

发表于 2009-3-24 22:28:25 | 显示全部楼层 |阅读模式
麻烦大家帮我看一下我的代码,我现在需要用PA23,PA24分别检测两路脉冲输入计数,用的 IO中断,另外再用一个1S的RTT定时器计数,现在是我该如何判定是哪个管脚发生的中断,程序该如何修改。我用的是AT91SAM7S128,麻烦指点一下啊 。

#define pulse1_key          (1<<23)
#define pulse2_key          (1<<24)

void isr_pio(void) __irq
{
  uint sr=0;
  sr=AT91C_BASE_PIOA->PIO_ISR;
//  printfint(sr);
//  if((AT91F_PIO_GetInput(AT91C_BASE_PIOA) &  pulse1_key ) == 0)
//  if(sr&pulse1_key  == 0x00000 )   //檢測pulse1_key是否髮生狀態改變。
  pulse_counter1=pulse_counter1+1;
//  if((AT91F_PIO_GetInput(AT91C_BASE_PIOA) &  pulse2_key ) == pulse2_key)   //檢測pulse1_key是否髮生狀態改變。
//  pulse_counter2=pulse_counter2+1;
  Trace_Toggel_LED( AT91B_LED3) ;

//避免编译时产生警
//  sr =sr;
//* 等待释放
//  while ( (AT91F_PIO_GetInput(AT91C_BASE_PIOA) & pulse1_key ) != pulse1_key);
  AT91C_BASE_AIC->AIC_EOICR = 0;                //        End of Interrupt Command Register
  
}
void init_PIO(void)
{                  

  AT91C_BASE_AIC->AIC_IDCR = (1 << AT91C_ID_PIOA);                                    //首先禁止相应PIO中断
  AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOA] = AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE  |AT91C_AIC_PRIOR_1;//设置PIO中断优先级,大于串口中断小于rtt中断 ,外部中断源负边缘变化
  AT91C_BASE_AIC->AIC_SVR[AT91C_ID_PIOA] = (unsigned int) *isr_pio;
  AT91C_BASE_PIOA->PIO_IDR= 0xffffffff;                                        //禁止所有IO口中断
  AT91C_BASE_AIC->AIC_ICCR = (1 << AT91C_ID_PIOA);                             //清除中断标志
  AT91C_BASE_AIC->AIC_IECR = (1 << AT91C_ID_PIOA);                                    //激活相应PIO中断
//  AT91C_BASE_PIOA->PIO_IER = pulse1_key|pulse2_key;                            //激活PIO相应管脚中断
  AT91C_BASE_PIOA->PIO_IER = pulse1_key;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2009-3-25 13:19:55 | 显示全部楼层
if((AT91F_PIO_GetInput(AT91C_BASE_PIOA) &  pulse1_key ) == pulse1_key)

这样检测好像有问题,

pulse_counter1=pulse_counter1+1不执行,也就是这样检测管脚状态不对

if((AT91F_PIO_GetInput(AT91C_BASE_PIOA) &  pulse1_key ) == 0) .

倒是可以让pulse_counter1变化。

但是这样检测没有意义,不能确定到底是哪个IO状态变化的啊

出0入0汤圆

发表于 2009-5-25 18:38:38 | 显示全部楼层
发现KEIL这样编译才对if((AT91F_PIO_GetInput(AT91C_BASE_PIOA) &  pulse1_key ) == 0) .

出0入0汤圆

发表于 2010-9-22 09:52:05 | 显示全部楼层
是程序问题吧,呵呵
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 19:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表