由 WangChong 贡献,Ai-Thinker 进行整理
最近在研究小安派的中断。 昨晚写了一个Demo来进行测试。 关于什么是中断这里已经讲的很清楚了。 首先贴上引用参考。 第一个是泽哥写的中断:
这个是我自己写的:
由于原理大家都清楚,这里直接上代码:
c
#include "bflb_mtimer.h"
#include "board.h"
#include "bflb_gpio.h"
#define DBG_TAG "MAIN"
#include "log.h"
struct bflb_device_s *gpio;
struct bflb_device_s *led;
/**
* @brief 中断回调函数
*
*/
void interrupted_function()
{
// 其实没有必要写这个判断,进来的话一定时触发了中断
bool intstatus = bflb_gpio_get_intstatus(gpio, GPIO_PIN_10);
if (intstatus) {
printf("Interrupt \r\n");
// 清除中断号
bflb_gpio_int_clear(gpio, GPIO_PIN_10);
printf("clean successful \r\n");
}
}
void init_GPIO_interruption()
{
// 高电平触发
bflb_gpio_int_init(gpio, GPIO_PIN_10, GPIO_INT_TRIG_MODE_SYNC_HIGH_LEVEL);
// 是否屏蔽中断
bflb_gpio_int_mask(gpio, GPIO_PIN_10, 0);
// 绑定中断回调函数
bflb_irq_attach(gpio->irq_num, interrupted_function, NULL);
}
int main(void)
{
board_init();
// 初始化GPIO
gpio = bflb_device_get_by_name("gpio");
// 初始化中断
init_GPIO_interruption();
// 根据GPIO中断号开启中断
bflb_irq_enable(gpio->irq_num);
while (1) {
// 未触发中断
printf("correct!");
};
}实验现象:使用串口工具连接后控制台会持续打印Interrupt 和clean successful 如果此时把IO10号口接一根杜邦线到GND。 那么则会显示correct。
教程部分:
这里主要是用到了两个库文件**,** #include "bflb_gpio.h" 和 bflb_irq.h
c
#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
#endif方法如下:
c
/**
* @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)
2023-10-21 17:37 上传
点击文件名下载附件
遇到问题?
如有其他问题,请到统一的提问与讨论区:Ai-Thinker Discussions

