您的位置 首页 厂商

STM32之外部中止操控

一、STM32外部中断1、STM32外部中断结构图如上图所示:主要包括四个环节,GPIO、AFIO、EXTI、NVIC。以STM32F103VE(100脚)为例说明硬…

一、STM32外部中止

1、STM32外部中止结构图

  如上图所示:首要包含四个环节,GPIO、AFIO、EXTI、NVIC。以STM32F103VE(100脚)为例阐明硬件模块的数量:

GPIO:      80个

AFIO挑选通道:   16个

外部中止线EXTI:  16 + 3 = 19个

NVIC     :  1个 

2、EXTI操控器结构图

①功用

  • 中止   恳求中止
  • 事情   当事情产生的时分,将产生事情脉冲,能够用来唤醒内核

② 功用具体阐明  

  假如要产生中止,有必要事前装备好并使能中止线。根据需求的边缘检测设置2个触发寄存器,一起在中止屏蔽寄存器的相应位写’1’ 答应中止恳求。当外部中止线上产生了需求的边缘时,将产生一个中止恳求,对应的挂起位也随之被置’1’ 。在挂起寄存器的对应位写’1’,能够铲除该中止恳求。

  假如要为产生事情,有必要事前装备好并使能事情线。根据需求的边缘检测经过设置2个触发寄存器,一起在事情屏蔽寄存器的相应位写’1’答应事情恳求。当事情线上产生了需求的边缘时,将产生一个事情恳求脉冲,对应的挂起位不被置’1’。

  经过在软件中止/事情寄存器写’1’,也能够经过软件产生中止/事情恳求。

3、STM32外部中止软件装备进程

① 装备NVIC操控器

② 使能GPIO和AFIO时钟 

③ 装备GPIO (复用功用的输入输出装备)

④ 装备AFIO (选定要装备为EXTI的I/O口线)

⑤ EXTI操控器的装备

  装备寄存器就好像是咱们在更改STM32的硬件电路,让它们处于一种新的作业状况–外部中止形式。

二、STM32外部中止软件装备细节

  以PA0引脚的外部中止为例进行介绍:

1、装备NVIC操控器

  PA0引脚对应的外部中止线是EXTI_Line0,而EXTI_Line0对应的中止源是EXTI0_IRQn。

  调用NVIC_Init函数设置中止源EXTI0_IRQn的抢占优先级和呼应优先级,而且使能中止。

NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);

NVIC_IRQChannel

  界说装备的目标,是哪一个中止源,它不能运用“EXTI0_IRQnEXTI0_IRQn”方法调用一次NVIC_Init函数装备多个中止源

2、使能GPIO和AFIO时钟

  GPIO用作EXTI外部中止或运用重映射功用的时分,不只需求舱位外设时钟RCC_APB2Periph_GPIOA,还需求舱位AFIO时钟RCC_APB2Periph_AFIO。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA  RCC_APB2Periph_AFIO,ENABLE);

3、装备GPIO(复用功用的输入输出装备)

  装备PA0为上拉输入。

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;     // 上拉输入GPIO_Init(GPIOA, &GPIO_InitStructure);

4、装备AFIO(选定要装备为EXTI的I/O口线)

  PA0引脚对应的外部中止线是EXTI_Line0,可是PB0~PG0对应的也都是这个外部中止线。所以,需求经过多路挑选器确认到底是哪一个引脚映射到EXTI_Line0。

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); 

5、EXTI操控器的装备

  装备外部中止线EXTI_Line0的作业形式,为中止形式,下降沿触发中止,而且使能外部中止线EXTI_Line0。

EXTI_InitStructure.EXTI_Line = EXTI_Line0;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿中止EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure); 

三、中止装备进程以及STM中止结构解惑

1、为什么NVIC有使能中止,EXTI操控器还有一个使能操控呢?

  NVIC操控器是在ARM公司规划的Cortex-M3内核中,EXTI操控器是ST公司自己规划的外设。

  在NVIC操控器中,有“Interrupt set-enable register&Interrupt clear-enable register”,它们来操控是否使能中止源EXTI0_IRQn。

  而EXTI操控器中,有“Interrupt mask register”来操控中止线EXTI_Line0的中止标志位是否传送给NVIC操控器。

2、为什么NVIC操控器使能中止源的寄存器要两种?

  中止的使能与除能别离运用各自的寄存器来操控——这与传统的,运用单一比特的两个状况来表达使能与除能是不同的。CM3 中能够有 240 对使能位/除能位(SETENA 位/CLRENA 位),每个中止具有一对。这 240 个对子散布在 8 对32位寄存器中(最终一对没有用完)。欲使能一个中止,咱们需求写1 到对应SETENA的位中;欲除能一个中止,你需求写 1 到对应的CLRENA位中。假如往它们中写0,则不会有任何作用。

  写零无效是个很要害的规划理念:经过这种方法,使能/除能中止时只需把“当事位”写成 1,其它的位能够悉数为零。再也不用像曾经那样,惧怕有些位被写入0 而损坏其对应的中止设置(横竖现在写 0 没有作用了),然后完成每个中止都能够自顾地设置,而各不相犯——只需单一的写指令,不再需求读-改-写三步曲。(摘自《CM3威望攻略》)

3、在铲除中止标志位的时分,为什么只需求铲除EXTI的中止标志位就行,而不需求铲除NVIC的悬起寄存器SETPEND?

  有些程序员在中止服务程序完毕的方位铲除中止源的时分,还调用了NV%&&&&&%_ClearPendingIRQ()函数铲除中止源的悬起标志位,其实是不需求的。  

  假如中止产生时,正在处理同级或高优先级反常,或许被掩蔽,则中止不能当即得到呼应。此刻中止被悬起。中止的悬起状况能够经过“中止设置悬起寄存器(SETPEND) ”和“中止悬起铲除寄存器(CLRPEND) ”来读取,还能够写它们来窜逃悬起中止。(这段文字摘自《CM3威望攻略》)

  由此咱们能够得出结论:假如中止服务程序得到碑文(中止得到呼应),此刻中止就不会被悬起。所以咱们的中止服务程序不需求铲除“悬起标志位”。

  有人或许还会这么想:假使一个中止服务程序由于处理器正在碑文同级中止服务程序而不能被碑文,中止被悬起,那么当轮到这个中止得到呼应后,这个中止服务程序需求清楚“悬起标志位”吗?

  我以为仍是不需求,由于中止标志位的悬起宽和悬,硬件都是能够主动操控的。也就是说,当悬起的中止被呼应的时分,“悬起标志位”主动被硬件予以铲除,不用手动铲除。

参考资料:《STM32 库开发实战攻略》

     《CM3威望攻略》

     《STM32F10X芯片手册》

     《STM32F10xxx Cortex-M3 programming manual.pdf》

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/263901.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部