EXTI->IMR &= ~EXTI_InitStruct->EXTI_Line;的疑惑

[复制链接]
8915|5
 楼主| williamt 发表于 2011-7-4 10:52 | 显示全部楼层 |阅读模式
本帖最后由 williamt 于 2011-7-4 11:24 编辑

GPIOmain.c测试程序内有这样一段代码:
EXTI_InitStructure.EXTI_Line = EXTI_Line9;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
设置中断寄存器,而EXTI_Init()的函数中有如下代码:
if (EXTI_InitStruct->!= DISABLE
  {
   
/* Clear EXTI line configuration */


EXTI->IMR &= ~EXTI_InitStruct->EXTI_Line;


EXTI->EMR &= ~EXTI_InitStruct->EXTI_Line;

   .................................................
在定义文件中,

#define EXTI_Line9       ((u32)0x00200)  /* External interrupt line 9 */

因此:EXTI->IMR &=~EXTI_InitStruct->EXTI_Line; 也就是:

EXTI->IMR &=~((u32)0x00200);

IMR MR9应该是0,而在实际仿真中,MR9=1

请教高手,其中原因
[/fly]

fchlong 发表于 2012-12-17 14:18 | 显示全部楼层
其实在EXTI_Init(&EXTI_InitStructure)里面的
      EXTI->IMR &= ~EXTI_InitStruct->EXTI_Line;
         EXTI->EMR &= ~EXTI_InitStruct->EXTI_Line;
后面还有两句:
      tmp += EXTI_InitStruct->EXTI_Mode;
         *(__IO uint32_t *) tmp |= EXTI_InitStruct->EXTI_Line;
是用来置1的,仔细推敲一下就知道了。
uet_cache 发表于 2012-12-17 15:47 | 显示全部楼层
woshiftt 发表于 2015-5-20 23:05 | 显示全部楼层
本帖最后由 woshiftt 于 2015-5-21 17:25 编辑

下面两行程序也没有做赋值给寄存器的操作啊,谈何置位呐!!!
周董 发表于 2015-5-21 09:53 | 显示全部楼层
EXTI->IMR &= ~EXTI_InitStruct->EXTI_Line;
         EXTI->EMR &= ~EXTI_InitStruct->EXTI_Line;
qin1205 发表于 2015-12-17 10:28 | 显示全部楼层
我是这样理解的,
    EXTI->IMR &= ~EXTI_InitStruct->EXTI_Line; // EXTI->IMR偏移地址0x00
    EXTI->EMR &= ~EXTI_InitStruct->EXTI_Line; // EXTI->IMR偏移地址0x04
   
    tmp += EXTI_InitStruct->EXTI_Mode;      //  EXTI_Mode定义0x00或0x04

    *(__IO uint32_t *) tmp |= EXTI_InitStruct->EXTI_Line;// 选中当前的偏移地址赋值
//当tmp =0x00时, *(__IO uint32_t *) tmp就是选中偏移地址为0x00的寄存器赋值,即 EXTI->IMR寄存器
//当tmp =0x04时, *(__IO uint32_t *) tmp就是选中偏移地址为0x04的寄存器赋值,即 EXTI->EMR寄存器
这样写的好处就是优化代码,根据偏移地址给不同的寄存器赋值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

41

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部