STM32F103 GPIO的外部中断的使用例子。
2016-08-10 22:03
363 查看
STM32的GPIO可以作为中断输入使用,这样增强了实时检测性,可以用于外部按键或是触控等使用。如果使用,其实不难,这里使用标准的固件库,加入外部中断的库文件:stm32f10x_exti.c
在stm32f10x_conf.h 中,打开 #include "stm32f10x_exti.h"
这里通过外部触控的方式,点亮或是关闭一个LED灯的例子,熟悉一下STM32F103 系列外部中断的使用。
我这里使用的GPIO为:PC11,头文件的GPIO宏定义为:
外部中断函数实现如下:
void EXTI_GPIO_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_TOUCHOUT|RCC_APB2Periph_AFIO, ENABLE);//打开GPIO AFIO的时钟
GPIO_InitStructure.GPIO_Pin = TOUCHOUT_PINS;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(TOUCHOUT_PORT, &GPIO_InitStructure);
EXTI_ClearITPendingBit(EXTI_Line11);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource11);//PC11 为GPIOC的PIN11
EXTI_InitStructure.EXTI_Line= EXTI_Line11; //PC11,为:EXTI_Line11
EXTI_InitStructure.EXTI_Mode= EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger= EXTI_Trigger_Rising_Falling; //中断方式为上升与下降沿
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //NVIC
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority= 2;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
下面为中断函数的实现方式:
因此,就实现了外部中断的控制。按键,如果只有一两个,不想用轮循扫描的方式,就可以用外部中断的方式判断。这样可以增强实时性,也不过多占用CPU资源。
在stm32f10x_conf.h 中,打开 #include "stm32f10x_exti.h"
这里通过外部触控的方式,点亮或是关闭一个LED灯的例子,熟悉一下STM32F103 系列外部中断的使用。
我这里使用的GPIO为:PC11,头文件的GPIO宏定义为:
/**** EXTI Control ****/ void EXTI_GPIO_Init(void); #define RCC_TOUCHOUT RCC_APB2Periph_GPIOC #define TOUCHOUT_PORT GPIOC #define TOUCHOUT_PINS GPIO_Pin_11 #define TouchOut() GPIO_ReadInputDataBit(TOUCHOUT_PORT,TOUCHOUT_PINS)
外部中断函数实现如下:
void EXTI_GPIO_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_TOUCHOUT|RCC_APB2Periph_AFIO, ENABLE);//打开GPIO AFIO的时钟
GPIO_InitStructure.GPIO_Pin = TOUCHOUT_PINS;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(TOUCHOUT_PORT, &GPIO_InitStructure);
EXTI_ClearITPendingBit(EXTI_Line11);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource11);//PC11 为GPIOC的PIN11
EXTI_InitStructure.EXTI_Line= EXTI_Line11; //PC11,为:EXTI_Line11
EXTI_InitStructure.EXTI_Mode= EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger= EXTI_Trigger_Rising_Falling; //中断方式为上升与下降沿
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //NVIC
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority= 2;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
下面为中断函数的实现方式:
void EXTI15_10_IRQHandler(void) //这里为:EXTI15_10 (外部中断号的10~15都在这里实现) { if(EXTI_GetITStatus(EXTI_Line11) != RESET) //这里为判断相应的中断号是否进入中断,如果有多个中断的话。 { EXTI_ClearITPendingBit(EXTI_Line11); //清中断 if(Change_Flag!=TouchOut()) LED(ON); else LED(OFF); } }
因此,就实现了外部中断的控制。按键,如果只有一两个,不想用轮循扫描的方式,就可以用外部中断的方式判断。这样可以增强实时性,也不过多占用CPU资源。
相关文章推荐
- stm32学习笔记:GPIO外部中断的使用
- 基于UC/COSII系统的STM32F103系列单片机外部中断按键的一种使用方法
- STM32之中断与事件---一个使用GPIO作为外部中断的示例
- 新手入门使用STM32函数库之外部中断
- TCC89x外部中断使用详解
- STM32学习笔记(2):外部中断的使用
- 【stm32f103】stm32 外部中断(寄存器版)
- 嵌入式Linux下使用GPIO中断功能
- STM32F103学习笔记——外部中断
- STM32 外部GPIO中断配置
- 4、STM32 外部中断的使用
- stm32 外部中断的使用(含实例)
- TCC89x外部中断使用详解
- f4 外部中断的例子同f1略有不同
- WiFi-ESP8266入门开发(十二)-使用GPIO中断
- 51交流贴——定时中断和外部中断同时使用的问题
- AVR单片机使用外部中断和定时器的NEC红外解码程序
- 用户态使用gpio监听中断
- gpio 注册中断 例子
- 关于使用外部中断4进行miller2的思考