【实验三】外部中断实验
扫描二维码
随时随地手机看文章
一、实验目的
1)了解STM32外部中断相关知识;
2)使用STM32外部中断,实现两个LED灯亮灭;
二、STM32外部中断简介
1)STM32F103系列有60个可屏蔽中断;支持19个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。
STM32F103 的19 个外部中断为:
线 0~15:对应外部 IO 口的输入中断。
线 16:连接到 PVD 输出。
线 17:连接到 RTC 闹钟事件。
线 18:连接到 USB 唤醒事件。
中断线对应为:
2)外部中断函数:
EXPORT EXTI0_IRQHandler
EXPORT EXTI2_IRQHandler
EXPORT EXTI4_IRQHandler
EXPORT EXTI15_10_IRQHandler
EXPORT EXTI9_5_IRQHandler
EXPORT EXTI1_IRQHandler
EXPORT EXTI3_IRQHandler
中断线 0-4 每个中断线对应一个中断函数, 中断线 5-9 共用中断函数 EXTI9_5_IRQHandler,中断线 10-15 共用中断函数 EXTI15_10_IRQHandler。
在编写中断服务函数的时候会经常使用到两个函数, 第一个函数是判断某个中断线上的中断是否发生(标志位是否置位):
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
这个函数一般使用在中断服务函数的开头判断中断是否发生。 另一个函数是清除某个中断线上的中断标志位:
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
这个函数一般应用在中断服务函数结束之前, 清除中断标志位。
3)IO口外部中的一般步骤
1) 初始化 IO 口为输入。
2) 开启 IO 口复用时钟,设置 IO 口与中断线的映射关系。
3) 初始化线上中断, 设置触发条件等。
4) 配置中断分组( NVIC),并使能中断。
5) 编写中断服务函数。
三、硬件设计
LED灯、按键。
四、软件设计
exti.c 主要涉及初始化以及中断函数的实现
//外部中断0服务程序
voidEXTIX_Init(void)
{
EXTI_InitTypeDefEXTI_InitStructure;
NVIC_InitTypeDefNVIC_InitStructure;
KEY_Init();//按键端口初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能复用功能时钟
//GPIOE.2中断线以及中断初始化配置下降沿触发
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);
EXTI_InitStructure.EXTI_Line=EXTI_Line2;//KEY2
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStructure);//根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;//使能按键WK_UP所在的外部中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02;//抢占优先级2,
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03;//子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//使能外部中断通道
NVIC_Init(&NVIC_InitStructure);//使能外部中断通道
NVIC_Init(&NVIC_InitStructure);//根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
}
中断函数实现:功能的实现也主要是在中断函数中实现
voidEXTI0_IRQHandler(void)
{
delay_ms(10);//消抖
if(KEY3==1)//按键KEY3
{
LED0=!LED0;
}
EXTI_ClearITPendingBit(EXTI_Line0);//清除LINE0上的中断标志位
}
五、实验结果
成功!