打印

EXTI的中断问题

[复制链接]
2357|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ninesunsz|  楼主 | 2009-1-7 14:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
stm32例子中的EXTI中断程序的开始都有一个功能是查哪个管脚发生的,以EXTI15_10_IRQHandler为例,在程序开始的时候都有一个语句:EXTI_GetITStatus判断是否是特定的管脚发生了中断,我的理解是如果只开放了一个中断源(比如我只设定了PB15作为中断)就不需要做这个检查了,可是我发现如果不做这个检测就会得到错误的结果。从程序上看即使只发生了一个中断,也必须做一个检查,然后再清除中断位才能得到正确的结果,否则会两次进入中断。现在有什么办法可以不做这个检查,因为我想提高中断的速度,有什么好办法吗?
沙发
香水城| | 2009-1-7 15:07 | 只看该作者

你的中断程序是什么样的?

请贴程序。

使用特权

评论回复
板凳
ninesunsz|  楼主 | 2009-1-7 16:42 | 只看该作者

我的中断程序如下

 if(sendvalue&0x80000000)
     GPIOB->BSRR=0x4000;
else
     GPIOB->BRR=0x4000;
  sendvalue=sendvalue<<1;
  TIM3->CNT=0;
EXTI->PR=0x8000
不能正常工作,而改成
if(EXTI->PR&0x80000000)
{
 if(sendvalue&0x80000000)
     GPIOB->BSRR=0x4000;
else
     GPIOB->BRR=0x4000;
  sendvalue=sendvalue<<1;
  TIM3->CNT=0;
EXTI->PR=0x8000
}
我用PB15的脉冲触发中断,进入中断以后在PB14依次输出各位

使用特权

评论回复
地板
香水城| | 2009-1-7 17:28 | 只看该作者

如何初始化EXTI?

这一句是不是写错了?
   if(EXTI->PR&0x80000000)

是否应该是:
   if(EXTI->PR&0x8000)

使用特权

评论回复
5
ninesunsz|  楼主 | 2009-1-7 19:52 | 只看该作者

这句确实搞错了,拷贝过来的

时候搞错了,原来程序中是对的,否则相应就不能工作了。应该是EXTI->PR&0x8000我原来的程序一直都不能正常工作,后来我在中断中加了这个查询中断标志位就一切正常了,如果说是由于有其他中断造成有一点就解释不通了,因为我在中断程序只清除了15位的标志,如果有其他的中断应该会再次进入,可是实际中情况确是如果不查询只是清除中断标志位就会出现两次进入中断的情况,如果查询标志位后再清除就只进入一次中断

使用特权

评论回复
6
香水城| | 2009-1-7 20:38 | 只看该作者

如何初始化EXTI?

几个提议:

1)请贴出你的初始化程序。

2)用示波器看看,你的外部信号是否有毛刺。

3)不进行查询,但读出SR的内容并存储下来,然后在你认为多余的中断时,SR的内容是什么。

使用特权

评论回复
7
ninesunsz|  楼主 | 2009-1-7 21:15 | 只看该作者

初始化的程序如下

  NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);  


  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource15);
 
  EXTI_InitStructure.EXTI_Line = EXTI_Line15;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure); 
我以前用逻辑分析仪看过波形,没有发现毛刺,明天准备按照版主的说法存储SR的内容看看,顺便问下EXTI的PR支持bit band操作吗?我看手册好像是支持的,可是用(PERIPH_BB_BASE+(EXTI_BASE-PERIPH_BASE+0x14)*32)+(15*4))访问却不正确

使用特权

评论回复
8
香水城| | 2009-1-7 21:24 | 只看该作者

一般来说,逻辑分析仪找不到毛刺的,必须用示波器看

你的外部脉冲是什么设备产生的?

使用特权

评论回复
9
ninesunsz|  楼主 | 2009-1-7 21:49 | 只看该作者

外部脉冲是PLC产生的一个差分信号作为也给同步时钟信号

通过max490输入stm32,以前我用示波器看过stm32的输入端,上升沿上有点过冲但是没有发现明显的毛刺,明天再用示波器仔细看看

使用特权

评论回复
10
ST_ARM| | 2009-1-8 11:53 | 只看该作者

你把顺序改成如下试一试:

EXTI->PR=0x8000;

if(sendvalue&0x80000000)
     GPIOB->BSRR=0x4000;
else
     GPIOB->BRR=0x4000;

sendvalue=sendvalue<<1;
TIM3->CNT=0;

使用特权

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

本版积分规则

31

主题

82

帖子

1

粉丝