历史上的今天
返回首页

历史上的今天

今天是:2024年10月20日(星期日)

正在发生

2021年10月20日 | stm32专题七:EXTI(一)外部中断/事件控制器框图

2021-10-20 来源:eefocus

stm32的每一个GPIO都可以产生中断,这些中断由EXTI这个外设管理。EXTI读取GPIO引脚的电平变化,然后交给NVIC。


外部中断EXTI的结构框图,标号20表示类似的信号线路有20根

共有20根输入线,其中EXTI0~EXTI15为GPIO引脚,每个GPIO的相同Pin(如Pin0)都接在一起,结构如下

总结如下

这些输入线由寄存器AFIO_EXTICR(外部中断配置寄存器)来控制,其中AFIO_EXTICR0管理EXTI0~EXTI3,AFIO_EXTICR1管理EXTI4~EXTI7,依此类推。

外部中断的检测过程:


当检测到上升沿/下降沿时,如果我们设置了软件中断事件寄存器EXTI_WSIER,则会将挂起寄存器EXTI_PR的相应位置1。两个均为1(边沿检测和软件中断事件寄存器),则或门电路的输出为1。此时若设置中断屏蔽寄存器为1(开放中断请求),则与门电路的输出为1,中断请求进入到NVIC。

事件模式:


当设置事件屏蔽寄存器开放事件请求时,下半部分电路与门的输出为1,然后脉冲发生器就会产生一个脉冲。这个脉冲是在单片机的内部,可以触发ADC开始转换,还可以触发定时器开始计时。


标准库中的EXTI初始化结构体


typedef struct

{

// 选择输入线  

uint32_t EXTI_Line;               /*!< Specifies the EXTI lines to be enabled or disabled.

                                         This parameter can be any combination of @ref EXTI_Lines */

   

// EXTI模式,事件或中断  

EXTIMode_TypeDef EXTI_Mode;       /*!< Specifies the mode for the EXTI lines.

                                         This parameter can be a value of @ref EXTIMode_TypeDef */

 

// EXTI触发方式,上升沿或下降沿或上升下降沿都检测  

EXTITrigger_TypeDef EXTI_Trigger; /*!< Specifies the trigger signal active edge for the EXTI lines.

                                         This parameter can be a value of @ref EXTIMode_TypeDef */

 

// EXTI输入线使能  

FunctionalState EXTI_LineCmd;     /*!< Specifies the new state of the selected EXTI lines.

                                         This parameter can be set either to ENABLE or DISABLE */ 

}EXTI_InitTypeDef;

       下面是EXTI初始化函数,其实就是往EXTI寄存器的对应位写1,很简单


/**

  * @brief  Initializes the EXTI peripheral according to the specified

  *         parameters in the EXTI_InitStruct.

  * @param  EXTI_InitStruct: pointer to a EXTI_InitTypeDef structure

  *         that contains the configuration information for the EXTI peripheral.

  * @retval None

  */

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;

     

  if (EXTI_InitStruct->EXTI_LineCmd != DISABLE)

  {

    /* Clear EXTI line configuration */

    // 清除EXTI输入线的中断和事件屏蔽寄存器

    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;

 

    /* Clear Rising Falling edge configuration */

    // 清除上升沿和下降沿配置

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

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

    

    /* Select the trigger for the selected external interrupts */

    // 如果是上升和下降沿都选择

    if (EXTI_InitStruct->EXTI_Trigger == EXTI_Trigger_Rising_Falling)

    {

      /* Rising Falling edge */

      // 设置相应的上升沿和下降沿触发寄存器,两个都设置

      EXTI->RTSR |= EXTI_InitStruct->EXTI_Line;

      EXTI->FTSR |= EXTI_InitStruct->EXTI_Line;

    }

    else

    {

      // tmp保存的是EXTI的基地址

      tmp = (uint32_t)EXTI_BASE;

      // tmp指向EXTI的边沿触发寄存器

      tmp += EXTI_InitStruct->EXTI_Trigger;

 

      // 对该地址取值(指针操作),往对应的位写1

      *(__IO uint32_t *) tmp |= EXTI_InitStruct->EXTI_Line;

    }

  }

  else

  {

    tmp += EXTI_InitStruct->EXTI_Mode;

 

    /* Disable the selected external lines */

    *(__IO uint32_t *) tmp &= ~EXTI_InitStruct->EXTI_Line;

  }

}

       选择输入线对应的GPIO,操作的是AFIO_EXTICR寄存器,源码如下,其实也很简单,就是根据端口GPIO_PORT和GPIO_PIN设置AFIO->EXTICR寄存器,要养成多看源码的习惯。


/**

  * @brief  Selects the GPIO pin used as EXTI Line.

  * @param  GPIO_PortSource: selects the GPIO port to be used as source for EXTI lines.

  *   This parameter can be GPIO_PortSourceGPIOx where x can be (A..G).

  * @param  GPIO_PinSource: specifies the EXTI line to be configured.

  *   This parameter can be GPIO_PinSourcex where x can be (0..15).

  * @retval None

  */

void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)

{

  uint32_t tmp = 0x00;

  /* Check the parameters */

  assert_param(IS_GPIO_EXTI_PORT_SOURCE(GPIO_PortSource));

  assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource));

  

  tmp = ((uint32_t)0x0F) << (0x04 * (GPIO_PinSource & (uint8_t)0x03));

  AFIO->EXTICR[GPIO_PinSource >> 0x02] &= ~tmp;

  AFIO->EXTICR[GPIO_PinSource >> 0x02] |= (((uint32_t)GPIO_PortSource) << (0x04 * (GPIO_PinSource & (uint8_t)0x03)));

}

推荐阅读

史海拾趣

Gems Sensors & Controls公司的发展小趣事

面对激烈的市场竞争和不断变化的市场需求,Gems Sensors & Controls公司始终保持着敏锐的洞察力和灵活的应变能力。公司不断调整和优化产品结构,提升产品质量和服务水平,以更好地满足客户的需求。同时,Gems还积极开拓新的市场领域和应用场景,不断拓展自身的业务范围和市场份额。这些努力使得Gems在电子行业中持续保持领先地位,并实现了持续稳定的增长。

Fronter Electronics Co Ltd公司的发展小趣事

Fronter电子成立于1991年,由一群对电子技术充满热情的创业者共同创立。在公司成立初期,Fronter电子专注于电子元件的代理与销售,通过引进国际知名品牌的产品,如SUNLORD、KDS等,迅速在行业内建立了初步的声誉。公司凭借敏锐的市场洞察力和高效的供应链管理,逐步在电子元器件市场中站稳脚跟。

昭华(CHA)公司的发展小趣事

昭华(CHA)公司自2007年成立以来,就致力于拨码开关与轻触开关的研发制造。在初创阶段,公司面临着技术挑战、资金短缺以及市场竞争激烈等多重困难。然而,昭华团队凭借着对技术的热情和执着,通过不断的技术创新和产品优化,逐渐在市场上树立了自己的品牌。他们不仅成功研发出多款高性能的开关产品,还积累了丰富的行业经验,为公司的后续发展奠定了坚实的基础。

Apex Tool Group公司的发展小趣事

昭华公司一直注重品牌建设和市场拓展。他们通过参加各种行业展会、举办技术研讨会等方式,积极宣传公司的产品和技术优势。同时,昭华公司还加强了与客户的沟通和合作,深入了解客户需求并提供定制化的解决方案。这些努力使得昭华公司的品牌知名度不断提升,市场份额也逐渐扩大。

冠西电子(COSMO)公司的发展小趣事

进入21世纪,冠西电子不断加大在研发方面的投入,成功突破了一系列技术难题,特别是在光耦合器和继电器领域取得了显著成果。这些技术突破不仅提升了冠西电子产品的竞争力,也为其赢得了更多国际大厂的信赖。同时,冠西电子积极拓展市场,其产品广泛应用于电源、互联网设备、电脑系统和相关系统、家电、工业、安防系统等领域,为全球客户提供优质的产品和服务。

AIM公司的发展小趣事

AIM公司深知质量是企业的生命线。因此,公司始终将质量管理放在首位,建立了严格的质量控制体系。从原材料采购到产品出厂,每一个环节都经过严格把关,确保产品的质量稳定和可靠。同时,AIM还注重品牌建设,通过提供优质的产品和服务,树立了良好的品牌形象和口碑。

问答坊 | AI 解惑

Wince6.0 创建多语言CreateMui失败问题

定制OS, 选择了 MUI 和 英文和中文字体, 默认语言是中文 可调用 createmui 0409 命令后 输出如下, 输出完成后,提示找不到文件,麻烦大侠们给个提示,谢谢 Multiui.bib文件内容为空, ; ; Copyright (c) Microsoft Corporation.   ...…

查看全部问答>

调查一下支持winCE6.0的CPU及有成熟开发板的公司

我搜了一些做ARM开发板的公司,甚少有支持wince6.0的开发板在卖。立宇泰、友善之臂、扬创、周立功、英蓓特等都没找到一块。优龙也是在最近才出了一款LPC3250的板子有wince6.0,但是驱动还没有做全。搜到有两家卖S3C6410X和S3C6400开发板的公司,海 ...…

查看全部问答>

Can't create hard link ??

BUILDREL: Copying PLATFORMCOMMON binaries from C:\\WINCE600\\platform\\common Can\'t create hard link.  (FAT file system?) Copying files instead of creating hard links. 编译到最后的时候,出现这样几个错误?? 这是什么 ...…

查看全部问答>

需要做网站的朋友快加入我们吧^^^^^^^^

运用全球领先的软件的和平台,结合对商业需求把握,凭借出色的规划设计能力和技术实施能力,运用成熟的项目管理能力,帮助客户在Internet/Intranet上建立全面的基于Web的企业应用,主营业务是向企业及个人提供综合上网服务,目标是建设成为中国领先 ...…

查看全部问答>

急!两道单片机题目!(高分)

急需此两题的解答!小弟多年不碰单片机,两眼一抹黑,请各位大大救命啊! 在线等,解出来立刻双手把分奉上!! 邮箱:[email=darkstarxw@163.com][/email]…

查看全部问答>

DC-DC原理的培训讲义1,2

[local]1[/local][local]2[/local]…

查看全部问答>

北京智博联公司招聘高级电子工程师

本公司招聘硬件工程师,从事检测仪器开发。关注于弱信号的采集、整理和放大。 1.    本科及以上学历; 2.    电子、自动化、硬件电路设计、检测技术等相关专业; 3.    有CPLD或FPGA开发经验者优先; 4.&nbs ...…

查看全部问答>

S7-200的模拟量编写方法总结

1、模拟量值和A/D转换值的转换假设模拟量的标准电信号是A0—Am(如:4—20mA),A/D转换后数值为D0—Dm(如:6400—32000),设模拟量的标准电信号是A,A/D转换后的相应数值为D,由于是线性关系,函数关系A=f(D)可以表示为数学方程:   &nb ...…

查看全部问答>

求助:关于TLV320AIC23的操作

各位大虾:我在DM642里面对TLV320AIC23进行Transmit操作时,遇到一个问题。代码如下,各同步时钟信号AFSX、ACLKX、AHCLKX由AIC23提供。 MCASP_ConfigSrctl MysrctlRegs = {      0x00000009,    //AXR00=Xmt &nbs ...…

查看全部问答>

酒店数字电视改造方案,供参考

大家来看看这份数字电视改造方案,是我一个网友发来的, 先拿出来给大家分亨一下,或许你们也会用得着!  方案原理:用30多个机顶盒+邻频调制器,做出30多个频道,供给100多个房间都能收看30多个频道。酒店按常规需要100多个机顶盒,用数字电视 ...…

查看全部问答>