24 鸿蒙LiteOS GPIO中断实战:从原理到上升沿/下降沿详解

发布时间:2026/5/22 3:20:12

24 鸿蒙LiteOS GPIO中断实战:从原理到上升沿/下降沿详解 鸿蒙LiteOS GPIO中断实战从原理到上升沿/下降沿详解哔站视频《【RK2206 鸿蒙LiteOS 实战 09】GPIO中断实战(上)从原理到上升沿/下降沿详解》https://www.bilibili.com/video/BV16XLh6wEWw/?vd_source3a9dd7a328acafb09dd1b8d05f3e2bf7一、前言在嵌入式、鸿蒙LiteOS开发里几乎所有外设都离不开GPIO。比如检测按键按下、松开接收传感器的电平信号外部设备触发信号低功耗、高实时性的事件响应这些场景如果用while(1)轮询方式会大量占用CPU、实时性差、容易丢信号。所以GPIO中断才是工业/产品级的正确做法。本文从什么是GPIO开始讲起只讲中断方式通俗易懂、源码可直接用。问题最重要问题为什么按了一下系统就能检测到按键按下什么是 GPIO 如何和原理图对应起来为什么要用 GPIO 中断什么是中断还有其他方式吗什么是上升沿、下降沿实际中如何体现出来什么是双边沿中断函数里不能做什么二、什么是 GPIOGPIO General Purpose Input Output通用输入输出口你可以把它理解为单片机的“手脚”输入模式用来读外部信号按键、传感器、电平输出模式用来控制外部设备LED、继电器、蜂鸣器一句话GPIO 就是单片机与外部世界通信的最基础接口。而我们今天要讲的GPIO 中断是 GPIO 最强大、最高效的功能。三、什么是 GPIO 中断为什么要用中断1. 什么是中断中断就是平时CPU干自己的事一旦外部引脚电平发生变化CPU立刻停下手中任务去处理触发事件。2. 为什么要用中断对比轮询轮询方式while(1) 一直读引脚 →占CPU、实时性差中断方式电平变化才触发 →不占CPU、响应极快、不丢信号所以按键、传感器、外部触发 → 必须用 GPIO 中断四、什么是上升沿、下降沿GPIO 中断是电平跳变触发必须先懂这 3 个概念1. 上升沿 Rising Edge低电平 → 高电平0 变 1的一瞬间✅ 典型场景按键按下传感器信号生效外部设备开始工作2. 下降沿 Falling Edge高电平 → 低电平1 变 0的一瞬间✅ 典型场景按键松开传感器信号结束外部设备断开3. 双边沿 Both Edge只要电平发生变化上升 下降就触发五、一句话记忆永不忘记上升沿 低变高0→1下降沿 高变低1→0沿 电平跳变的那一瞬间六、鸿蒙LiteOS GPIO 中断 完整代码可直接用#includestdio.h#includeunistd.h#includelos_task.h#includeohos_init.h#includelz_hardware.h#defineGPIO_TESTGPIO0_PC5/* 中断触发次数 */staticunsignedintm_gpio_interrupt_count0;/*************************************************************** * 函数名称: gpio_isr_func * 说 明: GPIO中断服务函数 ***************************************************************/voidgpio_isr_func(void*args){m_gpio_interrupt_count;}/*************************************************************** * 函数名称: gpio_process * 说 明: GPIO中断初始化与测试 ***************************************************************/voidgpio_process(){unsignedintret;/* 1. 初始化GPIO */LzGpioInit(GPIO_TEST);/* 2. 引脚复用配置 */PinctrlSet(GPIO_TEST,MUX_FUNC0,PULL_KEEP,DRIVE_LEVEL0);/* 3. 中断必须设置为输入模式 */LzGpioSetDir(GPIO_TEST,LZGPIO_DIR_IN);/* 4. 注册中断上升沿触发 */retLzGpioRegisterIsrFunc(GPIO_TEST,LZGPIO_INT_EDGE_RISING,gpio_isr_func,NULL);if(ret!LZ_HARDWARE_SUCCESS){printf(LzGpioRegisterIsrFunc failed(%d)\n,ret);return;}m_gpio_interrupt_count0;/* 5. 使能中断 */LzGpioEnableIsr(GPIO_TEST);while(1){printf(***************GPIO Interrupt Example*************\n);printf(gpio interrupt count %d\n,m_gpio_interrupt_count);printf(\n);sleep(1);}}/*************************************************************** * 函数名称: gpio_example ***************************************************************/voidgpio_example(){unsignedintthread_id;TSK_INIT_PARAM_S task{0};task.pfnTaskEntry(TSK_ENTRY_FUNC)gpio_process;task.uwStackSize2048;task.pcNamegpio_process;task.usTaskPrio24;LOS_TaskCreate(thread_id,task);}APP_FEATURE_INIT(gpio_example);七、GPIO 中断配置 5 步标准流程GPIO 初始化引脚复用配置设置为输入模式中断必须是输入注册中断 选择边沿触发开启中断使能八、中断服务函数 3 条铁律必看中断函数里绝对不能❌ 不能sleep、delay❌ 不能printf❌ 不能写复杂逻辑、死循环只能做✅ 变量✅ 标志位置1✅ 简单标记九、触发方式 与 实际场景对应触发方式宏定义适用场景上升沿LZGPIO_INT_EDGE_RISING按键按下下降沿LZGPIO_INT_EDGE_FALLING按键松开双边沿LZGPIO_INT_EDGE_BOTH电平变化就触发十、运行效果十一、总结GPIO 是单片机与外部通信的基础接口GPIO 中断 高实时、不占CPU、产品级用法上升沿0→1下降沿1→0中断函数必须简短、快速、无阻塞按键、传感器、外部信号 → 优先使用中断方式

相关新闻