GD32F103VE外部中断

GD32F103VE外部中断线线0~15,对应外部IO口的输入中断。它有7个中断向量,外部中断线0 ~ 4分别对应EXTI0_IRQn ~ EXTI4_IRQn中断向量;外部中断线 5 ~ 9 共用一个 EXTI9_5_IRQn中断向量;外部中断线10~15 共用一个 EXTI15_10_IRQn中断向量。

7个中断向量:EXTI0_IRQn,EXTI1_IRQn,EXTI2_IRQn, EXTI3_IRQn, EXTI4_IRQn,EXTI9_5_IRQn和EXTI15_10_IRQn。

这7个中断向量对应7个中断服务函数: EXTI0_IRQHandler(),EXTI1_IRQHandler(),EXTI2_IRQHandler() ,EXTI3_IRQHandler(),EXTI4_IRQHandler(),EXTI9_5_IRQHandler(),EXTI15_10_IRQHandler();

测试程序如下:

#include "KEY.h"
#include "LED.h"

/*
GD32F103VE外部中断线线0~15,对应外部IO口的输入中断。
它有7个中断向量,外部中断线0 ~ 4分别对应EXTI0_IRQn ~ EXTI4_IRQn中断向量;
外部中断线 5 ~ 9 共用一个 EXTI9_5_IRQn中断向量;外部中断线10~15 共用一个EXTI15_10_IRQn中断向量。
7个中断向量:EXTI0_IRQn,EXTI1_IRQn,EXTI2_IRQn, EXTI3_IRQn, EXTI4_IRQn,EXTI9_5_IRQn和EXTI15_10_IRQn。
这7个中断向量对应7个中断服务函数:
EXTI0_IRQHandler();
EXTI1_IRQHandler();
EXTI2_IRQHandler();
EXTI3_IRQHandler();
EXTI4_IRQHandler();
EXTI9_5_IRQHandler();
EXTI15_10_IRQHandler();
*/

void ExternalInterrupt3_Init(void);
void ExternalInterrupt7_Init(void);
void ExternalInterrupt13_Init(void);

//函数功能:初始化ExternalInterrupt3
void ExternalInterrupt3_Init(void)
{
	//NVIC_PRIGROUP_PRE4_SUB0:抢占优先级为4bit(取值为0~15),子优先级为0bit(没有响应优先级)
	//NVIC_PRIGROUP_PRE3_SUB1:抢占优先级为3bit(取值为0~7),子优先级为1bit(取值为0~1)
	//NVIC_PRIGROUP_PRE2_SUB2:抢占优先级为2bit(取值为0~3),子优先级为2bit(取值为0~3)
	//NVIC_PRIGROUP_PRE1_SUB3:抢占优先级为1bit(取值为0~1),子优先级为3bit(取值为0~7)
	//NVIC_PRIGROUP_PRE0_SUB4:抢占优先级为0bit(没有抢占优先级),子优先级为3bit(取值为0~15)
	nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);//设置系统中断优先级"抢占优先级为4bit,子优先级为0bit"
  nvic_irq_enable(EXTI3_IRQn, 2U, 0U);//设置EXTI3_IRQn的中断优先级,抢占优先级为2,子优先级为0

	rcu_periph_clock_enable(RCU_GPIOE);//使能GPIOE时钟,enable GPIO clock
	rcu_periph_clock_enable(RCU_AF);   //外部中断,需要使能复用功能时钟

	gpio_init(GPIOE, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_3);//将GPIOE3设置为浮空输入

	gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOE, GPIO_PIN_SOURCE_3);
	//设置GE3引脚为外部中断源,select GPIO pin exti sources
  exti_init(EXTI_3, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
	//配置外部中断线使用外部中断3(EXTI_3)
	//中断模式为外部中断(EXTI_INTERRUPT)
	//中断触发方式为下降沿中断(EXTI_TRIG_FALLING)
	exti_interrupt_flag_clear(EXTI_3);//清除外部中断3标志
	exti_interrupt_enable(EXTI_3);//使能外部中断3(EXTI_3)
}


//函数功能:外部中断3的中断服务函数,外部中断0~外部中断4具有独立的中断入口地址
void EXTI3_IRQHandler(void)
{
	FlagStatus ret;

	ret=exti_interrupt_flag_get(EXTI_3);
	//读取外部中断3(EXTI_3)的中断标志
	//get EXTI lines flag when the interrupt flag is set
	if(RESET != ret)
	{
		MCU_Led_Toggle();
		exti_interrupt_flag_clear(EXTI_3);
	}
}

//函数功能:初始化ExternalInterrupt7
void ExternalInterrupt7_Init(void)
{
	rcu_periph_clock_enable(RCU_GPIOE);//使能GPIOE时钟,enable GPIO clock
	rcu_periph_clock_enable(RCU_AF);//使能复用功能时钟

	gpio_init(GPIOE, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_7);//将GPIOE7设置为浮空输入

	nvic_irq_enable(EXTI5_9_IRQn, 2U, 0U);//设置EXTI5_9_IRQn的中断优先级,抢占优先级为2,子优先级为0
	gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOE, GPIO_PIN_SOURCE_7);
	//设置GE7引脚为外部中断源,select GPIO pin exti sources
  exti_init(EXTI_7, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
	//配置外部中断线使用外部中断7(EXTI_7)
	//中断模式为外部中断(EXTI_INTERRUPT)
	//中断触发方式为下降沿中断(EXTI_TRIG_FALLING)
	exti_interrupt_flag_clear(EXTI_7);//清除外部中断7标志
	exti_interrupt_enable(EXTI_7);//使能外部中断7(EXTI_7)
}

//this function handles external lines 5 to 9 interrupt request
//函数功能:外部中断5~外部中断9的中断服务函数
void EXTI5_9_IRQHandler(void)
{
	FlagStatus ret;

	ret=exti_interrupt_flag_get(EXTI_7);
	//读取外部中断7(EXTI_7)的中断标志
	//get EXTI lines flag when the interrupt flag is set
	if(RESET != ret)
	{
		MCU_Led_Toggle();
		exti_interrupt_flag_clear(EXTI_7);
	}
}

//函数功能:初始化ExternalInterrupt13
void ExternalInterrupt13_Init(void)
{
	rcu_periph_clock_enable(RCU_GPIOE);//使能GPIOE时钟,enable GPIO clock
	rcu_periph_clock_enable(RCU_AF);//使能复用功能时钟

	gpio_init(GPIOE, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_13);//将GPIOE13设置为浮空输入

	nvic_irq_enable(EXTI10_15_IRQn, 2U, 0U);//设置EXTI10_15_IRQn的中断优先级,抢占优先级为2,子优先级为0
	gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOE, GPIO_PIN_SOURCE_13);
	//设置GE13引脚为外部中断源,select GPIO pin exti sources
  exti_init(EXTI_13, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
	//配置外部中断线使用外部中断13(EXTI_13)
	//中断模式为外部中断(EXTI_INTERRUPT)
	//中断触发方式为下降沿中断(EXTI_TRIG_FALLING)
	exti_interrupt_flag_clear(EXTI_13);//清除外部中断13标志
	exti_interrupt_enable(EXTI_13);//使能外部中断13(EXTI_13)
}

//this function handles external lines 10 to 15 interrupt request
//函数功能:外部中断10~外部中断15的中断服务函数
void EXTI10_15_IRQHandler(void)
{
	FlagStatus ret;

	ret=exti_interrupt_flag_get(EXTI_13);
	//读取外部中断13(EXTI_13)的中断标志
	//get EXTI lines flag when the interrupt flag is set
	if(RESET != ret)
	{
		MCU_Led_Toggle();
		exti_interrupt_flag_clear(EXTI_13);
	}
}

#include "LED.h"

void LED_Init(void);

//函数功能:初始化MCU_Led
void LED_Init(void)
{
	rcu_periph_clock_enable(RCU_GPIOD);//使能GPIOD时钟,enable GPIO clock

	gpio_init(GPIOD, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15);
	//将GPIOD15设置为输出上拉

	MCU_Led_Off();
//	GPIO_BC(GPIOD) = GPIO_PIN_15;//清除GPIOD15输出,GPIO bit clear register
}
#ifndef __LED_H
#define __LED_H

#include "gd32f10x.h" //使能uint8_t,uint16_t,uint32_t,uint64_t,int8_t,int16_t,int32_t,int64_t

#define MCU_Led_Off()  GPIO_BOP(GPIOD)=GPIO_PIN_15  //GD15输出高电平
#define MCU_Led_On() GPIO_BC(GPIOD)=GPIO_PIN_15   //GD15输出低电平
#define MCU_Led_Toggle() gpio_bit_write( GPIOD,GPIO_PIN_15,(bit_status)((1-gpio_input_bit_get(GPIOD,GPIO_PIN_15))) )
//GD15取反输出电平

extern void LED_Init(void);

#endif

 GD32F103VE外部中断_第1张图片

测试时,按下连接到PE3,PE7和PE13的按钮,就可以实现LED灯反转。

你可能感兴趣的:(产品研发,单片机,嵌入式硬件,GD32,外部中断)