您的位置:首页 > 编程语言

EXTI学习笔记—GPIO外部中断代码

2019-05-16 10:57 183 查看

*编程要点
1-初始化要连接到EXTI的GPIO
2-初始化EXTI用于产生中断/事件
3-初始化NVIC,用于处理中断
4-编写中断服务函数
5-main函数 *

c文件:

#include "bsp_exti.h"

static void EXTI_NVIC_Config(void)														//static限定 只能被此c文件调用
{
NVIC_InitTypeDef NVIC_InitStruct;                           //初始化NVIC结构体

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);        			//中断优先级分组

NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;								//选择中断源EXTI0,这里要特别注意当选择EXTI9_5 EXTI15_10
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;			//主优先级,数字越小,优先级越高
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;							//子优先级
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;								//开总中断
NVIC_Init(&NVIC_InitStruct);																//结构体成员写入寄存器 &取地址
}

void EXIT_Key_Config(void)
{
GPIO_InitTypeDef  GPIO_InitStruct;                          //初始化GPIO结构体
EXTI_InitTypeDef  EXTI_InitStruct;                          //初始化EXTI结构体

// 配置中断优先级
EXTI_NVIC_Config();																					//调用函数

// 初始化GPIO
RCC_APB2PeriphClockCmd(KEY1_INT_GPIO_CLK, ENABLE);	        //开GPIO时钟
GPIO_InitStruct.GPIO_Pin = KEY1_INT_GPIO_PIN;				        //选脚GPIO_Pin_0
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;	        //浮空输入
GPIO_Init(KEY1_INT_GPIO_PORT, &GPIO_InitStruct);		        //初始化GPIOA端口

// 初始化EXTI 及 EXTI结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);				//开AFIO时钟
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //选择PA端口0脚 PA0

EXTI_InitStruct.EXTI_Line = EXTI_Line0;                     //选择Line0
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;						//中断模式
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;					//上升沿触发
EXTI_InitStruct.EXTI_LineCmd = ENABLE;											//使能中断屏蔽事件寄存器
EXTI_Init(&EXTI_InitStruct);																//结构体成员写入寄存器 &取地址
}

h文件:

#ifndef __BSP_EXTI_H
#define __BSP_EXTI_H

#include "stm32f10x.h"

#define KEY1_INT_GPIO_PIN           GPIO_Pin_0
#define KEY1_INT_GPIO_PORT          GPIOA
#define KEY1_INT_GPIO_CLK           RCC_APB2Periph_GPIOA

void EXIT_Key_Config(void);

#endif /* __BSP_EXTI_H */

中断服务函数:

void EXTI0_IRQHandler (void)
{
if(EXTI_GetITStatus(EXTI_Line0) != RESET)  //判断中短线有没有置位
{
LED_G_TOGGLE;														 //led反转
}
EXTI_ClearITPendingBit(EXTI_Line0);				 //清除中断标志位,不然一直在中断里
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: