0

0

星闪开发之buttondemo烧录后无效果思路

爱谁谁

爱谁谁

发布时间:2025-07-24 11:24:01

|

237人浏览过

|

来源于php中文网

原创

前言(若无空闲时间请直接跳转至文末查看结论)

此前我撰写了几篇有关星闪技术的入门文章,最近收到几位读者私信反馈——烧录buttondemo后毫无反应。本文旨在解决这一常见问题(本文适合新手阅读,若赶时间可直接滑至最后看解决方案)。

相关基础教程请参考:星闪开发入门级教程之安装编译器与小项目烧录

星闪开发之buttondemo烧录后无效果思路### 一、常规排查思路

在过往从事前后端开发及自然语言处理项目时,遇到异常通常会从以下四个方面入手:

  • 代码逻辑是否存在漏洞
  • 配置项是否正确
  • 查阅官方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;}

初始化阶段:

稿定AI绘图
稿定AI绘图

稿定推出的AI绘画工具

下载
  • 设置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输出并喂狗保活。

由于用户反馈代码来自官方仓库,基本排除逻辑错误可能,因此下一步应聚焦于硬件资料核对。

四、最终解决方案

查阅官方硬件手册发现:

星闪开发之buttondemo烧录后无效果思路
原代码中设置的按键GPIO编号为12,但实际开发板按键连接的是GPIO 14!

修改宏定义如下:

#define BUTTON_GPIO 14 // 按键

重新编译并烧录即可正常运行!

总结

该示例实现了经典的按键控制LED功能,结合看门狗机制提升系统稳定性,是嵌入式GPIO编程中的典型应用案例。遇到类似问题时,建议优先确认硬件引脚定义是否匹配开发板实际布局。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1435

2023.10.24

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

73

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

96

2025.09.18

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

366

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

561

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

366

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

561

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

471

2023.08.10

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

3

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
jQuery-最流行的JS函数库
jQuery-最流行的JS函数库

共17课时 | 5万人学习

Laravel5.7框架视频教程
Laravel5.7框架视频教程

共21课时 | 3.7万人学习

Rust 教程
Rust 教程

共28课时 | 4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号