查看: 3193|回复: 0

EXTI重复配置两次导致误触发中断的问题

[复制链接]
发表于 2016-9-29 09:55:55 | 显示全部楼层 |阅读模式
关键词: 触发中断 , 配置 , 融创芯城
1.webp.jpg


前言
有些工程师非常的小心,小心到甚至在程序中对一个外设配置完一次还不放心,还要再配置一次。这本身看起来没有什么问题,但是在特定的外设中,反而会不小心造成一些小问题,比如这里所要说的EXTI。

问题
某客户在其产品的设计中,使用了 STM32F302CCT6。客户在开发过程中,其所配置的 EXTI 外部中断,在外部没有中断信号的情况下,上电后运行程序,总是会进入 EXTI 中断程序一次。

调研
1.1.了解问题
客户在开发中使用了 STM32F30x 的标准外设库STM32F30x_DSP_StdPeriph_Lib_V1.2.3,在其程序设计中,参考了EXTI_Example 例程的代码,一开始在初始化过程中先执行了一次 EXTI15_10_Config()将 PC13 设置为外部中断口,设置为下降沿触发中断(PC13 外部有上拉电阻)。EXTI15_10_Config()函数原型如下:
2.webp.jpg

3.webp.jpg
客户在后面的程序中,在使用 EXTI 之前再调用了一次EXTI15_10_Config()将 PC13 设置为外部中断口。
调试运行的时候,发现 PC13 在没有外部触发下降沿信号的时候(经示波器确认),上电时总会进入外部中断服务程序EXTI15_10_IRQHandler中。
2.2.问题分析
如果仔细研究过程序,其实这个问题并不难知道。在执行第一次的 EXTI15_10_Config()之后,PC13 作为 EXTI13 外部中断已经开启。在这种情况下,如果再执行一次EXTI15_10_Config(),我们来看看这里边究竟有什么情况?
仔细查看EXTI15_10_Config()的程序内容,注意到这一句:
4.webp.jpg
也就是说,EXTI15_10_Config()调用了SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource13)来将 PC13配置为 EXTI13 中断源。来看一下SYSCFG_EXTILineConfig 这个函数的原型,它存在于stm32f30x_syscfg.c 文件中。
5.jpg
SYSCFG_EXTILineConfig这个函数的执行流程是这样的:先将 SYSCFG_EXTICR 外部中断配置寄存器中相对应的位清零,然后再写入新值。
也就是说,在此 PC13 作为 EXTI13 中断的例子中,当执行“SYSCFG->EXTICR[EXTI_PinSourcex>> 0x02] &=~tmp;”时,SYSCFG_EXTICR4 的EXTI13[3:0]清零,将 EXTI13外部中断的输入源设置为 PA13(默认);再执行“SYSCFG->EXTICR[EXTI_PinSourcex>> 0x02] |= (((uint32_t)EXTI_PortSourceGPIOx) << (0x04 *(EXTI_PinSourcex & (uint8_t)0x03)));”时,SYSCFG_EXTICR4 的 EXTI13[3:0]写入值 0x02,将 EXTI13 外部中断的输入源选择为 PC13。
由此,产生中断的原因很清楚:
1. 第一次执行 EXTI15_10_Config(),使能了 EXTI13 的中断,中断源来自 PC13;
2. 第二次执行EXTI15_10_Config(),在调用 SYSCFG_EXTILineConfig 配置 EXTI13 中断源时,先将中断源切回至PA13;由于失去了PC13 引脚上的高电平,在内部产生了一个下降沿,因此触发了 EXTI13 中断(之前已被使能),进入中断服务程序执行代码;
3. 从中断服务程序返回,再将 EXTI13 中断源重新配置到 PC13。
所以,误触发而进入中断服务程序的原因就是这样。
3.3.解决问题
问题解决很简单,EXTI13 既然已经配置好了,就不要再去重复进行配置了,没有必要,浪费效率且造成小问题。要使用和不要使用只要通过操作 EXTI_IMR 寄存器使能或禁用相应的中断就可以了。如果在特殊情况下非要重新配置的话,也要注意一下这个问题,先禁用中断。
结论
由于 SYSCFG_EXTILineConfig()函数在配置 EXTI 中断源时,会先将中断源配置到默认中断源后再配置到实际要使用的中断源,这样重复执行EXTI15_10_Config()就存在着误触发中断的风险,需加以注意。

处理
去掉重复配置的代码即可。

重要通知 - 请仔细阅读
意法半导体公司及其子公司(“ST”)保留随时对ST 产品和/ 或本文档进行变更、更正、增强、修改和改进的权利,恕不另行通知。买方订货之前应获取关于ST 产品的最新信息。ST 产品的销售依照订单确认时的相关ST 销售条款。
买方自行负责对ST 产品的选择和使用, ST 概不承担与应用协助或买方产品设计相关的任何责任。
ST 不对任何知识产权进行任何明示或默示的授权或许可。
转售的ST 产品如有不同于此处提供的信息的规定,将导致ST 针对该产品授予的任何保证失效。
ST 和ST 徽标是ST 的商标。所有其他产品或服务名称均为其各自所有者的财产。
本文档中的信息取代本文档所有早期版本中提供的信息。




文章来源:微信公众号  融创芯城(一站式电子元器件、PCB、PCBA购买服务平台,项目众包平台)

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

本版积分规则

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表