登录发现更多内容
首页
分类
发帖
账号
自动登录
找回密码
密码
登录
立即注册
立即登录
立即注册
其他登录
QQ
微信
首页
Portal
求助问答
Xiuno资源
Xiuno教程
Xiuno插件
Xiuno主题
休闲茶馆
定制主题
产品教程
BBS
求助问答
Xiuno资源
Xiuno教程
Xiuno插件
Xiuno主题
休闲茶馆
定制主题
开发资料
求助问答
Xiuno资源
Xiuno教程
Xiuno插件
Xiuno主题
休闲茶馆
定制主题
样品购买
求助问答
Xiuno资源
Xiuno教程
Xiuno插件
Xiuno主题
休闲茶馆
定制主题
IoT云平台
求助问答
Xiuno资源
Xiuno教程
Xiuno插件
Xiuno主题
休闲茶馆
定制主题
GitHub
求助问答
Xiuno资源
Xiuno教程
Xiuno插件
Xiuno主题
休闲茶馆
定制主题
技术博客
求助问答
Xiuno资源
Xiuno教程
Xiuno插件
Xiuno主题
休闲茶馆
定制主题
搜索
搜索
热搜:
LoRa
ESP8266
安信可
本版
帖子
用户
请
登录
后使用快捷导航
没有账号?
立即注册
每日签到
任务
广播
导读
排行榜
设置
我的收藏
退出
21
1
3
首页
Ai-M61系列
›
(八)零基础开发小安派-Eyes-S1【外设篇】——GPIO中断 ...
1
2
3
/ 3 页
下一页
返回列表
(八)零基础开发小安派-Eyes-S1【外设篇】——GPIO中断编程
[ 复制链接 ]
发布帖子
Ai-Thinker小泽
论坛元老
38
主题
555
回帖
6999
积分
论坛元老
论坛元老, 积分 6999, 距离下一级还需 9993000 积分
论坛元老, 积分 6999, 距离下一级还需 9993000 积分
积分
6999
私信
21人留言
#
Ai-M61系列
10718
21
2023-9-15 17:02:28
> 本帖最后由 Ai-Thinker小泽 于 2023-9-15 17:04 编辑 > 本帖最后由 Ai-Thinker小泽 于 2023-9-15 17:03 编辑 # 零基础开发小安派-Eyes-S1【外设篇】——GPIO中断编程 上期的GPIO输入输出编程是基于在main函数中设置while循环不断的改变IO0的电平,同时打印IO1的电平状态。本期了解关于中断编程的概念方法。 ## 一、中断概念了解 我们在常规的程序中,都是在main函数中设置While函数不断运行代码。 而中断的概念则是打断当前的程序,并保护现场,执行另外的程序,而后回到最初打断的位置,举个恰当的例子,比如我们在敲代码,忽然外卖小哥敲门说外卖到了,于是我们先ctrl+s保存,然后去拿完外卖顺便吃了回来继续敲代码。敲代码就是我们的常规程序(发量危),中断源就是外卖小哥的敲门声,而拿外卖吃外卖的过程就是中断服务函数。这就是中断的基本概念。  为什么要使用中断?中断是为了应对各种突发事件,如敲代码的时候忽然有人敲门送外卖。正如使用按键扫描检测和外部中断的区别来说,按键扫描会一直在循环中持续扫描按键在状态,正如我们在敲代码时,因为不知道外卖什么时候送来,还要时不时看看有没有人敲门,注意力都用在盯着门上了,怎么能认真敲代码。而中断正如我们已经设置好了耳朵,我们可以认真敲代码,当有人敲门时我们再自然而然的去开门即可,不需要一直盯着门看。 ### 1.中断源 在上面的例子中,中断源就是外卖小哥的敲门声。我们在开门之后他就会停止敲门,但是实际上我们还是需要手动的告诉MCU不用敲门了,这也就是要清除中断源 的操作。 ### 2.中断服务函数 中断服务函数,也就是我们触发中断后需要执行的操作,这里的吃外卖过程就是中断服务函数的执行过程。一般会在中断服务函数内清除中断源,也就是让外卖小哥别敲门了。 ## 二、中断的配置函数 ### 1.bflb_gpio_int_init 说明: gpio 外部中断初始化 ``` void bflb_gpio_int_init(struct bflb_device_s *dev, uint8_t pin, uint8_t trig_mode); ``` | parameter | description | | --------- | ------------ | | dev | 设备句柄 | | pin | gpio pin | | trig_mode | 中断触发模式 | ### 2.bflb_gpio_int_mask 说明:gpio 外部中断屏蔽开关 ``` void bflb_gpio_int_mask(struct bflb_device_s *dev, uint8_t pin, bool mask); ``` | parameter | description | | --------- | ------------ | | dev | 设备句柄 | | pin | gpio pin | | mask | 是否屏蔽中断 | ### 3.bflb_gpio_get_intstatus 说明: 获取 gpio 外部中断是否触发的标志 ``` bool bflb_gpio_get_intstatus(struct bflb_device_s *dev, uint8_t pin); ``` | parameter | description | | --------- | ----------------------- | | dev | 设备句柄 | | pin | gpio pin | | return | true为触发,false未触发 | ### 4.bflb_gpio_int_clear 说明: 清除 gpio 中断标志 ``` void bflb_gpio_int_clear(struct bflb_device_s *dev, uint8_t pin); ``` | parameter | description | | --------- | ----------- | | dev | 设备句柄 | | pin | gpio pin | ### 5.bflb_irq_attach 说明:设置触发中断后进入的回调函数 ``` int bflb_irq_attach(int irq, irq_callback isr, void *arg) ``` | parameter | description | | --------- | ------------ | | irq | 中断号 | | isr | 中断服务函数 | | arg | 设备句柄 | ### 6.bflb_irq_enable 说明:中断使能 ``` void bflb_irq_enable(int irq) ``` | parameter | description | | --------- | ----------- | | irq | 中断号 | ### 其他:bflb_gpio_uart_init 说明: gpio 配置成 uart 的某一个功能,可配置的可能参考上一期的gpio uart function ``` void bflb_gpio_uart_init(struct bflb_device_s *dev, uint8_t pin, uint8_t uart_func); ``` | parameter | description | | --------- | ---------------- | | dev | 设备句柄 | | pin | gpio pin | | uart_func | uart具体某一功能 | ## 三、示例讲解 这里还是对SDK的中断示例稍作修改 ### main ``` #include "bflb_gpio.h" #include "bflb_mtimer.h" #include "board.h" struct bflb_device_s *gpio; //设置控制的外设句柄,取名gpio void gpio_isr(int irq, void *arg) //中断服务函数 { bool intstatus = bflb_gpio_get_intstatus(gpio, GPIO_PIN_0);//检测中断是否发生 if (intstatus) { //前面的instatus是bool类型,为true,也就是中断发生 bflb_gpio_int_clear(gpio, GPIO_PIN_0);//清除中断源,也就是例子里的敲门声 printf("Finished eating\r\n");//输出信息,“吃完了” } } int main(void) { board_init(); gpio = bflb_device_get_by_name("gpio"); //给外设句柄复位gpio句柄 printf("gpio interrupt\r\n"); bflb_gpio_int_init(gpio, GPIO_PIN_0, GPIO_INT_TRIG_MODE_SYNC_LOW_LEVEL);//第三个参数设置为低电平触发 bflb_gpio_int_mask(gpio, GPIO_PIN_0, false);//是否屏蔽中断,设置为false bflb_irq_attach(gpio->irq_num, gpio_isr, gpio);//第二个参数为中断服务函数的函数名 bflb_irq_enable(gpio->irq_num);//中断使能 while (1) { printf("I am typing the code\r\n");//在常规的while程序中输出“我在敲代码” bflb_mtimer_delay_ms(2000); } } ``` ### 效果 当正常识别串口信息时,只会每两秒打印一次“I am typing the code” 当我用IO0去碰一下TTL的GND脚,也就是拉低,触发了中断,每进入一次中断会打印一次“`Finished eating`”  这里打印了许多次,说明我触发了多次中断,毕竟只是使用杜邦线碰一下地,程序的运行和检测是十分快的,所以及时碰一下还是触发了许多次中断,实际上使用按键会更加灵敏,需要注意的是,不要在中断中使用delay延迟函数!中断是为了应对突发状况,处理的越快越好,而延迟会让整个系统暂停在中断里等待,相当于堵塞在这里,直到延迟结束。
点赞
1
收藏
3
淘帖
2
────
1
人觉得很赞
────
本主题由 管理团队 于
昨天 16:17
移动
本帖被以下淘专辑推荐:
·
小安派S1&M61教程合集
|
主题: 19, 订阅: 5
·
小安派&M61零基础教程
|
主题: 19, 订阅: 5
回复
使用道具
举报
21 回复
电梯直达
倒序浏览
倒序浏览
正序浏览
22
#
dzy7455339
回复
使用道具
举报
2025-9-26 22:00:03
跑这个示例正常烧录,while循环里面的正常打印,但是中断里面的一直不能触发呢。
回复
评论
使用道具
举报
21
#
djy876
回复
使用道具
举报
2024-8-26 09:39:12
打卡学习
回复
评论
使用道具
举报
20
#
WildboarG
回复
使用道具
举报
2024-5-11 15:39:27
中断除了main函数之外还需要什么配置吗,我尝试了大哥给的main函数,while 里边的打印正常显示,给gpio0 拉低 没法进入中断
回复
评论
使用道具
举报
19
#
axkkj
回复
使用道具
举报
2024-4-23 19:23:42
学习
回复
评论
使用道具
举报
18
#
望风阁
回复
使用道具
举报
2024-4-21 08:13:06
WangChong 发表于 2023-9-15 19:02
中断优先级没有吗?还有嵌套中断?
应该是中断号来设置
回复
评论
使用道具
举报
17
#
st780206
回复
使用道具
举报
2023-12-26 08:17:13
先学习,马上弄Ai-M61-32S实验
回复
评论
使用道具
举报
16
#
心云
回复
使用道具
举报
2023-12-3 14:22:35
打卡
回复
评论
使用道具
举报
15
#
心云
回复
使用道具
举报
2023-12-1 11:57:48
打卡
回复
评论
使用道具
举报
14
#
曹县
回复
使用道具
举报
2023-11-30 15:02:54
跟着大神学
回复
评论
使用道具
举报
13
#
干簧管
回复
使用道具
举报
2023-11-30 14:07:20
顶
回复
评论
使用道具
举报
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
立即登录
手机登录
点评
高级模式
本版积分规则
回帖并转播
下一页 »
1
2
3
/ 3 页
下一页
今日推荐
【体验】Ai-WV02-32S 这不就跑起来了么
【问题】Ai-WV02-32S 短路
【B站/视频号直播预告】莫工带你跑通 AI→MCP 协议→硬件执行全
📘 一篇帖,把矽典微毫米波开发系列讲清楚
Ai-BV01-32S 参数全解析——一颗语音模组的底牌,规格书里没写的
第十期电子DIY——用 Ai-WV01-32S 打造一个会说话的AI 小玩意
【DIY小项目分享】AI语音便携可调电源
ai wb2 串口调试,疯狂输出乱码
BW16打板擦除失败是什么原因
我在Application中使能了blinky sample, 程序并没有运行
热帖排行
【体验】Ai-WV02-32S 这不就跑起来了么
关于bouffalo_sdk的环境搭建
【问题】Ai-WV02-32S 短路
【B站/视频号直播预告】莫工带你跑通 AI→MCP 协议→硬件执行全
📘 一篇帖,把矽典微毫米波开发系列讲清楚
Ai-WB2-12F问题请教
Ai-BV01-32S 参数全解析——一颗语音模组的底牌,规格书里没写的
AI-BS21-32S使用AT指令都是Unknown cmd
统计信息
会员数: 31133 个
话题数: 42295 篇
首页
分类
我的