【IO中断】基于AI-M6X MCU

[复制链接]
查看1628 | 回复14 | 2023-10-21 17:39:11 | 显示全部楼层 |阅读模式
最近在研究小安派的中断。 昨晚写了一个Demo来进行测试。 关于什么是中断这里已经讲的很清楚了。 首先贴上引用参考。
第一个是泽哥写的中断:

  1. http://ai-thinker.com/forum.php?mod=viewthread&tid=562&highlight=%E4%B8%AD%E6%96%AD&_dsign=fe47e0a0
复制代码
这个是我自己写的:

  1. http://ai-thinker.com/forum.php?mod=viewthread&tid=577&extra=&_dsign=5aff987a
复制代码



由于原理大家都清楚,这里直接上代码:
  1. #include "bflb_mtimer.h"
  2. #include "board.h"
  3. #include "bflb_gpio.h"
  4. #define DBG_TAG "MAIN"
  5. #include "log.h"

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

  8. /**
  9. * @brief 中断回调函数
  10. *
  11. */
  12. void interrupted_function()
  13. {
  14.    // 其实没有必要写这个判断,进来的话一定时触发了中断
  15.    bool intstatus = bflb_gpio_get_intstatus(gpio, GPIO_PIN_10);
  16.    if (intstatus)
  17.    {
  18.       printf("Interrupt \r\n");
  19.       // 清除中断号
  20.       bflb_gpio_int_clear(gpio, GPIO_PIN_10);
  21.       printf("clean successful \r\n");
  22.    }
  23. }

  24. void init_GPIO_interruption()
  25. {

  26.    // 高电平触发
  27.    bflb_gpio_int_init(gpio, GPIO_PIN_10, GPIO_INT_TRIG_MODE_SYNC_HIGH_LEVEL);
  28.    // 是否屏蔽中断
  29.    bflb_gpio_int_mask(gpio, GPIO_PIN_10, 0);
  30.    // 绑定中断回调函数
  31.    bflb_irq_attach(gpio->irq_num, interrupted_function, NULL);
  32. }

  33. int main(void)
  34. {
  35.    board_init();
  36.    // 初始化GPIO
  37.    gpio = bflb_device_get_by_name("gpio");
  38.    // 初始化中断
  39.    init_GPIO_interruption();
  40.    // 根据GPIO中断号开启中断
  41.    bflb_irq_enable(gpio->irq_num);
  42.    while (1)
  43.    {
  44.       // 未触发中断
  45.       printf("correct!");
  46.    };
  47. }
复制代码

实验现象:
使用串口工具连接后控制台会持续打印Interrupt 和clean successful 如果此时把IO10号口接一根杜邦线到GND。 那么则会显示correct。

教程部分:



这里主要是用到了两个库文件#include "bflb_gpio.h" 和 bflb_irq.h




#define GPIO_INT_TRIG_MODE_SYNC_FALLING_EDGE 0
#define GPIO_INT_TRIG_MODE_SYNC_RISING_EDGE  1
#define GPIO_INT_TRIG_MODE_SYNC_LOW_LEVEL    2
#define GPIO_INT_TRIG_MODE_SYNC_HIGH_LEVEL   3
#if defined(BL602) || defined(BL702)
#define GPIO_INT_TRIG_MODE_ASYNC_FALLING_EDGE 4
#define GPIO_INT_TRIG_MODE_ASYNC_RISING_EDGE  5
#define GPIO_INT_TRIG_MODE_ASYNC_LOW_LEVEL    6
#define GPIO_INT_TRIG_MODE_ASYNC_HIGH_LEVEL   7
#else
#define GPIO_INT_TRIG_MODE_SYNC_FALLING_RISING_EDGE 4
#define GPIO_INT_TRIG_MODE_ASYNC_FALLING_EDGE       8
#define GPIO_INT_TRIG_MODE_ASYNC_RISING_EDGE        9
#define GPIO_INT_TRIG_MODE_ASYNC_LOW_LEVEL          10
#define GPIO_INT_TRIG_MODE_ASYNC_HIGH_LEVEL         11




方法如下:







/**
* @brief 是否屏蔽GPIO中断,如果这里屏蔽了的话, 无法进入中断
*
* @param [in] dev device handle
* @param [in] pin gpio pin, use @ref GPIO_PIN
* @param [in] mask true means disable, false means enable
*/
void bflb_gpio_int_mask(struct bflb_device_s *dev, uint8_t pin, bool mask);




/**
* @brief 获取GPIO中断状态
*
* @param [in] dev device handle
* @param [in] pin gpio pin, use @ref GPIO_PIN
* @return true means yes, false means no
*/
bool bflb_gpio_get_intstatus(struct bflb_device_s *dev, uint8_t pin);



/**
* @brief 清除GPIO中断位
*
* @param [in] dev device handle
* @param [in] pin gpio pin, use @ref GPIO_PIN
*/
void bflb_gpio_int_clear(struct bflb_device_s *dev, uint8_t pin);








/**
* @brief 绑定GPIO中断到某一个方法上
*
* @param [in] irq irq number
* @param [in] isr interrupt callback
* @param [in] 这个参数泽哥好像写错了,这个参数好像是数据回调函数的形参。 如果不需要传递 传递NULL即可
* @return A negated errno value on failure.
*/
int bflb_irq_attach(int irq, irq_callback isr, void *arg);



main.zip (773 Bytes, 下载次数: 2)

本帖被以下淘专辑推荐:

回复

使用道具 举报

18350766600@139 | 2023-10-21 19:26:27 | 显示全部楼层
回复

使用道具 举报

WangChong | 2023-10-21 21:04:41 | 显示全部楼层
回复 支持 反对

使用道具 举报

iiv | 2023-10-21 21:20:35 | 显示全部楼层
666
回复

使用道具 举报

jkernet | 2023-10-21 23:31:24 来自手机 | 显示全部楼层
学习了
回复

使用道具 举报

496199544 | 2023-10-22 11:14:38 | 显示全部楼层
学习,打卡
回复

使用道具 举报

lsrly | 2023-10-22 13:07:27 | 显示全部楼层
学习
好好学习,努力挣钱,专心
回复

使用道具 举报

bzhou830 | 2023-10-22 19:34:33 | 显示全部楼层
学习,打卡
选择去发光,而不是被照亮
回复

使用道具 举报

WangChong | 2023-10-24 10:49:49 | 显示全部楼层
回复 支持 反对

使用道具 举报

WangChong | 2023-10-24 10:50:59 | 显示全部楼层
回复 支持 反对

使用道具 举报

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

本版积分规则