STM32基础实验4(按键中断)
2018-03-07 14:55
369 查看
按键中断实验,实验2是按键查询
对于按键使用查询和中断模式,查询模式是自己采用一段代码放在一个循环中,例如main函数中实时查询发现变位就去处理,而中断模式采用硬件方式查询变化状态然后做出相应。两者的区别一个是需要自己编写查询软件代码,一个是初始化时配置好中断模式,然后在中断中直接写你的处理代码即可。
2、实现步骤
①初始化 IO 口为输入(key.c中!)
②开 启 AFIO 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
③设置 IO 口与中断线的映射关系。
void GPIO_EXTILineConfig();
④初始化线上中断,设置触发条件等。
EXTI_Init();
⑤配置中断分组NVIC,并使能中断。
NVIC_Init();
⑥编写中断服务函数。
EXTIx_IRQHandler();
⑦清除中断标志位
EXTI_ClearITPendingBit();
一、实验原理
1、按键使用查询和中断模式的对于按键使用查询和中断模式,查询模式是自己采用一段代码放在一个循环中,例如main函数中实时查询发现变位就去处理,而中断模式采用硬件方式查询变化状态然后做出相应。两者的区别一个是需要自己编写查询软件代码,一个是初始化时配置好中断模式,然后在中断中直接写你的处理代码即可。
2、实现步骤
①初始化 IO 口为输入(key.c中!)
void KEY_Init(void) //IO初始化 { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//使能PORTA,PORTE时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_3;//KEY0-KEY1 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入 GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE4,3 //初始化 WK_UP-->GPIOA.0 下拉输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0 }
②开 启 AFIO 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
③设置 IO 口与中断线的映射关系。
void GPIO_EXTILineConfig();
④初始化线上中断,设置触发条件等。
EXTI_Init();
⑤配置中断分组NVIC,并使能中断。
NVIC_Init();
⑥编写中断服务函数。
EXTIx_IRQHandler();
⑦清除中断标志位
EXTI_ClearITPendingBit();
二、实验代码
**exti.c** #include "exti.h" #include "led.h" #include "key.h" #include "delay.h" #include "usart.h" #include "beep.h" void EXTIX_Init(void) { EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; KEY_Init(); // 按键端口初始化 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟 //GPIOE.3 中断线以及中断初始化配置 下降沿触发 //KEY1 GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3); EXTI_InitStructure.EXTI_Line=EXTI_Line3; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器 //GPIOE.4 中断线以及中断初始化配置 下降沿触发 //KEY0 GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4); EXTI_InitStructure.EXTI_Line=EXTI_Line4; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器 //GPIOA.0 中断线以及中断初始化配置 上升沿触发 PA0 WK_UP GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0); EXTI_InitStructure.EXTI_Line=EXTI_Line0; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; 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_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; //使能按键KEY1所在的外部中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子优先级1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn; //使能按键KEY0所在的外部中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //子优先级0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 } //外部中断0服务程序 void EXTI0_IRQHandler(void) { delay_ms(10);//消抖 if(WK_UP==1) //WK_UP按键 { BEEP=!BEEP; } EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位 } //外部中断3服务程序 void EXTI3_IRQHandler(void) { delay_ms(10);//消抖 if(KEY1==0) //按键KEY1 { LED1=!LED1; } EXTI_ClearITPendingBit(EXTI_Line3); //清除LINE3上的中断标志位 } void EXTI4_IRQHandler(void) { delay_ms(10);//消抖 if(KEY0==0) //按键KEY0 { LED0=!LED0; LED1=!LED1; } EXTI_ClearITPendingBit(EXTI_Line4); //清除LINE4上的中断标志位 }
相关文章推荐
- STM32实验4:按键中断
- stm32基础实验2(按键输入—查询模式)
- TI CC2530基础实验(GPIO通用I/O中断操作——按键控制灯的亮灭)
- 【连载】【STM32神舟III号实验例程】串口收发—中断方式(5)
- ZigBee基础实验(二)--中断
- 嵌入式成长轨迹38 【Zigbee项目】【CC2430基础实验】【按键控制开关】
- STM32实验1:定时器中断同时产生两路不同频率的信号
- S5PV210 Linux内核按键中断实验
- STM32实例之I/O控制中的按键实验
- STM32开发板学习笔记(一)-- 开篇及STM32按键中断分析(续)
- 嵌入式成长轨迹39 【Zigbee项目】【CC2430基础实验】【按键控制闪烁】
- STM32学习之路-按键中断测试(外部中断)
- STM32学习笔记2-按键实验
- stm32串口中断接收发送实验
- STM32-外部中断实验
- 【连载】【STM32神舟III号实验例程】按键检测与315M无线模块实验(3)
- 基于platform的ok6410按键中断实验
- TI CC2530基础实验(GPIO通用I/O中断操作——一个中断处理程序处理一个端口的多个中断)
- STM32_按键中断
- 基于linux操作系统下s5pv210板子的按键中断实验