外部中断的一个现象?

2019-07-20 20:44发布

当外部中断服务函数里只写一句翻转io的代码的时候,实验现象是有时能翻转有时不能翻转,但当我加一句延时1us后,就每次都能翻转了,为什么会这样?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
27条回答
dfbb123
1楼-- · 2019-07-23 11:36
103和407都有这个现象。我估计我是找不出问题所在了,其实这现象到也好克服大不了加一句delay_us(1);好了,只是不能弄明白,总觉学stm32学得不那么踏实罢了。
dfbb123
2楼-- · 2019-07-23 15:04
 精彩回答 2  元偷偷看……
特朗姆斯
3楼-- · 2019-07-23 17:47
dfbb123 发表于 2016-8-9 19:10
你觉得有必要?好吧那就贴下中断服务函数里的内容吧
void EXTI4_IRQHandler(void)
{

我看了一下你是先翻转电平再清中断标志,那么进入两次中断也没有什么好奇怪的

你试一下进中断服务程序之后先清中断标志,再翻转电平看效果。
dfbb123
4楼-- · 2019-07-23 21:01
 精彩回答 2  元偷偷看……
特朗姆斯
5楼-- · 2019-07-23 21:39
dfbb123 发表于 2016-8-11 21:41
高手啊,如此写现象确实正常了,不过我又发现也可以不把翻转代码放到请标志之后,只要在清标志后面加代码 ...

很敬佩你的钻研精神,但是你表达出来的意思有点难以理解

“加的代码可以是任意无用的”这句话是什么意思?后面一句“清标志后面要有代码”又是什么意思?

dfbb123
6楼-- · 2019-07-24 00:05
本帖最后由 dfbb123 于 2016-8-12 18:32 编辑
特朗姆斯 发表于 2016-8-12 10:06
很敬佩你的钻研精神,但是你表达出来的意思有点难以理解

“加的代码可以是任意无用的”这句话是什么意 ...

谢谢你的夸奖,原来这叫专研精神,我还以为是走火入魔呢
我贴个代码给我看吧,
void EXTI2_IRQHandler(void)
{
        PCout(13)=!PCout(13);
        num++;
         EXTI-> PR=1<<2;  // &#199;&#229;3yLINE2é&#207;μ&#196;&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;  
        LED0=1;
        
}
看到那个LED0=1;了吗,这个就是任意无用的代码,你也可以写别的随便什么代码,关键是要放在清标志后面,有了这个代码程序就正常,拿掉就会进2次中断。
同理 EXTI->IMR&=~(1<<11); // 屏蔽line11上的中断
        EXTI-> PR=1<<11;  // 清除LINE11上的中断标志位
这样写也是会进2次中断才关闭中断的。要掉过来写的。
你讲的把翻转放到清标志后面就是起到标志后面有代码的作用,当然区别是这是有用的代码,所以当然也有效了。我观察到现象,也能排除现象,就是不懂为什么会这样?
      

一周热门 更多>