查看: 2167|回复: 2

RT1010连载--4.按键输入

[复制链接]
  • TA的每日心情
    慵懒
    2025-5-7 08:45
  • 签到天数: 279 天

    连续签到: 1 天

    [LV.8]以坛为家I

    114

    主题

    1313

    帖子

    29

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    10981

    热心会员

    最后登录
    2025-7-30
    发表于 2021-6-4 07:52:36 | 显示全部楼层 |阅读模式
    本帖最后由 az158 于 2021-6-1 21:24 编辑

    本文我们来讲一下如何使用按键,本文将从轮询式与中断式两种进行举例。

    查看原理图,找到按键所在的IO。
    QQ截图20210530210148.png
    QQ截图20210530210048.png

    一、轮询的方式实现按键

    配置IO复用,下面参数不是很明白的可以去看RT1010连载--3.点亮小灯
    1. IOMUXC_SetPinMux(IOMUXC_GPIO_SD_05_GPIO2_IO05, 0U);
    2. //IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_05_GPIO2_IO05, 0x01F080U);
    3. IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_05_GPIO2_IO05, IOMUXC_SW_PAD_CTL_PAD_SRE(0)  | //压摆率:低
    4.                                           IOMUXC_SW_PAD_CTL_PAD_DSE(0)  | //驱动强度:关闭
    5.                                           IOMUXC_SW_PAD_CTL_PAD_SPEED(2)| //输出速率:150MHz
    6.                                           IOMUXC_SW_PAD_CTL_PAD_ODE(0)  | //开漏输出:关闭
    7.                                           IOMUXC_SW_PAD_CTL_PAD_PKE(1)  | //上下拉电阻和状态保持器:使能
    8.                                           IOMUXC_SW_PAD_CTL_PAD_PUE(1)  | //上下拉电阻和状态保持器:上下拉
    9.                                           IOMUXC_SW_PAD_CTL_PAD_PUS(3)  | //上拉/下拉选择:上拉22K Ohm
    10.                                           IOMUXC_SW_PAD_CTL_PAD_HYS(1)    //迟滞比较: 开启

    11. );
    复制代码

    接下来是对GPIO功能的配置:
    1. gpio_pin_config_t gpio_config;

    2. gpio_config.direction     = kGPIO_DigitalInput;  //输入模式
    3. gpio_config.outputLogic   = 1;                   //默认高电平,输入模式时无效
    4. gpio_config.interruptMode = kGPIO_NoIntmode;      //不使用中断
    5. GPIO_PinInit(GPIO2, 5, &gpio_config);     //配置按键
    复制代码

    主循环
    1. while (1)
    2. {
    3.     if(GPIO_PinRead(GPIO2, 5) == 0)
    4.     {
    5.         while(GPIO_PinRead(GPIO2, 5) == 0){}
    6.         PRINTF("按键按下\r\n");
    7.     }
    8. }
    复制代码

    如果有对GPIO函数不是特别清楚的,可以参考NXP的在线SDK文档GPIO篇里面有很详细的介绍。

    运行效果,按下按键后打印(编译的警告不用太在意,这是因为AC6不支持GBK编码的原因)
    QQ截图20210530231310.png


    轮询式使用MCUXpresso Config Tools配置方式跟LED的很类似,就不再啰嗦了,可以去看RT1010连载--3.点亮小灯


    二、中断的方式实现按键

    IO复用方式与前面相同。
    配置GPIO功能
    1. gpio_pin_config_t gpio_config;
    2. gpio_config.direction     = kGPIO_DigitalInput;   //输入模式
    3. gpio_config.outputLogic   = 1;                    //默认高电平,输入模式时无效
    4. gpio_config.interruptMode = kGPIO_IntFallingEdge; //下降沿中断
    5. GPIO_PinInit(GPIO2, 5, &gpio_config);     //配置按键
    复制代码

    这里将其配置为下降沿中断,除了这个还支持许多其他的模式,都可以试试
    1. typedef enum _gpio_interrupt_mode
    2. {
    3.     kGPIO_NoIntmode              = 0U, /*!< Set current pin general IO functionality.*/
    4.     kGPIO_IntLowLevel            = 1U, /*!< Set current pin interrupt is low-level sensitive.*/
    5.     kGPIO_IntHighLevel           = 2U, /*!< Set current pin interrupt is high-level sensitive.*/
    6.     kGPIO_IntRisingEdge          = 3U, /*!< Set current pin interrupt is rising-edge sensitive.*/
    7.     kGPIO_IntFallingEdge         = 4U, /*!< Set current pin interrupt is falling-edge sensitive.*/
    8.     kGPIO_IntRisingOrFallingEdge = 5U, /*!< Enable the edge select bit to override the ICR register's configuration.*/
    9. } gpio_interrupt_mode_t;
    复制代码

    然后是使能中断
    1. GPIO_PortEnableInterrupts(GPIO2, 1<<5);  //GPIO2_5中断使能
    2. EnableIRQ(GPIO2_Combined_0_15_IRQn);       //使能GPIO2_0~15的中断
    复制代码
    没啥特别好说的,其中中断优先级的配置方式与其他ARM芯片相同,注意的是只支持[7:4]。本文就不讲这了,有兴趣的可以看看别的芯片的配置方式。

    中断回调函数
    1. void GPIO2_Combined_0_15_IRQHandler(void)
    2. {
    3.     //注意!!!放在这里只是为了功能演示,实际项目中,不可以将printf这种运行时间很长的函数放在中断里面!!!
    4.     PRINTF("按键按下\r\n");
    5.     GPIO_PortClearInterruptFlags(GPIO2,1<<5); //清除中断标志位
    6.     SDK_ISR_EXIT_BARRIER; //数据同步屏蔽指令
    7. }
    复制代码
    注意要加最后的SDK_ISR_EXIT_BARRIER

    运行现象与上面相同。

    接下来讲一下使用MCUXpresso Config Tools完成按键中断的方式。
    配置IO
    QQ截图20210531000341.png
    QQ截图20210531000927.png

    开启外设的代码生成
    QQ截图20210531000412.png
    QQ截图20210531000421.png

    配置中断外设
    QQ截图20210531000443.png
    QQ截图20210531000608.png

    把peripherals.c添加到工程里面。
    QQ截图20210531001324.png

    主函数代码也简单了很多(可参考附件工程),运行效果与上面相同。

    最后附上工程。

    4.key_interrupt.zip (1.87 MB, 下载次数: 2)
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-1-6 14:57
  • 签到天数: 307 天

    连续签到: 1 天

    [LV.8]以坛为家I

    14

    主题

    1747

    帖子

    4

    金牌会员

    Rank: 6Rank: 6

    积分
    2699
    最后登录
    2025-5-29
    发表于 2021-6-8 18:35:55 | 显示全部楼层
    看着头大,不是学代码的有点看不懂
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    1

    帖子

    0

    新手上路

    Rank: 1

    积分
    6
    最后登录
    2021-11-8
    发表于 2021-7-13 18:41:34 | 显示全部楼层
    写的很详细,感谢帖子
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-1 00:43 , Processed in 0.085308 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表