沁恒 RISC-V 单片机 CH32V203C8T6 按键中断

目标:

通过中断的方式使用按键,按键 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); // 清楚中断标志位
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞多学堂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值