9861|7

80

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于STM32中断多进的问题总结 [复制链接]

1、问题提出:如果你操作不当STM32的中断每次会进2次。
2、验证方法:如下面的1ms中断程序:
void TIM6_IRQHandler(void)                  //1ms
{
  ms_100_cntdbu++;
  if ((TIM6->SR & 0x0001) != 0)    // check interrupt source
  {                 
                ms_100_cnt++;
                   TIM6->SR &= ~(1<<0);                          // clear UIF flag        
   }
               
}
     你会看到  ms_100_cntdbu =2*  ms_100_cn
如果增加硬件管脚指示,从示波器上很容易看到1ms内中断近了2次,但1ms中断技术没问题,也就是说SR标志清掉了,SR中也没有其他标志置位,进中断是保存下来看。
     其他所有的中断都是这个问题。我验证了,不是仿真,是真运行。
3、解决方法:清中断标志,只要不是中断函数的最后一条语句就没问题了。
4、指令流水线问题。其他的片子有的也会有这问题。
5、结论:如果你对程序要求不严,可以不用管它,不会影响到你应用的。否则参照3.
如果你的习惯是先清中断后干活,你不会碰到这个问题。如果你使用的是库函数差标志,也不会碰到这个问题。
此帖出自stm32/stm8论坛

最新回复

                                 查了一下公司的系统服务器,这个问题早在2008年已经以FAQ的形式解释过,并给出了分析和解决方法,我以前也没有注意到这个问题,这次有网友提出才去关注。 在ARM的系统架构下,这是一个普遍的问题,而不是STM32所特有的问题。 这个FAQ的内容如下: Q: When I cleared the interrupt as the last instruction in the ISR, the ISR code is called immediately upon exit half the time. Is there a possibility of race condition ? Answer: The core (Cortex-M3) generates bufferable write transfer. This mean that the CPU consider that the data is written from an AHB point of view while the APB write transfer is managed by the AHB2APB bridge and could be written later. In this case the CPU left the interrupt routine while the interrupt is not yet cleared the CPU will re-enter   again on the interrupt handler. To avoid this race condition : 1) ISR routine has to clear the interrupt  peripheral flag when just entering in the routine to avoid interrupt missing. 2)ISR routine has to Implement a write to the APB  peripheral register ( to clear the peripheral flag) then followed by a read  access to the same register/flag. This operation will force the write buffer to complete the effective write and will stall the CPU until the effective write of the bit in the register. Therefore  it is independent from the AHB/APB ratio prescaler. Here an example : STR R1, [R0, #0] ; Store R1 register  peripheral   register  ( or using bit-banding peripheral address) LDR R2, [R0, #0] ; Load the peipheral register; This will  hold the CPU until the effective write of R1. Use Cortex-M3 Bit-banding feature for interrupt clearing since it is an atomic operation and NVIC pending interrupts will be ignored during this operation, however Read-Modify-Write is not. ST网站的FAQ页面入口是:http://www.st.com/stonline/faq/user_faqbrowser.php 这几天这个页面出了点问题,正在检查维护,很快会恢复。  详情 回复 发表于 2010-7-21 10:02
点赞 关注(1)
 

回复
举报

68

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
能否给个详细分析?

如果真有这事,那串口通信应该不能正常进行了,每次进两次,那岂不接收数据全乱了?
此帖出自stm32/stm8论坛
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

你理解错了,进2次,但不影响应用的。第二次你查不到中断标志
此帖出自stm32/stm8论坛
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

4
 
这问题我遇到过,

因为只开一种中断,就把检查标志代码省了,

结果搞出N多莫名其妙的错误,
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 
                                 目前分析的初步结论是因为APB桥的延迟造成这个现象,还需进一步确认,我会不断更新。
此帖出自stm32/stm8论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

6
 
哇哇哇。。。

CPU从AHB的角度来看,数据已经写入(清零SR标志),实际上APB上的写操作需要由AHB2APB桥来管理,需要一定时间才能真正完成写操作(SR才能被清零)。那么当CPU退出中断ISR,此时SR还没有真正被清零,此时对应的pending bit仍旧置位,于是又一次触发了中断。

如何避免这个情况涅?
1)进入中断后,判断了相应标志位,就clear之,在作后续的处理。
2)如果你硬是要把清标志放在ISR最后,那么为了避免以上情况的发生,写完SR后,再读出来

哇哇哇。
此帖出自stm32/stm8论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

7
 
顶 LS。
没想到AHB2APB桥延迟时间这么大。

这多少是一个小的缺陷。
知道了很容易绕过去,
不知道有可能会在一个大跟头
此帖出自stm32/stm8论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

8
 
查了一下公司的系统服务器,这个问题早在2008年已经以FAQ的形式解释过,并给出了分析和解决方法,我以前也没有注意到这个问题,这次有网友提出才去关注。

在ARM的系统架构下,这是一个普遍的问题,而不是STM32所特有的问题。

这个FAQ的内容如下:

Q: When I cleared the interrupt as the last instruction in the ISR,
the ISR code is called immediately upon exit half the time. Is there a
possibility of race condition ?

Answer:
The core (Cortex-M3) generates bufferable write transfer. This mean
that the CPU consider that the data is written from an AHB point of
view while the APB write transfer is managed by the AHB2APB bridge and
could be written later. In this case the CPU left the interrupt
routine while the interrupt is not yet cleared the CPU will re-enter  
again on the interrupt handler. To avoid this race condition :

1) ISR routine has to clear the interrupt  peripheral flag when just
entering in the routine to avoid interrupt missing.

2)ISR routine has to Implement a write to the APB  peripheral register
( to clear the peripheral flag) then followed by a read  access to the
same register/flag. This operation will force the write buffer to
complete the effective write and will stall the CPU until the
effective write of the bit in the register. Therefore  it is
independent from the AHB/APB ratio prescaler.
Here an example :

STR R1, [R0, #0] ; Store R1 register  peripheral   register  ( or
using bit-banding peripheral address)

LDR R2, [R0, #0] ; Load the peipheral register; This will  hold the
CPU until the effective write of R1.

Use Cortex-M3 Bit-banding feature for interrupt clearing since it is
an atomic operation and NVIC pending interrupts will be ignored during
this operation, however Read-Modify-Write is not.


ST网站的FAQ页面入口是:http://www.st.com/stonline/faq/user_faqbrowser.php
这几天这个页面出了点问题,正在检查维护,很快会恢复。
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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