你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
意法半导体官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
积分商城
每日签到
关于stm32 NVIC 和EXTI控制中断的问题
[复制链接]
chengxuan104
提问时间:2014-11-19 14:15 /
本帖最后由 chengxuan104 于 2014-11-20 09:46 编辑
最近在学习stm32f2的中断,有点不明白nvic和exti这两个的区别,清中断挂起这两个都可以做,
EXTI_ClearFlag函数和EXTI_ClearITPendingBit,这两个函数操作的寄存器是一样的,只贴一个
void EXTI_ClearITPendingBit(uint32_t EXTI_Line)
{
/* Check the parameters */
assert_param(IS_EXTI_LINE(EXTI_Line));
EXTI->PR = EXTI_Line;
}
复制代码
但是,为什么nvic也可以呢很奇怪,以下代码是在core_cm3.h里面的
/** \brief Get Pending Interrupt
This function reads the pending register in the NVIC and returns the pending bit
for the specified interrupt.
\param [in] IRQn Number of the interrupt for get pending
\return 0 Interrupt status is not pending
\return 1 Interrupt status is pending
*/
static __INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn)
{
return((uint32_t) ((NVIC->ISPR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if pending else 0 */
}
复制代码
赞
0
收藏
0
评论
5
分享
发布时间:2014-11-19 14:15
举报
请先
登录
后回复
5个回答
chengxuan104
回答时间:2014-11-20 09:46:38
a0a.1 32b0c
沐紫姐姐来啊,帮我喊几个人。。
赞
0
评论
回复
支持
反对
废鱼
回答时间:2014-11-20 10:39:36
a0a.1 32b0c
NVIC是配置对应中断优先级等等,而EXIT是一个外部中断,产生以后清除就可以了。如果不配置NVIC的话,就不会产生中断事件。
赞
0
评论
回复
支持
反对
netlhx
回答时间:2014-11-20 11:34:15
a0a.1 32b0c
本帖最后由 netlhx 于 2014-11-20 11:37 编辑
我的理解,不一定正确:
NVIC是核内资源,CMSIS提供了几个参考API,具体功能的实现,依赖厂商。毕竟STM32对中断进行了改造。
而EXTI则是由STM32提供的具体中断操作。
所以结论是:请无视CMSIS中的API,直接使用STM32库中的EXTI寄存器才是正道。
我将的试验中的两张图你比较一下看:
注意ISPR及PR的值,一个变化了,另一个全是0。
至于EXTI_ClearFlag函数和EXTI_ClearITPendingBit,我看效果是一样的。
赞
0
评论
回复
支持
反对
Dylan疾风闪电
回答时间:2014-11-21 16:16:46
a0a.1 32b0c
本帖最后由 Dylan疾风闪电 于 2014-11-21 16:22 编辑
初步看了一下,static __INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn)这个函数涉及到了
NVIC->ISPR[x]这个寄存器。
指向的寄存器地址是:0xE000E200+(ISPR[x]的x的偏移)。
可以看一下官方的Cortex-M3手册,从中找到线索。
---------------------------------------------------------------------------------------------
typedef struct
{
__IO uint32_t ISER[8]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */
uint32_t RESERVED0[24];
__IO uint32_t ICER[8]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */
uint32_t RSERVED1[24];
__IO uint32_t ISPR[8]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */
uint32_t RESERVED2[24];
__IO uint32_t ICPR[8]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */
uint32_t RESERVED3[24];
__IO uint32_t IABR[8]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */
uint32_t RESERVED4[56];
__IO uint8_t IP[240]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */
uint32_t RESERVED5[644];
__O uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */
} NVIC_Type;
------------------------------------------------------------------------------------------------------------------
正常来看,读取操作不会对挂起的中断产生影响。这些寄存器写操作才会起作用。
我这边没有STM32F2xx的芯片,也没办法进一步的验证。
赞
0
评论
回复
支持
反对
沐紫
回答时间:2014-11-21 16:40:37
a0a.1 32b0c
chengxuan104 发表于 2014-11-20 09:46
沐紫姐姐来啊,帮我喊几个人。。
楼上几位来帮忙看了哦,是否弄明白了呢
赞
0
评论
回复
支持
反对
所属标签
相似问题
关于
意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
我的理解,不一定正确:
NVIC是核内资源,CMSIS提供了几个参考API,具体功能的实现,依赖厂商。毕竟STM32对中断进行了改造。
而EXTI则是由STM32提供的具体中断操作。
所以结论是:请无视CMSIS中的API,直接使用STM32库中的EXTI寄存器才是正道。
我将的试验中的两张图你比较一下看:
注意ISPR及PR的值,一个变化了,另一个全是0。
至于EXTI_ClearFlag函数和EXTI_ClearITPendingBit,我看效果是一样的。
初步看了一下,static __INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn)这个函数涉及到了NVIC->ISPR[x]这个寄存器。指向的寄存器地址是:0xE000E200+(ISPR[x]的x的偏移)。
可以看一下官方的Cortex-M3手册,从中找到线索。
---------------------------------------------------------------------------------------------
typedef struct
{
__IO uint32_t ISER[8]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */
uint32_t RESERVED0[24];
__IO uint32_t ICER[8]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */
uint32_t RSERVED1[24];
__IO uint32_t ISPR[8]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */
uint32_t RESERVED2[24];
__IO uint32_t ICPR[8]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */
uint32_t RESERVED3[24];
__IO uint32_t IABR[8]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */
uint32_t RESERVED4[56];
__IO uint8_t IP[240]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */
uint32_t RESERVED5[644];
__O uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */
} NVIC_Type;
------------------------------------------------------------------------------------------------------------------
正常来看,读取操作不会对挂起的中断产生影响。这些寄存器写操作才会起作用。
我这边没有STM32F2xx的芯片,也没办法进一步的验证。
楼上几位来帮忙看了哦,是否弄明白了呢