stm32学笔记——外部中断的动

 stm32学学笔记——外部中断的应用

基本概念

  stm32饱受,每一个GPIO都足以触发一个外部中断,但是,GPIO的间歇是盖组也一个单位的,同组间的外表中断同一时间只能采用一个。比如说,PA0,PB0,PC0,PD0,PE0,PF0,PG0这些吗1组,如果我们采取PA0作为外部中断源,那么别的就未克再采取了。在斯状下,我们只好利用类似于PB1,PC2这种末端序号不同之外表中断源。每一样组采用一个戛然而止标志EXTIx。EXTI0-EXTI4这5独外表中断所有和谐单身的中止响应函数,EXIT5-EXIT9合用一个顿响应函数,EXIT10-EXIT15共用一个间断响应函数。

  对于中断的控制,stm32生一个专用的管理机构:NVIC。对于NVIC的详尽分解,可以参照《ARM
Cortex-M3高不可攀指南》,Joseph
Yiu著,宋岩译,北京航空航天大学出版社出版,第8段NVIC与中断控制。中断的使能,挂于,优先级,活动等等都是NVIC在保管。

 

骨干步骤

  使用外部中断的主导步骤如下:

  1、设置好相应的时钟;

  2、IO口初始化

  3、中断NVIC配置

  4、将GPIO管脚与表面中断线连接

  5、在选的中止通道的响应函数中写中断服务程序

  这里选出个大概的事例,使用按键来点中断,中断发生常,点亮一个led灯。

  按键连接的GPIO为PA11,led连接的GPIO为PB5;

 

  1、设置好相应的钟表

  首先需要开拓GPIOA和GPIOB的钟表,因为若动中断,还需开拓AFIO时钟。详细代码如下:

766游戏网官网 1766游戏网官网 2

1 void RCC_Config(void)
2 {
3     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);//GPIOA,GPIOBʱÖÓ
4     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//外部中断,需要使用AFIO时钟
5     
6 }

View Code

 

  2、IO口初始化

766游戏网官网 3766游戏网官网 4

 1 void GPIO_Config(void)
 2 {
 3         GPIO_InitTypeDef GPIO_InitStructure;
 4         //配置PA11为输入模式
 5         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
 6         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
 7         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 8         GPIO_Init(GPIOA, &GPIO_InitStructure);
 9         //配置PB5为输出模式
10         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
11         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
12         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速率为50MHz
13         GPIO_Init(GPIOB, &GPIO_InitStructure);//根据设定参数初始化GPIOB5
14     
15 }

View Code

 

  3、中断NVIC配置

  设置相应的中止实际上就是安NVIC,在stm32的固件库中生出一个结构体NVIC_InitTypeDef,里面来对应的标志位设置,然后又就此NVIC_Init()函数进行初始化。详细代码如下:

766游戏网官网 5766游戏网官网 6

 1 void NVIC_Config(void)
 2 {
 3     NVIC_InitTypeDef NVIC_InitStructure;
 4     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
 5     NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;//选择中断通道11
 6     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级2
 7     NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;//响应优先级2
 8     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中断
 9     NVIC_Init(&NVIC_InitStructure);//完成初始化
10 }

View Code

 

  4、将GPIO管脚与外部中断线连接

  由于GPIO并无是专用的暂停引脚,因此在就此GPIO来点外部中断的上用装将GPIO相应的引脚和中断线连接起来,具体代码如下:

766游戏网官网 7766游戏网官网 8

 1 void EXIT_Config(void)
 2 {
 3     EXTI_InitTypeDef EXTI_InitStructure;
 4     //清空中断标志
 5     EXTI_ClearITPendingBit(EXTI_Line11);
 6     //连接中断管脚PA11
 7     GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource11);
 8     
 9     EXTI_InitStructure.EXTI_Line = EXTI_Line11;//选择中断线路11
10     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//设置为中断请求,非事件请求
11     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//设置中断触发方式为下降沿触发
12     EXTI_InitStructure.EXTI_LineCmd = ENABLE;//外部中断使能
13     EXTI_Init(&EXTI_InitStructure);
14 }

View Code

 

  5、在选取的中止通道的响应函数中写中断服务程序

  stm32休像C51单片机那样,可以经过interrupt关键字来定义中断响应函数,stm32之间歇响应函数接口存在于中断向量表中,是由于启动代码给闹之。默认的刹车响应函数在stm32f10x_it.c中。但也可以祥和建立的c文件中书对应之刹车响应函数,但倘若保管,其名要跟stm32f10x_it.c中之同一。我们用的刹车服务函数名称也:

void
EXTI15_10_IRQHandler(void);我们的对象是拿led灯点来得,所以函数体很粗略:

766游戏网官网 9766游戏网官网 10

1 void EXTI15_10_IRQHandler(void)
2 {
3         //点亮led灯,低电平有效
4     GPIO_ResetBits(GPIOB,GPIO_Pin_5);    
5     //清空中断标志位,防止持续进入中断
6     EXTI_ClearITPendingBit(EXTI_Line11); 
7 }

View Code

 

  最后写主函数:

766游戏网官网 11766游戏网官网 12

1 #include "stm32f10x_lib.h"
2 int main(void)
3 {
4     RCC_Config();
5     GPIO_Config();
6     NVIC_Config();
7     EXIT_Config();
8     while(1);
9 }

View Code

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注