0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于单片机的按键中断控制

CHANBAEK 来源:凌云物联网实验室 作者:郭工 2022-12-19 09:23 次阅读

4.1 原理图分析

查看EK-RA6M4的原理图,如下图所示,该开发板上有2个用户按键。

图片

根据原理图可知,这2个按键的控制逻辑为:

按键 S1 S2
引脚 P005 P006
电平 按键按下低电平、按键释放高电平 按键按下低电平、按键释放高电平

4.2 中断配置

首先,在FSP配置中将按键所用的两个GPIO口配置成中断模式。

图片

  • 在这里,我们可以查找到 P005P006的中断号分别为 IRQ10 和 IRQ11;

接着选择 Stacks , 点击 "New Stack" -> "Input" -> "External IRQ(r_icu)" 添加外部中断协议栈。

图片

接下来配置相关的按键中断,并重新生成代码。

图片

  • 通过 Name 字段可以修改按键中断的名称为 g_key1_irq,它将在IDE自动生成的文件 ra_gen/common_data.c/h 中定义按键操作相关的变量;
  • 通过 Channel 字段可以修改按键的中断号,这里设置为10,下面的 Pins 将自动选择 P005 这个引脚;
  • 通过 Trigger 字段可以修改中断的触发方式为下降沿触发;
  • 通过 Callback 字段设置按键的中断回调函数,它将配置在 g_key1_irq_cfg 变量中,该函数需要我们自己实现;
  • 另外,我们也可以在这里修改按键中断的优先级;

4.3 源码修改

创建按键操作相关的头文件 src/bsp_key.h 如下:

#ifndef BSP_KEY_H_
#define BSP_KEY_H_

#define USER_KEY1_IRQ_NUMBER        10
#define USER_KEY2_IRQ_NUMBER        11

extern int key_init(void);

extern void icu_deinit(void);

#endif /* BSP_KEY_H_ */

创建按键操作相关的c文件 src/bsp_key.c 如下:

#include h>
#include "bsp_led.h"
#include "bsp_key.h"
#include "bsp_api.h"
#include "common_data.h"

int key_init(void)
{
    int err = FSP_SUCCESS;

    /* Open and enable key1 interrupt  */
    err = R_ICU_ExternalIrqOpen(&g_key1_irq_ctrl, &g_key1_irq_cfg);
    if (FSP_SUCCESS != err)
    {
        printf ("
**R_ICU_ExternalIrqOpen API FAILED**
");
        return err;
    }

    err = R_ICU_ExternalIrqEnable(&g_key1_irq_ctrl);
    if (FSP_SUCCESS != err)
    {
        printf ("
**R_ICU_ExternalIrqOpen API FAILED**
");
        return err;
    }

    /* Open and enable key1 interrupt  */
    err = R_ICU_ExternalIrqOpen(&g_key2_irq_ctrl, &g_key2_irq_cfg);
    if (FSP_SUCCESS != err)
    {
        printf ("
**R_ICU_ExternalIrqOpen API FAILED**
");
        return err;
    }

    err = R_ICU_ExternalIrqEnable(&g_key2_irq_ctrl);
    if (FSP_SUCCESS != err)
    {
        printf ("
**R_ICU_ExternalIrqOpen API FAILED**
");
        return err;
    }

    return err;
}

void icu_deinit(void)
{
    R_ICU_ExternalIrqClose(&g_key1_irq_ctrl);
    R_ICU_ExternalIrqClose(&g_key2_irq_ctrl);
}

void key_callback(external_irq_callback_args_t *p_args)
{
    static bsp_led_status_t      status[2] = { BSP_LEDON, BSP_LEDON};

    if(USER_KEY1_IRQ_NUMBER == p_args->channel)
    {
        turn_led(BSP_LEDRED, status[0]);
        status[0] ^= 1;
    }
    else if(USER_KEY2_IRQ_NUMBER == p_args->channel)
    {
        turn_led(BSP_LEDGREEN, status[1]);        status[1] ^= 1;
    }
}
  • 按键回调函数 key_callback() 将分别通过两个按键控制 红绿两个灯的亮灭。

修改 src/hal_entry.c 源文件,在里面添加按键初始化代码并修改蓝色Led灯为系统运行的心跳灯状态。

... ...
#include "bsp_key.h"
... ...
void hal_entry(void)
{
    ... ...
    key_init();
    while (1)
    {
        turn_led(BSP_LEDBLUE, BSP_LEDON);
        delay_ms(200);
        turn_led(BSP_LEDBLUE, BSP_LEDOFF);
        delay_ms(200);

        turn_led(BSP_LEDBLUE, BSP_LEDON);
        delay_ms(200);
        turn_led(BSP_LEDBLUE, BSP_LEDOFF);
        delay_ms(200);

        turn_led(BSP_LEDBLUE, BSP_LEDON);
        delay_ms(500);
        turn_led(BSP_LEDBLUE, BSP_LEDOFF);
        delay_ms(1000);
    }
}

4.4 编译运行

代码修改完成后,在开发板上编译运行,蓝色Led将作为系统状态心跳灯,而按下S1、S2将点亮红色和绿色Led,再次按下则将灭掉Led。

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 原理图
    +关注

    关注

    1267

    文章

    6180

    浏览量

    225561
  • 单片机
    +关注

    关注

    5999

    文章

    43966

    浏览量

    620734
  • GPIO
    +关注

    关注

    16

    文章

    1132

    浏览量

    50560
  • 按键中断
    +关注

    关注

    0

    文章

    14

    浏览量

    6412
收藏 人收藏

    评论

    相关推荐

    单片机原理与应用: 中断控制与操作#单片机

    单片机中断
    学习硬声知识
    发布于 :2022年11月08日 18:46:02

    单片机原理及应用: 中断控制#单片机

    单片机中断
    学习硬声知识
    发布于 :2022年11月08日 23:49:50

    单片机按键

    我要实现单片机 按键的外部中断,但是很不稳定,怎么解决
    发表于 06-07 10:38

    STM32单片机触摸按键抬起也进入中断

    STM32单片机触摸按键抬起也进入中断是什么问题?
    发表于 04-10 07:55

    51单片机按键控制led花样闪烁(非用中断)

    51单片机按键控制led花样闪烁(非用中断),51中用一个main主函数来控制led花样闪烁,实现和用中断
    发表于 12-25 19:39

    利用单片机中断系统完成程序设计

    实验目的和任务目的:利用“模块化单片机教学实验平台”,加深对单片机中断系统的理解。任务:利用单片机中断系统完成程序设计。 实验内容使用A
    发表于 07-21 07:22

    如何利用单片机外部中断实现按键输入?

    如何利用单片机外部中断实现按键输入?
    发表于 09-28 06:51

    51单片机按键输入

    按键可以说是51单片机项目开发的一个重要组件了,它是作为51单片机IO口输入的一种重要方式。我们可以通过按键控制单片机执行相应的程序,得到我们想要得效果。51
    发表于 11-18 07:39

    单片机按键控制程序【C语言】

    单片机按键控制程序【C语言】单片机按键控制程序【C语言】单片机按键控制程序【C语言】
    发表于 12-29 11:04 29次下载

    单片机中断系统介绍_51单片机中断系统结构

    单片机中断就是当单片机正在执行程序的时候,突然某个按键按下了(产生外部中断),单片机就必须得去处
    发表于 01-10 17:29 1.2w次阅读
    <b class='flag-5'>单片机</b><b class='flag-5'>中断</b>系统介绍_51<b class='flag-5'>单片机</b><b class='flag-5'>中断</b>系统结构

    单片机外部中断程序下载

    单片机外部中断程序和电路图,通过按键控制计数和清零操作
    发表于 05-21 10:57 0次下载
    <b class='flag-5'>单片机</b>外部<b class='flag-5'>中断</b>程序下载

    使用51单片机外部中断按键控制LED闪烁的程序免费下载

    本文档的主要内容详细介绍的是使用51单片机外部中断按键控制LED闪烁的程序免费下载。
    发表于 07-05 17:41 26次下载
    使用51<b class='flag-5'>单片机</b>外部<b class='flag-5'>中断</b><b class='flag-5'>按键控制</b>LED闪烁的程序免费下载

    单片机--中断系统实验

    实验目的和任务目的:利用“模块化单片机教学实验平台”,加深对单片机中断系统的理解。任务:利用单片机中断系统完成程序设计。 实验内容使用A
    发表于 11-05 13:20 11次下载
    <b class='flag-5'>单片机</b>--<b class='flag-5'>中断</b>系统实验

    单片机按键使用程序 (51单片机

    单片机独立按键使用程序 (51单片机)独立按键单片机中很重要的一个器件,在这篇文章里,通过这个用独立
    发表于 11-11 18:36 105次下载
    <b class='flag-5'>单片机</b><b class='flag-5'>按键</b>使用程序 (51<b class='flag-5'>单片机</b>)

    瑞萨单片机之外部中断实现按键的长按与短按(二)

    瑞萨单片机通过外部中断实现按键的长按与短按
    发表于 11-22 14:21 19次下载
    瑞萨<b class='flag-5'>单片机</b>之外部<b class='flag-5'>中断</b>实现<b class='flag-5'>按键</b>的长按与短按(二)