你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于stm32 NVIC 和EXTI控制中断的问题

[复制链接]
chengxuan104 提问时间:2014-11-19 14:15 /
本帖最后由 chengxuan104 于 2014-11-20 09:46 编辑

最近在学习stm32f2的中断,有点不明白nvic和exti这两个的区别,清中断挂起这两个都可以做,

EXTI_ClearFlag函数和EXTI_ClearITPendingBit,这两个函数操作的寄存器是一样的,只贴一个

  1. void EXTI_ClearITPendingBit(uint32_t EXTI_Line)
  2. {
  3.   /* Check the parameters */
  4.   assert_param(IS_EXTI_LINE(EXTI_Line));

  5.   EXTI->PR = EXTI_Line;
  6. }
复制代码



但是,为什么nvic也可以呢很奇怪,以下代码是在core_cm3.h里面的

  1. /** \brief  Get Pending Interrupt

  2.     This function reads the pending register in the NVIC and returns the pending bit
  3.     for the specified interrupt.

  4.     \param [in]      IRQn  Number of the interrupt for get pending
  5.     \return             0  Interrupt status is not pending
  6.     \return             1  Interrupt status is pending
  7. */
  8. static __INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn)
  9. {
  10.   return((uint32_t) ((NVIC->ISPR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if pending else 0 */
  11. }
复制代码


收藏 评论5 发布时间:2014-11-19 14:15

举报

5个回答
chengxuan104 回答时间:2014-11-20 09:46:38
沐紫姐姐来啊,帮我喊几个人。。
废鱼 回答时间:2014-11-20 10:39:36
NVIC是配置对应中断优先级等等,而EXIT是一个外部中断,产生以后清除就可以了。如果不配置NVIC的话,就不会产生中断事件。
netlhx 回答时间:2014-11-20 11:34:15
本帖最后由 netlhx 于 2014-11-20 11:37 编辑

我的理解,不一定正确:
NVIC是核内资源,CMSIS提供了几个参考API,具体功能的实现,依赖厂商。毕竟STM32对中断进行了改造。
而EXTI则是由STM32提供的具体中断操作。
所以结论是:请无视CMSIS中的API,直接使用STM32库中的EXTI寄存器才是正道。

我将的试验中的两张图你比较一下看:

ISPR.PNG

exti.PNG

注意ISPR及PR的值,一个变化了,另一个全是0。

至于EXTI_ClearFlag函数和EXTI_ClearITPendingBit,我看效果是一样的。
Dylan疾风闪电 回答时间:2014-11-21 16:16:46
本帖最后由 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的芯片,也没办法进一步的验证。


沐紫 回答时间:2014-11-21 16:40:37
chengxuan104 发表于 2014-11-20 09:46
沐紫姐姐来啊,帮我喊几个人。。

楼上几位来帮忙看了哦,是否弄明白了呢

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版