前段时间写了几篇关于星闪的基础文章,最近有几个粉丝私信,此篇文章解决一个简单的问题–buttondemo烧录后无效果(没有时间请直接调至最后看结果,本文为小白文)
基础文章请见:星闪开发入门级教程之安装编译器与小项目烧录
在以前做前后端开发以及自然语言模型相关内容的时候,本人遇到问题会有四种想法。
将Demo中的相关文件夹放在peripheral文件夹下后
config SAMPLE_SUPPORT_BUTTONDEMO
bool
prompt "Support BUTTONDEMO Sample."
default n
depends on ENABLE_PERIPHERAL_SAMPLE
help
This option means support BUTTONDEMO Sample.
if(DEFINED CONFIG_SAMPLE_SUPPORT_BUTTONDEMO)
add_subdirectory_if_exist(buttondemo)
endif()
#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 引脚号,以及按键任务的堆栈大小和优先级。
static int g_ledState = 0;
g_ledState:静态全局变量,用于存储 LED 的状态(亮 / 灭)。
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 状态并打印提示信息。
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 引脚为输出模式,初始化为低电平(LED 熄灭)。
配置按键引脚为输入模式,并选择应用核心处理中断。
注册按键中断处理函数,设置为下降沿触发。
循环部分:
定期防止系统因异常挂死。根据g_ledState的值控制 LED 的亮灭。
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” 的线程,指定堆栈大小。设置线程优先级。解锁内核线程,允许任务调度。
app_run(button_entry);
功能:启动应用程序,调用button_entry()函数创建按键任务。
由于粉丝说代码是从官方那边拿的,所以代码逻辑错误的可能性极低,且检查后没有明显错误,所以下一步从官方的硬件资料入手。
查看官方的硬件资料
发现引脚号并不是12.
#define BUTTON_GPIO 14 // 按键
然后编译烧录
此程序实现了一个简单的按键控制 LED 的功能,同时利用看门狗确保系统稳定性,是嵌入式系统中典型的 GPIO 控制应用。