STM32 中断分为外部中断,定时器中断、串口中断。虽然名字不同,但是原理都是相同的,这一节我们将主要介绍一下外部中断以及中断函数的编写。
按照如下步骤去编写函数和配置函数即可完成对外部中断函数的配置。
第一步:配置GPIO,设置为中断模式。
第二部:配置中断函数
1、使能IO口复用功能,选择带有中断的引脚。
2、设置外部中断结构体成员。
3、设置中断优先级。
4、配置中断服务函数。
例子:按键触发的中断函数
//GPIO 初始化
void Init_LED(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义一个GPIO结构体变量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOG, ENABLE);
//使能各个端口时钟,
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_13; //板上LED编号 D2、D5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
[html] view plain copy
GPIO_Init(GPIOG, &GPIO_InitStructure);
[html] view plain copy
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
中断函数编写
void Init_EXTIX_TI(void)
{
EXTI_InitTypeDef EXTI_InitStructure; //定义一个EXTI结构体变量
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能IO复用功能,使用中断功能重要!!!
/* 引脚选择 */
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);//配置端口C的13引脚为中断源 重要!! 板上标号INT2
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource0); //配置端口E的0引脚为中断源 重要!! 板上标号INT1
/* 设置外部中断结构体的成员*/
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式为中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line13;
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能中断线
EXTI_Init(&EXTI_InitStructure); //根据参数初始化中断寄存器
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组2
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //设定中断源为PC13
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //中断占优先级为2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //副优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断
NVIC_Init(&NVIC_InitStructure); //根据参数初始化中断寄存器
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //设定中断源为PE0
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //中断占优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //副优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断
NVIC_Init(&NVIC_InitStructure); //根据参数初始化中断寄存器
}
最后为配置中断服务函数(入口函数、中断处理函数)
最后一步了,也是很重要的一步,配置中断服务函数,也有叫什么入口函数的。说白了,就是你想让你的这个中断做什么。
/*************************************************************
注意,中断服务程序虽然简单,但是在写入口函数的时候,注意函数名的写法,只有如下3种命名方式。
(1)EXTI0_IRQHandler;EXTI Line 0
EXTI1_IRQHandler;EXTI Line 1
EXTI2_IRQHandler;EXTI Line 2
EXTI3_IRQHandler;EXTI Line 3
EXTI4_IRQHandler;EXTI Line 4
(2)
EXTI9_5_IRQHandler;EXTI Line 5-9
(3)
EXTI15_10_IRQHandler;EXTI Line 10-15
只要是中断线5后的就不能像前四个那样命名,他们有自己的方式。
************************************************************/
void EXTI15_10_IRQHandler(void) //pc13中断服务程序,也是中断子函数
{
//检测按键之前一般有个消抖延时,直接调用下面的延时函数即可
if(EXTI_GetITStatus(EXTI_Line13)!= RESET) //判断是否发生中断,发生则中断标志置1
{
// LED1=0;
// LED2=1;
GPIO_ResetBits(GPIOG, GPIO_Pin_14); //GPIOG设置为低电平,
GPIO_SetBits(GPIOD, GPIO_Pin_13); //GPIOD设置为高电平,其实这一部分也是可以写在主函数中的,在while那个死循环中。
}
EXTI_ClearITPendingBit(EXTI_Line13); //利用库函数清除中断标志位,进入中断服务程序之后。首先就是清除标志位,
} //否则他会不响应中断,不进入中断函数
这就是整个完整的外部中断处理函数,直接照葫芦画瓢就行。
上一篇:STM32按键中断学习记录
下一篇:STM32外部中断映射
推荐阅读最新更新时间:2024-03-16 16:05