在线时间717 小时
UID3469866
注册时间2018-4-19
NXP金币3688

TA的每日心情 | 慵懒 2025-5-7 08:45 |
---|
签到天数: 279 天 连续签到: 1 天 [LV.8]以坛为家I
版主
  
- 积分
- 10981

- 最后登录
- 2025-7-30
|
本帖最后由 az158 于 2021-6-1 21:24 编辑
本文我们来讲一下如何使用按键,本文将从轮询式与中断式两种进行举例。
查看原理图,找到按键所在的IO。
一、轮询的方式实现按键
配置IO复用,下面参数不是很明白的可以去看RT1010连载--3.点亮小灯。
- IOMUXC_SetPinMux(IOMUXC_GPIO_SD_05_GPIO2_IO05, 0U);
- //IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_05_GPIO2_IO05, 0x01F080U);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_05_GPIO2_IO05, IOMUXC_SW_PAD_CTL_PAD_SRE(0) | //压摆率:低
- IOMUXC_SW_PAD_CTL_PAD_DSE(0) | //驱动强度:关闭
- IOMUXC_SW_PAD_CTL_PAD_SPEED(2)| //输出速率:150MHz
- IOMUXC_SW_PAD_CTL_PAD_ODE(0) | //开漏输出:关闭
- IOMUXC_SW_PAD_CTL_PAD_PKE(1) | //上下拉电阻和状态保持器:使能
- IOMUXC_SW_PAD_CTL_PAD_PUE(1) | //上下拉电阻和状态保持器:上下拉
- IOMUXC_SW_PAD_CTL_PAD_PUS(3) | //上拉/下拉选择:上拉22K Ohm
- IOMUXC_SW_PAD_CTL_PAD_HYS(1) //迟滞比较: 开启
- );
复制代码
接下来是对GPIO功能的配置:
- gpio_pin_config_t gpio_config;
- gpio_config.direction = kGPIO_DigitalInput; //输入模式
- gpio_config.outputLogic = 1; //默认高电平,输入模式时无效
- gpio_config.interruptMode = kGPIO_NoIntmode; //不使用中断
- GPIO_PinInit(GPIO2, 5, &gpio_config); //配置按键
复制代码
主循环
- while (1)
- {
- if(GPIO_PinRead(GPIO2, 5) == 0)
- {
- while(GPIO_PinRead(GPIO2, 5) == 0){}
- PRINTF("按键按下\r\n");
- }
- }
复制代码
如果有对GPIO函数不是特别清楚的,可以参考NXP的在线SDK文档GPIO篇,里面有很详细的介绍。
运行效果,按下按键后打印(编译的警告不用太在意,这是因为AC6不支持GBK编码的原因)
轮询式使用MCUXpresso Config Tools配置方式跟LED的很类似,就不再啰嗦了,可以去看RT1010连载--3.点亮小灯。
二、中断的方式实现按键
IO复用方式与前面相同。
配置GPIO功能
- gpio_pin_config_t gpio_config;
- gpio_config.direction = kGPIO_DigitalInput; //输入模式
- gpio_config.outputLogic = 1; //默认高电平,输入模式时无效
- gpio_config.interruptMode = kGPIO_IntFallingEdge; //下降沿中断
- GPIO_PinInit(GPIO2, 5, &gpio_config); //配置按键
复制代码
这里将其配置为下降沿中断,除了这个还支持许多其他的模式,都可以试试
- typedef enum _gpio_interrupt_mode
- {
- kGPIO_NoIntmode = 0U, /*!< Set current pin general IO functionality.*/
- kGPIO_IntLowLevel = 1U, /*!< Set current pin interrupt is low-level sensitive.*/
- kGPIO_IntHighLevel = 2U, /*!< Set current pin interrupt is high-level sensitive.*/
- kGPIO_IntRisingEdge = 3U, /*!< Set current pin interrupt is rising-edge sensitive.*/
- kGPIO_IntFallingEdge = 4U, /*!< Set current pin interrupt is falling-edge sensitive.*/
- kGPIO_IntRisingOrFallingEdge = 5U, /*!< Enable the edge select bit to override the ICR register's configuration.*/
- } gpio_interrupt_mode_t;
复制代码
然后是使能中断
- GPIO_PortEnableInterrupts(GPIO2, 1<<5); //GPIO2_5中断使能
- EnableIRQ(GPIO2_Combined_0_15_IRQn); //使能GPIO2_0~15的中断
复制代码 没啥特别好说的,其中中断优先级的配置方式与其他ARM芯片相同,注意的是只支持[7:4]。本文就不讲这了,有兴趣的可以看看别的芯片的配置方式。
中断回调函数
- void GPIO2_Combined_0_15_IRQHandler(void)
- {
- //注意!!!放在这里只是为了功能演示,实际项目中,不可以将printf这种运行时间很长的函数放在中断里面!!!
- PRINTF("按键按下\r\n");
- GPIO_PortClearInterruptFlags(GPIO2,1<<5); //清除中断标志位
- SDK_ISR_EXIT_BARRIER; //数据同步屏蔽指令
- }
复制代码 注意要加最后的SDK_ISR_EXIT_BARRIER
运行现象与上面相同。
接下来讲一下使用MCUXpresso Config Tools完成按键中断的方式。
配置IO
开启外设的代码生成
配置中断外设
把peripherals.c添加到工程里面。
主函数代码也简单了很多(可参考附件工程),运行效果与上面相同。
最后附上工程。
4.key_interrupt.zip
(1.87 MB, 下载次数: 2)
|
|