×
单片机 > 单片机程序设计 > 详情

【STM32电机矢量控制】记录13——EXTI外部中断

发布时间:2020-06-18 发布时间:
|

STM32的EXTI控制器支持19 个外部中断/ 事件请求。每个中断设有状态位,每个中断/ 事件都有独立的触发和屏蔽设置。

STM32的19个外部中断对应着19路中断线,分别是EXTI_Line0-EXTI_Line18:


线0~15:对应外部 IO口的输入中断。

线16:连接到 PVD 输出。

线17:连接到 RTC 闹钟事件。

线18:连接到 USB 唤醒事件。

触发方式:STM32 的外部中断是通过边沿来触发的,不支持电平触发。 

外部中断分组:STM32 的每一个GPIO都能配置成一个外部中断触发源,STM32 通过根据引脚的序号不同将众多中断触发源分成不同的组,比如:PA0,PB0,PC0,PD0,PE0,PF0,PG0为第一组,那么依此类推,我们能得出一共有16 组,STM32 规定,每一组中同时只能有一个中断触发源工作,那么,最多工作的也就是16个外部中断。


STM32的每个IO口都可以作为中断输入,这点很好用。要把IO口作为外部中断输入,有以下几个步骤:

1)初始化IO口为输入。

这一步设置你要作为外部中断输入的IO口的状态,可以设置为上拉/下拉输入,也可以设置为浮空输入,但浮空的时候外部一定要带上拉,或者下拉电阻。否则可能导致中断不停的触发。在干扰较大的地方,就算使用了上拉/下拉,也建议使用外部上拉/下拉电阻,这样可以一定程度防止外部干扰带来的影响。

2)开启IO口复用时钟,设置IO口与中断线的映射关系。

STM32的IO口与中断线的对应关系需要配置外部中断配置寄存器EXTICR,这样我们要先开启复用时钟,然后配置IO口与中断线的对应关系。才能把外部中断与中断线连接起来。

3)开启与该IO口相对的线上中断/事件,设置触发条件。

这一步,我们要配置中断产生的条件,STM32可以配置成上升沿触发,下降沿触发,或者任意电平变化触发,但是不能配置成高电平触发和低电平触发。这里根据自己的实际情况来配置。同时要开启中断线上的中断,这里需要注意的是:如果使用外部中断,并设置该中断的EMR位的话,会引起软件仿真不能跳到中断,而硬件上是可以的。而不设置EMR,软件仿真就可以进入中断服务函数,并且硬件上也是可以的。建议不要配置EMR位。

4)配置中断分组(NVIC),并使能中断。

这一步,我们就是配置中断的分组,以及使能,对STM32的中断来说,只有配置了NVIC的设置,并开启才能被执行,否则是不会执行到中断服务函数里面去的。关于NVIC的详细介绍,请参考前面章节。

5)编写中断服务函数。

这是中断设置的最后一步,中断服务函数,是必不可少的,如果在代码里面开启了中断,但是没编写中断服务函数,就可能引起硬件错误,从而导致程序崩溃!所以在开启了某个中断后,一定要记得为该中断编写服务函数。在中断服务函数里面编写你要执行的中断后的操作。

EXTI库函数:



EXTI配置例程:

EXTI初始化设置:

void EXTI_PB9_Init(void)

 

{

  GPIO_InitTypeDef GPIO_InitStructure;

  NVIC_InitTypeDef NVIC_InitStructure;

  EXTI_InitTypeDef EXTI_InitStructure;

     //使能GPIO和AFIO时钟,值得注意的是,当使用外部中断的时候必须使能AFIO时钟。

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);

     

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  //浮空输入

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //IO速度为50MHz

  GPIO_Init(GPIOB,&GPIO_InitStructure);  

  

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource9);//将EXIT线9连接到PB9

  EXTI_InitStructure.EXTI_Line = EXTI_Line9;

  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;  //上升下降沿触发

  EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能中断线

  EXTI_Init(&EXTI_InitStructure);//初始化中断

  

  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

}

配置中断服务函数: 

void EXTI9_5_IRQHandler(void)

{

  if(EXTI_GetITStatus(EXTI_Line9) != RESET)  //EXTI9产生了中断

  {

   ……………………………………………………//中断处理程序

  }

  EXTI_ClearITPendingBit(EXTI_Line9);//清除中断

}


 

主要完成任务:

1、整理回顾STM32的系列配置,进行系统性地整理;

2、整理FOC电机程序,进行查缺补漏;

3、回顾方波驱动程序;


关键字:STM32  电机  矢量控制  EXTI  外部中断 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32 USB HID 键盘