EXTI 通过按键实现。
中断服务函数在 RISCV - env_Eclipse - start.S 中,
key.c
#include "key.h"
#include "gd32vf103.h"
#include "gd32vf103_libopt.h"
// ************************************************************************************************************** //
//KEY按键初始化
void KEY_Init()
{
rcu_periph_clock_enable(KEY0_CLK); //开启GPIOA时钟
gpio_init(KEY0_PORT, GPIO_MODE_IPD, GPIO_OSPEED_50MHZ, KEY0_PIN); //下拉输入,50MHz
}
// ************************************************************************************************************** //
//KEY扫描
uint8_t KEY_Scan()
{
static uint8_t Flag = 1;
if(Flag == 1 && (KEY0 == 1 || KEY1 == 1) ) //上下拉的按键需要有不同的判断 =1 或 =0
{
Flag = 0;
delay_1ms(5);
if(KEY0 == 1) {return 1;}
else if(KEY1 == 1) {return 2;}
}
else if(KEY0 == 0 && KEY1 == 0) {Flag = 1;}
return 0;
}
// ************************************************************************************************************** //
//KEY EXTI初始化
void EXTI_Init()
{
rcu_periph_clock_enable(KEY0_CLK); //开启GPIOA时钟
rcu_periph_clock_enable(RCU_AF); //开启复用时钟
gpio_init(KEY0_PORT, GPIO_MODE_IPD, GPIO_OSPEED_50MHZ, KEY0_PIN); //下拉输入,50MHz
gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA, GPIO_PIN_SOURCE_0); //连接按键中断线到按键引脚 PA0
exti_init(EXTI_0, EXTI_INTERRUPT, EXTI_TRIG_RISING); //配置按键外部中断线
eclic_irq_enable(EXTI0_IRQn, 1, 1); //使能外部按键中断线
exti_interrupt_flag_clear(EXTI_0);
}
// ************************************************************************************************************** //
//EXTI0 中断服务函数
void EXTI0_IRQHandler(void)
{
if (exti_interrupt_flag_get(EXTI_0) != RESET)
{
exti_interrupt_flag_clear(EXTI_0);
LED0_T;
}
}
key.h
#ifndef __KEY_H__
#define __KEY_H__
#include "gd32vf103.h"
#include "systick.h"
#include "led.h"
// ************************************************************************************************************** //
#define KEY0_CLK RCU_GPIOA
#define KEY0_PORT GPIOA
#define KEY0_PIN GPIO_PIN_0
#define KEY0 gpio_input_bit_get(KEY0_PORT,KEY0_PIN)
#define KEY1_CLK RCU_GPIOA //若有两个以上按键,更改引脚使用
#define KEY1_PORT GPIOA
#define KEY1_PIN GPIO_PIN_0
#define KEY1 gpio_input_bit_get(KEY1_PORT,KEY1_PIN)
// ************************************************************************************************************** //
void KEY_Init(void);
uint8_t KEY_Scan(void);
void EXTI_Init(void);
void EXTI0_IRQHandler(void);
#endif
main.c
#include "gd32vf103.h"
#include "gd32vf103c_start.h"
#include "systick.h"
#include "led.h"
#include "key.h"
// ************************************************************************************************************* //
//主函数
int main(void)
{
uint8_t key = 0;
eclic_global_interrupt_enable();
eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL3_PRIO1);
LED_Init(); //LED灯初始化
//KEY_Init(); //KEY按键初始化
EXTI_Init(); //按键中断配置
while(1); //等待
}
个人见解,感谢阅读。