赞
踩
中断即打断,当单片机在顺序执行当前程序时,由于系统出现了某种需要紧急处理的情况,单片机暂停正在执行的程序,转而去执行紧急事务,当处理结束后单片机自动返回到原先暂停的程序中继续执行,这种执行过程由于外界的原因被打断的情况叫做中断。
EXTI支持配置20个中断和事件屏蔽位;
GPIO端口连接到16个外部中断/事件线上;EXTI_Line0 — EXTI_Line15;
EXTI_Line16 连接到PVD输出 ;
EXTI_Line17连接到RTC闹钟事件;
EXTI_Line18连接到USB唤醒事件;
EXTI_Line19连接到以太网唤醒事件(只适用于互联型产品);
一般使用GPIO的外部中断功能,都需要有以下几个步骤:
STM32单片机的任意引脚都可以配置为外部中断触发,我们对应的去使能引脚的外部中断功能即可。
KEY.c
- #include "stm32f10x.h" // Device header
- #include "Delay.h"
- #include "KEY.h"
-
- uint8_t Key_Value;
-
- static void NVIC_Configuration(void)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
-
- /* 配置NVIC为优先级组1 */
- /* 提示 NVIC_PriorityGroupConfig() 在整个工程只需要调用一次来配置优先级分组*/
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
-
- /* 配置中断源:KEY1 */
- NVIC_InitStructure.NVIC_IRQChannel = KEY1_INT_EXTI_IRQ;
- /* 配置抢占优先级 */
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
- /* 配置自然优先级 */
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
- /* 使能中断通道 */
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- }
-
- /*
- * 函数内容:初始化按键GPIO
- * 函数参数:无
- * 返回值: 无
- */
- void KEY_Init()
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- EXTI_InitTypeDef EXTI_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);
-
- /* 配置 NVIC 中断 */
- NVIC_Configuration();
-
- /* 配置为上拉输入 */
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
- GPIO_InitStructure.GPIO_Pin = KEY1_INT_GPIO_PIN;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB,&GPIO_InitStructure);
-
- /* 选择EXTI的信号源 */
- GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,KEY1_INT_EXTI_PINSOURCE);
- EXTI_InitStructure.EXTI_Line = KEY1_INT_EXTI_LINE;
- /* EXTI为中断模式 */
- EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
- /* 下降沿中断 */
- EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
- /* 使能中断 */
- EXTI_InitStructure.EXTI_LineCmd = ENABLE;
- EXTI_Init(&EXTI_InitStructure);
-
- EXTI_ClearFlag(KEY1_INT_EXTI_LINE);
- }
-
- //独立按键中断
- void EXTI15_10_IRQHandler(void)
- {
- if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE)!=RESET)
- {
- Delay_ms(5);
- if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==RESET)
- {
- Key_Value = 1;
- }
- //清除标志位
- EXTI_ClearFlag(KEY1_INT_EXTI_LINE);
- }
- }
KEY.h
- #ifndef __KEY_H_
- #define __KEY_H_
- #include "stm32f10x.h" // Device header
- #include "main.h"
-
-
-
- //按键引脚定义
- #define KEY1_INT_GPIO_PORT GPIOB
- #define KEY1_INT_GPIO_CLK (RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO)
- #define KEY1_INT_GPIO_PIN GPIO_Pin_13
- #define KEY1_INT_EXTI_PORTSOURCE GPIO_PortSourceGPIOB
- #define KEY1_INT_EXTI_PINSOURCE GPIO_PinSource13
- #define KEY1_INT_EXTI_LINE EXTI_Line13
- #define KEY1_INT_EXTI_IRQ EXTI15_10_IRQn
- #define KEY1_IRQHandler EXTI15_10_IRQHandler
-
-
- void KEY_Init();
-
- #endif
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。