目标:
通过中断的方式使用按键,按键 KEY1 连接到引脚:PB5。
使用 key1_int_init() 函数配置,中断发生时 KEY1_IRQHandler 函数会被调用:
/*
* key.c
*
* Created on: Apr 18, 2023
* Author: Fiyduo
加作者微信:jiyuyun18(积雨云), 交流电子技术
留言:CSDN入群,加入电子技术讨论群
留言:CSDN资料,领取免费电子技术学习资料
*/
#include "ch32v20x_conf.h" // MCU 头文件
#include "led.h" // LED 头文件
// 不加这句,中断只会响应一次
void EXTI9_5_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
// PB5 : KEY1
// PB6 : KEY2
/*--------------------KEY1 引脚定义及相关宏定义------------------------------------------------------------ */
#define KEY1_INT_GPIO_PORT GPIOB
#define KEY1_INT_GPIO_PIN GPIO_Pin_5
// 用到EXTI必须开启AFIO时钟
#define KEY1_INT_GPIO_CLK (RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO)
#define KEY1_INT_EXTI_PORTSOURCE GPIO_PortSourceGPIOB
#define KEY1_INT_EXTI_PINSOURCE GPIO_PinSource5
#define KEY1_INT_EXTI_LINE EXTI_Line5
#define KEY1_INT_EXTI_IRQ EXTI9_5_IRQn
#define KEY1_IRQHandler EXTI9_5_IRQHandler
/*--------------------KEY1 引脚定义及相关宏定义------------------------------------------------------------ */
/*********************************************************************
* @fn key1_int_init
*
* @brief Key1 按键中断初始化.
*
* @return none
*/
void key1_int_init(void)
{
GPIO_InitTypeDef gpio = {0};
EXTI_InitTypeDef exti = {0};
NVIC_InitTypeDef nvic = {0};
// 开启按键 GPIO 口的时钟
RCC_APB2PeriphClockCmd(KEY1_INT_GPIO_CLK, ENABLE);
gpio.GPIO_Pin = KEY1_INT_GPIO_PIN;
gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &gpio);
/* PB5 ----> EXTI_Line5 */
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource5);
exti.EXTI_Line = KEY1_INT_EXTI_LINE;
exti.EXTI_Mode = EXTI_Mode_Interrupt;
exti.EXTI_Trigger = EXTI_Trigger_Rising; // 上升沿中断
exti.EXTI_LineCmd = ENABLE;
EXTI_Init(&exti);
nvic.NVIC_IRQChannel = KEY1_INT_EXTI_IRQ;
nvic.NVIC_IRQChannelPreemptionPriority = 1;
nvic.NVIC_IRQChannelSubPriority = 2;
nvic.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&nvic);
}
// KEY1 按键响应函数
void KEY1_IRQHandler(void)
{
// 确保是否产生了 EXTI Line 中断
if (EXTI_GetITStatus(KEY1_INT_EXTI_LINE) == SET) {
printf("KEY1 被按下\r\n");
LED1_TOGGLE;
EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE); // 清楚中断标志位
}
}