stm8s开发(六) EXIT的使用:做一个外部中断的按钮!

本文介绍了GPIO通过寄存器设置为中断输入的方法,并详细解释了如何配置STM32的PC3引脚作为外部中断输入,包括配置模式、上拉电阻输入及中断触发方式等。此外还讲解了机械按钮中断的消抖处理和松手检测。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在前几篇文章,GPIO的使用:点亮LED!中只讲述了IO口的输出,并没有输入,因为IO作为输入我建议采用中断方式,可以大大减轻CPU的运行时间。最常用的就是按钮的功能了,当然还有和其他芯片通信的功能。

前篇文章讲过GPIO可以通过寄存器设置为中断输入。(参考http://blog.csdn.net/devintt/article/details/50818494

配置模式DDRCR1CR2配置模式上拉电阻
输入000悬浮输入 OFF
010上拉输入ON
001中断悬浮输入 OFF
011中断上拉输入ON
输出100开漏输出 OFF
110推挽输出
1x1输出(最快速度10MHZ) 
xxx真正的开漏输出未采用

这里我们选用PC3作为外部中断

  1. void EXIT_GPIO_Init(void)
  2. {
  3. PC_DDR &= 0xf7;
  4. PC_CR1 |= 0x08; // 将PC3设置成中断上拉输入
  5. PC_CR2 |= 0x08;
  6. EXTI_CR1 = 0x20; //PC设置为下降沿触发
  7. }

这里需要注意的是,中断向量指定的是PC,也就是说 如果有几个PC口都设置为中断的话,只要其中一个中断响应,就会进入同一个函数

如果你有好几个按键在同一个port口的话,可以在进入中断函数之后做一个IO口状态的获取,判定哪个IO进行了中断,再对应相应的操作。

  1. #pragma vector = EXIT_PORTC_vector //0x07
  2. __ interrupt void EXIT_PORTC_RQHandler(void) //中断服务函数
  3. {
  4. if((PC_IDR & 0x08)== 0)
  5. {
  6. delay_nms( 50); //延时50ms,消抖
  7. if((PC_IDR & 0x08)== 0) //再判断是否按下
  8. {
  9. while(!(PC_IDR & 0x08)); //松手检测
  10. //TODO
  11. }
  12. }
  13. }
由于使用了机械按钮,一般都会有一个机械抖动的过程,所以进入了中断函数之后,我们先做一个消抖处理,这样就可以判断按钮的状态,同时也防止抖动造成了多次中断函数的反复进入。最后加入松手检测,判定按钮动作完成。(TODO这里就可以加入你需要的操作了)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值