【小安派试玩】按键中断

[复制链接]
查看1769 | 回复12 | 2023-9-1 20:29:19 | 显示全部楼层 |阅读模式
本帖最后由 iiv 于 2023-9-1 21:02 编辑

啥是中断

当你在打游戏时,如果有突发事件发生(例如你妈让你去打酱油),那么这个事件就成为了一个中断。中断会打断当前正在执行的任务(打游戏),并处理新的事件(去打酱油)。一旦处理完成,会返回之前的任务继续执行(打游戏)。


可以用来做什么
当单片机程序只能按顺序执行while循环中的代码时,并且需要在执行过程中判断某个数据是否到达,中断就发挥了重要作用。中断可以让程序在执行while循环的同时,当有更高优先级的事件发生时(例如某个引脚接收到了数据),自动暂停当前任务并保存上下文数据,然后执行相应的中断服务程序(通常是使用回调函数)。一旦中断任务执行完成,程序会返回到之前被中断的位置,继续恢复执行while循环,提高了程序的实时性和响应能力。
通过使用中断,程序不再需要持续地轮询或堵塞来判断数据是否到达,而是可在即时性要求较高的情况下立即响应外部事件。这种优化方式使得程序能够更加高效地利用系统资源,同时也提供了更灵活的处理方式。


大家好,俺又来啦,这次楼楼来分享一下小安派如果实现简单的中断,中断对楼楼来说用的还是比较多的,所以特意研究了一下,代码不多,楼楼把研究成果分享给大家。


效果展示:


按键中断.gif


因为我们是上升沿触发,并且上拉了io,当按键被释放时,硬件电路会检测到状态变化,并引发一个中断事件,并进入相应的中断服务程序。


楼楼把代码贴在下面

  1. #include "bflb_gpio.h"
  2. #include "bflb_mtimer.h"
  3. #include "board.h"
  4. #include "bflb_pwm_v2.h"
  5. #include "bflb_clock.h"

  6. struct bflb_device_s *gpio;
  7. struct bflb_device_s *pwm;

  8. #define io_pin GPIO_PIN_24 //中断 IO
  9. #define led_pin GPIO_PIN_31 //led IO

  10. uint8_t flg = 0;

  11. // 中断回调
  12. void gpio_isr(int irq, void *arg)
  13. {
  14.     static int i = 0;
  15.     bool intstatus = bflb_gpio_get_intstatus(gpio, io_pin);
  16.     if (intstatus) {
  17.         bflb_gpio_int_clear(gpio, io_pin);
  18.         if(! flg){
  19.             flg = 1;
  20.             bflb_gpio_set(gpio,led_pin);
  21.         }else{
  22.             flg = 0;
  23.             bflb_gpio_reset(gpio,led_pin);
  24.         }
  25.         printf("%d\r\n", i++);
  26.     }
  27. }


  28. int main(void)
  29. {
  30.     board_init();;
  31.     gpio = bflb_device_get_by_name("gpio");
  32.     pwm = bflb_device_get_by_name("pwm_v2_0");

  33.     bflb_gpio_init(gpio,led_pin,GPIO_OUTPUT); //lde 引脚

  34.     bflb_gpio_init(gpio, io_pin, GPIO_INPUT | GPIO_PULLUP); //上拉中断引脚
  35.     bflb_gpio_int_init(gpio, io_pin, GPIO_INT_TRIG_MODE_SYNC_RISING_EDGE); //上升沿触发
  36.     bflb_gpio_int_mask(gpio, io_pin, false); //启用中断
  37.     bflb_irq_attach(gpio->irq_num, gpio_isr, gpio);  //配置中断回调函数
  38.     bflb_irq_enable(gpio->irq_num);  // 使能中断

  39.    
  40.     // PWM配置
  41.     bflb_gpio_init(gpio, 34, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
  42.     struct bflb_pwm_v2_config_s cfg = {
  43.         .clk_source = BFLB_SYSTEM_XCLK,
  44.         .clk_div = 40,
  45.         .period = 1000,
  46.     };
  47.     // 初始化
  48.     bflb_pwm_v2_init(pwm, &cfg);
  49.     // 启用
  50.     bflb_pwm_v2_start(pwm);
  51.     bflb_pwm_v2_channel_positive_start(pwm, 2);


  52.     while (1) {
  53.         for(int i=100;i>0;i--)
  54.         {
  55.             bflb_pwm_v2_channel_set_threshold(pwm, 2, i, 100);
  56.             bflb_mtimer_delay_ms(10);
  57.         }
  58.         for(int i=1;i<100;i++)
  59.         {
  60.             bflb_pwm_v2_channel_set_threshold(pwm, 2, i, 100);   
  61.             bflb_mtimer_delay_ms(10);
  62.         }
  63.     }
  64. }
复制代码

代码很简单,楼楼添加了一些注释,如果有错误的地方大家可以自己修改,希望楼楼的分享可以帮助到大家。



本帖被以下淘专辑推荐:

回复

使用道具 举报

jkernet | 2023-9-1 23:06:53 | 显示全部楼层
深夜学习
回复

使用道具 举报

妖猊 | 2023-9-2 00:39:16 | 显示全部楼层
深夜学习
回复

使用道具 举报

粉肠 | 2023-9-2 11:33:46 | 显示全部楼层
资瓷
回复

使用道具 举报

ai_mcu | 2023-9-2 12:31:43 | 显示全部楼层
反插眼一波
明天总会更好
回复 支持 反对

使用道具 举报

iiv | 2023-9-9 08:54:06 | 显示全部楼层
围观
回复

使用道具 举报

开发板 | 2023-9-9 19:39:45 | 显示全部楼层
围观
回复

使用道具 举报

18350766600@139 | 2023-9-9 22:45:35 | 显示全部楼层
深夜学习
回复

使用道具 举报

linyuuki | 2023-9-17 19:50:16 | 显示全部楼层
按键动作好像有抖动
回复 支持 反对

使用道具 举报

qwe2079282957 | 2023-11-22 13:03:43 | 显示全部楼层
如果是这种16个按键,是需要调用16个gpio吗? 搜狗截图20231122124208.png
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则