5598|9

58

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

EXTI的中断问题 [复制链接]

                                 stm32例子中的EXTI中断程序的开始都有一个功能是查哪个管脚发生的,以EXTI15_10_IRQHandler为例,在程序开始的时候都有一个语句:EXTI_GetITStatus判断是否是特定的管脚发生了中断,我的理解是如果只开放了一个中断源(比如我只设定了PB15作为中断)就不需要做这个检查了,可是我发现如果不做这个检测就会得到错误的结果。从程序上看即使只发生了一个中断,也必须做一个检查,然后再清除中断位才能得到正确的结果,否则会两次进入中断。现在有什么办法可以不做这个检查,因为我想提高中断的速度,有什么好办法吗?
此帖出自stm32/stm8论坛

最新回复

                                 EXTI->PR=0x8000;if(sendvalue&0x80000000)     GPIOB->BSRR=0x4000;else     GPIOB->BRR=0x4000;sendvalue=sendvalue<<1;TIM3->CNT=0;   详情 回复 发表于 2009-1-8 11:53
点赞 关注
 

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

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

                                 请贴程序。
此帖出自stm32/stm8论坛
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

我的中断程序如下

 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依次输出各位
此帖出自stm32/stm8论坛
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

4
 

如何初始化EXTI?

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

是否应该是:
   if(EXTI->PR&0x8000)
此帖出自stm32/stm8论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

5
 

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

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

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 

如何初始化EXTI?

几个提议:

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

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

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

回复

82

帖子

0

TA的资源

一粒金砂(初级)

7
 

初始化的程序如下

  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))访问却不正确

此帖出自stm32/stm8论坛
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

8
 

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

                                 你的外部脉冲是什么设备产生的?
此帖出自stm32/stm8论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

9
 

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

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

回复

75

帖子

0

TA的资源

一粒金砂(初级)

10
 

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

EXTI->PR=0x8000;

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

sendvalue=sendvalue<<1;
TIM3->CNT=0;
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表