浅谈外部中断中的相关函数设置

2018/4/16

stm32

1.说在前面:

记得前几天写了一个用按键来控制灯的函数,但是无论怎样都无法实现函数的重复使用,一开始以为是没有设置好循环,但是,因为没有实现外部中断才做不了循环操作

2.外部中断

1.作为STM32而言,每一个IO口都可以作为外部中断的中断输入口,但是,中断线只有16条,于是采用了16个中断线来对应GP[OX_1~GPIOX-15的操作,通过映射配置具体到GPIO口

2.简单过程

1)初始化 IO 口为输入。

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

3)初始化线上中断,设置触发条件等。

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

5)编写中断服务函数。

3.相关配置代码的介绍(结构体定义)

1.配置中断线

EXTI_InitTypeDef EXTI_InitStruct;//创建结构体来初始化中断线
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//实现AFIO的使能
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource5);//配置中断线(配置C5)
	EXTI_InitStruct.EXTI_Line = EXTI_Line5;
	EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;//配置为输入
	EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;//配置下降沿触发
	EXTI_InitStruct.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStruct);//配置相关寄存器

2.配置NVIC中断优先级

NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
	//使能按键所在的外部中断通道
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x02;//设置抢占优先级
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x01;//设置子优先级
	NVIC_Init(&NVIC_InitStruct);

3.实现中断服务函数(注意配置完之后清除函数的挂起)

void EXTI0_IRQHandler(void)

{
	delay_ms(10); //消抖
	if (WK_UP == 1)
	{
		LED0 = 1;
		LED1 = 1;
	}
	EXTI_ClearITPendingBit(EXTI_Line0); //清除 EXTI0 线路挂起,清除位
}

注:NVIC_InitTypeDef 结构体中间有三个成员变量,这三个成员变量的作用是:NVIC_IRQChannel:定义初始化的是哪个中断,这个我们可以在 stm32f10x.h 中找到每个中断对应的名字。例如 USART1_IRQn。NVIC_IRQChannelPreemptionPriority:定义这个中断的抢占优先级别。

NVIC_IRQChannelSubPriority:定义这个中断的子优先级别。

NVIC_IRQChannelCmd:该中断是否使能。



阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页