前言(若无空闲时间请直接跳转至文末查看结论)
此前我撰写了几篇有关星闪技术的入门文章,最近收到几位读者私信反馈——buttondemo后毫无反应。本文旨在解决这一常见问题(本文适合新手阅读,若赶时间可直接滑至最后看k8凯发国际的解决方案)。
相关基础教程请参考:星发入门级教程之安装编译器与小项目烧录
### 一、常规排查
在过往从事前后端开发及自然语言处理项目时,遇到异常通常会从以下四个方面入手:
- 代码逻辑是否存在漏洞
- 配置项是否正确
- 查阅官方api文档
- 研读第三方库或系统源码(如android平台)
二、配置流程说明
将demo代码放入peripheral目录下之后,需完成以下两步配置:
1. 修改 peripheral 目录下的 kconfig 文件,新增如下内容:
config sample_support_buttondemo bool prompt "support buttondemo sample." default n depends on enable_peripheral_sample help this option means support buttondemo sample.
2. 在 peripheral 目录下的 cmakelists.txt 文件中添加如下语句:
if(defined config_sample_support_buttondemo) add_subdirectory_if_exist(buttondemo)endif()
三、代码简要分析
1. 头文件引入与宏定义部分
#include "pinctrl.h"#include "common_def.h"#include "soc_osal.h"#include "gpio.h"#include "hal_gpio.h"#include "watchdog.h"#include "app_init.h"#define bsp_led 7 // red#define button_gpio 12 // 按键#define button_task_stack_size 0x1000#define button_task_prio 17
头文件说明:涵盖了引脚控制、通用常量、操作系统抽象层、gpio驱动、看门狗模块和应用初始化等核心组件。
宏定义解释:设定了led灯和按键对应的gpio编号,以及任务堆栈大小与优先级。
2. 全局变量声明
static int g_ledstate = 0;
作用:用于记录led当前状态(亮或灭)。
3. 按键中断回调函数
static void gpio_callback_func(pin_t pin, uintptr_t param){ unused(pin); unused(param); g_ledstate = !g_ledstate; printf("button pressed.\r\n");}
功能描述:按键触发时执行此函数,翻转led状态并打印日志。
4. 主任务函数实现
static void *button_task(const char *arg){ unused(arg); uapi_pin_set_mode(bsp_led, hal_pio_func_gpio); uapi_gpio_set_dir(bsp_led, gpio_direction_output); uapi_gpio_set_val(bsp_led, gpio_level_low); uapi_pin_set_mode(button_gpio, hal_pio_func_gpio); gpio_select_core(button_gpio, cores_apps_core); uapi_gpio_set_dir(button_gpio, gpio_direction_input); errcode_t ret = uapi_gpio_register_isr_func(button_gpio, gpio_interrupt_falling_edge, gpio_callback_func); if (ret != 0) { uapi_gpio_unregister_isr_func(button_gpio); } while (1) { uapi_watchdog_kick(); if (g_ledstate) { uapi_gpio_set_val(bsp_led, gpio_level_high); } else { uapi_gpio_set_val(bsp_led, gpio_level_low); } } return null;}
初始化阶段:
- 设置led为输出模式,默认关闭;
- 设置按键为输入模式,并指定由应用核心处理中断;
- 注册中断回调函数,采用下降沿触发方式。
主循环逻辑:
- 定期喂狗防止系统复位;
- 根据全局变量 g_ledstate 控制led亮灭状态。
5. 创建任务线程函数
static void button_entry(void){ uint32_t ret; osal_task *taskid; osal_kthread_lock(); taskid = osal_kthread_create((osal_kthread_handler)button_task, null, "led_task", button_task_stack_size); ret = osal_kthread_set_priority(taskid, button_task_prio); if (ret != osal_success) { printf("create task1 failed .\n"); } osal_kthread_unlock();}
流程说明:
- 锁定内核以确保线程安全;
- 创建名为“led_task”的线程;
- 设置优先级;
- 解锁后允许调度执行。
6. 应用程序入口点
app_run(button_entry);
启动整个程序,调用button_entry函数创建按键监听任务。
7. 整体运行流程总结
- 系统通过app_run启动;
- button_entry创建任务线程;
- 线程中完成硬件初始化与中断注册;
- 按键按下时触发中断回调,改变led状态;
- 主循环持续更新led输出并喂狗保活。
由于用户反馈代码来自官方仓库,基本排除逻辑错误可能,因此下一步应聚焦于硬件资料核对。
四、最终k8凯发国际的解决方案
查阅官方硬件手册发现:
原代码中设置的按键gpio编号为12,但实际开发板按键连接的是gpio 14!
修改宏定义如下:
#define button_gpio 14 // 按键
重新编译并烧录即可正常运行!
总结
该示例实现了经典的按键控制led功能,结合看门狗机制提升系统稳定性,是嵌入式gpio编程中的典型应用案例。遇到类似问题时,建议优先确认硬件引脚定义是否匹配开发板实际布局。
以上就是星闪开发之buttondemo烧录后无效果思路的详细内容,更多请关注非常游戏网【www.vycc.cn】其他相关内容。