[问答] 关于EXTI几个问题请教。

[复制链接]

技术员

发表于 2018-1-14 21:53:23   183 查看 0 回复 显示全部楼层 倒序浏览
分享
/* 在 stm32f10x_conf.h 文件中,
第72行  #define assert_param(expr) ((void)0)                // expr:1:返回(void)0,expr:0:返回什么?
*/

#ifdef  USE_FULL_ASSERT                //如果定义了USE_FULL_ASSERT

/**
  * @Brief  The assert_param macro is used for function's parameters check.
  * @param  expr: If expr is false, it calls assert_failed function which reports
  *         the name of the source file and the source line number of the call
  *         that failed. If expr is true, it returns no value.
  * @retval None
  */
  #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))                //定义这个宏,expr:1:返回(void)0,expr:0:调用assert_failed函数,返回源文件名,和引起错误的线号。
/* Exported functions ------------------------------------------------------- */
  void assert_failed(uint8_t* file, uint32_t line);
#else                //否则,定义下面这个宏,
  #define assert_param(expr) ((void)0)                // expr:1:返回(void)0,expr:0:返回什么?
#endif /* USE_FULL_ASSERT */
       
       
       
       
/*  在        stm32f10x_gpio.h 文件中,
        267行,是什么意思?
        #define IS_GPIO_EXTI_PORT_SOURCE(PORTSOURCE) (((PORTSOURCE) == GPIO_PortSourceGPIOA) || \
                                              ((PORTSOURCE) == GPIO_PortSourceGPIOB) || \
                                              ((PORTSOURCE) == GPIO_PortSourceGPIOC) || \
                                              ((PORTSOURCE) == GPIO_PortSourceGPIOD) || \
                                              ((PORTSOURCE) == GPIO_PortSourceGPIOE) || \
                                              ((PORTSOURCE) == GPIO_PortSourceGPIOF) || \
                                              ((PORTSOURCE) == GPIO_PortSourceGPIOG))

        后面这么多赋值,相或,是什么意思?
       
        */
       
       
       
       
       
/*  在        stm32f10x_gpio.h 文件中,
        50--56行,是什么意思?

        typedef enum
{
  EXTI_Mode_Interrupt = 0x00,                //EXTI_IMR的偏移地址?
  EXTI_Mode_Event = 0x04                                //EXTI_EMR的偏移地址?
}EXTIMode_TypeDef;

#define IS_EXTI_MODE(MODE) (((MODE) == EXTI_Mode_Interrupt) || ((MODE) == EXTI_Mode_Event))
        //上面这句是?意思
        */





/*  在        stm32f10x_exti.h 文件中,

void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)
{
  uint32_t tmp = 0;

  /* Check the parameters */
  assert_param(IS_EXTI_MODE(EXTI_InitStruct->EXTI_Mode));
  assert_param(IS_EXTI_TRIGGER(EXTI_InitStruct->EXTI_Trigger));
  assert_param(IS_EXTI_LINE(EXTI_InitStruct->EXTI_Line));  
  assert_param(IS_FUNCTIONAL_STATE(EXTI_InitStruct->EXTI_LineCmd));

  tmp = (uint32_t)EXTI_BASE;                                                                                        //tmp        取 EXTI_BASE 基地址,

  if (EXTI_InitStruct->EXTI_LineCmd != DISABLE)                        // EXTI_LineCmd 使能时,
  {
    /* Clear EXTI line configuration */
    EXTI->IMR &= ~EXTI_InitStruct->EXTI_Line;                //EXTI_Line0 取反,再跟 EXTI->IMR 相与,那 EXTI->IMR 岂不是被屏蔽了?
    EXTI->EMR &= ~EXTI_InitStruct->EXTI_Line;                //EXTI_Line0 取反,再跟 EXTI->EMR 相与,那 EXTI->EMR 岂不是被屏蔽了?

    tmp += EXTI_InitStruct->EXTI_Mode;                                        //tmp + 模式地址,

    *(__IO uint32_t *) tmp |= EXTI_InitStruct->EXTI_Line;                //tmp 与上 (uint32_t)0x00001 岂不是只有0X0000 0001了?

    /* Clear Rising Falling edge configuration */
    EXTI->RTSR &= ~EXTI_InitStruct->EXTI_Line;                //EXTI->RTSR  线0的上升沿触发初岂不是被屏蔽了?
    EXTI->FTSR &= ~EXTI_InitStruct->EXTI_Line;                //EXTI->FTSR  线0的下降沿触发初岂不是被屏蔽了?

    /* Select the trigger for the selected external interrupts */
    if (EXTI_InitStruct->EXTI_Trigger == EXTI_Trigger_Rising_Falling)        //EXTI_Trigger_Rising_Falling = 0x10 是 SWIER 的地址了?
    {
      /* Rising Falling edge */
      EXTI->RTSR |= EXTI_InitStruct->EXTI_Line;//上升沿可以触发
      EXTI->FTSR |= EXTI_InitStruct->EXTI_Line;//下降沿可以触发
    }
    else                                                                                                                                                        //如果不是上升沿/下降沿同时触发,
    {
      tmp = (uint32_t)EXTI_BASE;                                                //指向基地址,
      tmp += EXTI_InitStruct->EXTI_Trigger;        //指向EXTI->RTSR地址,

      *(__IO uint32_t *) tmp |= EXTI_InitStruct->EXTI_Line;//使 EXTI->RTSR 写入0X0000 0001,使线0可以上升沿触发。
    }
  }
  else                        // EXTI_LineCmd 不能时,
  {
    tmp += EXTI_InitStruct->EXTI_Mode;        //EXTI_BASE 基地址+0X00,是 EXTI_IMR地址,

    /* Disable the selected external lines */
    *(__IO uint32_t *) tmp &= ~EXTI_InitStruct->EXTI_Line;        // EXTI_IMR 与上 0XFFFF FFFE,b也就是把线0的中断屏蔽了。
  }
}
       
       
       
       

高级模式
您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表
-

推荐专区

技术干货集中营

专家问答

用户帮助┃咨询与建议┃版主议事

工程师杂谈

工程师创意

工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

ARM技术论坛

Android论坛

Linux论坛

单片机/MCU论坛

FPGA|CPLD|ASIC论坛

DSP论坛

嵌入式系统论坛

-

电源技术论坛

电源技术论坛

无线充电技术

-

硬件设计论坛

PCB设计论坛

电路设计论坛

电子元器件论坛

控制|传感

总线技术|接口技术

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量技术专区

仪器仪表技术专区

-

EDA设计论坛

multisim论坛

PADS技术论坛

Protel|AD|DXP论坛

Allegro论坛

proteus论坛|仿真论坛

EasyEDA-中国人自已的EDA工具

Orcad论坛

-

综合技术与应用

电机控制

智能电网

光电及显示

参考设计中心

汽车电子技术论坛

医疗电子论坛

-

开源硬件

-

无线通信论坛

无线通信技术专区

天线|RF射频|微波|雷达技术

-

IC设计论坛

芯片测试与失效分析

Mixed Signal/SOC[数模混合芯片设计]

Analog/RF IC设计

设计与制造封装测试

-

厂商专区

TI论坛

TI Deyisupport社区

-

检测技术与质量

电磁兼容(EMC)设计与整改

安规知识论坛

检测与认证

-

消费电子论坛

手机技术论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

供求信息发布

供需广告

招聘┃求职发布区

电子展览展会专区