小熊派Hi3863——GPIO点亮LED灯

目录

1. 准备工作

1.1 环境准备

1.2 原理图

2. 编译烧录

2.1编译​编辑

2.2 烧录

3. 代码详解

3.1 程序的运行流程

3.2 源码

3.3 入口函数app_run:程序的起点

3.4 blinky_entry 函数:创建任务

3.5 blinky_task 函数:任务的核心逻辑

3.5.1 初始化GPIO

3.5.2 无限循环:让LED闪烁

官方文档:点击跳转

1. 准备工作

1.1 环境准备

1.2 原理图

2. 编译烧录

2.1编译

2.2 烧录

3. 代码详解

3.1 程序的运行流程

  • 入口函数 app_run(blinky_entry):启动程序,调用 blinky_entry
  • blinky_entry 函数:设置任务属性,并创建任务 blinky_task
  • blinky_task 函数:初始化GPIO,进入无限循环,控制LED闪烁

3.2 源码

/**
 * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2023-2023. All rights reserved.
 *
 * Description: Blinky Sample Source. \n
 *
 * History: \n
 * 2023-04-03, Create file. \n
 */

#include "pinctrl.h"
#include "soc_osal.h"
#include "gpio.h"
#include "osal_debug.h"
#include "cmsis_os2.h"
#include "app_init.h"

#define BSP_LED 2

#define BLINKY_TASK_STACK_SIZE    0x1000
#define BLINKY_TASK_PRIO          (osPriority_t)(17)

static void *blinky_task(const char *arg)
{
    unused(arg);
    uapi_pin_set_mode(BSP_LED, PIN_MODE_0);
    uapi_gpio_set_dir(BSP_LED, GPIO_DIRECTION_OUTPUT);
    uapi_gpio_set_val(BSP_LED, GPIO_LEVEL_LOW);

    while (1) {
        osal_msleep(500);
        uapi_gpio_toggle(BSP_LED);
    }

    return NULL;
}

static void blinky_entry(void)
{
    osThreadAttr_t attr;

    attr.name = "BlinkyTask";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = BLINKY_TASK_STACK_SIZE;
    attr.priority = BLINKY_TASK_PRIO;

    if (osThreadNew((osThreadFunc_t)blinky_task, NULL, &attr) == NULL) {
        /* Create task fail. */
    }
}

/* Run the blinky_entry. */
app_run(blinky_entry);

3.3 入口函数app_run:程序的起点

app_run(blinky_entry);

这是程序的“启动按钮”。它的作用是调用一个函数blinky_entry,让程序开始运行

可以把app_run理解为一个开始执行的命令,而blinky_entry就是它要执行的第一个任务

3.4 blinky_entry 函数:创建任务

static void blinky_entry(void)
{
    osThreadAttr_t attr;

    attr.name = "BlinkyTask";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = BLINKY_TASK_STACK_SIZE;
    attr.priority = BLINKY_TASK_PRIO;

    if (osThreadNew((osThreadFunc_t)blinky_task, NULL, &attr) == NULL) {
        /* Create task fail. */
    }
}

在 blinky_entry 函数中,程序首先定义了一个变量 attr,类型是 osThreadAttr_t,用来设置任务属性的结构体。

程序依次设置了任务的属性:

  • attr.name = "BlinkyTask";  ————> 设置任务名称为"BlinkyTask"
  • attr.attr_bits = 0U;  ————> 设置任务的属性位(默认值)
  • attr.cb_mem = NULL;  ————> 设置任务的回调内存(默认为NULL)
  • attr.cb_size = 0U;  ————> 设置任务的回调内存大小(默认为0)
  • attr.stack_mem = NULL;  ————> 设置任务的栈内存(默认为NULL)
  • attr.stack_size = BLINKY_TASK_STACK_SIZE;  ————> 设置任务的栈大小
  • attr.priority = BLINKY_TASK_PRIO;  ————> 设置任务的优先级

osThreadNew 是一个函数,用于创建任务,参数:

  • (osThreadFunc_t)blinky_task:任务函数
  • NULL:传递给任务函数的参数(这里没有参数)
  • &attr:任务属性

如果任务创建失败,osThreadNew 会返回NULL

3.5 blinky_task 函数:任务的核心逻辑

static void *blinky_task(const char *arg)
{
    unused(arg);
    uapi_pin_set_mode(BSP_LED, PIN_MODE_0);
    uapi_gpio_set_dir(BSP_LED, GPIO_DIRECTION_OUTPUT);
    uapi_gpio_set_val(BSP_LED, GPIO_LEVEL_LOW);

    while (1) {
        osal_msleep(500);
        uapi_gpio_toggle(BSP_LED);
    }

    return NULL;
}

3.5.1 初始化GPIO

在任务开始时,程序会执行以下操作:
uapi_pin_set_mode(BSP_LED, PIN_MODE_0):设置引脚模式为普通GPIO模式
uapi_gpio_set_dir(BSP_LED, GPIO_DIRECTION_OUTPUT):将引脚方向设置为输出模式,这样我们就可以通过它控制LED
uapi_gpio_set_val(BSP_LED, GPIO_LEVEL_LOW):将引脚电平设置为低电平,初始时让LED熄灭

3.5.2 无限循环:让LED闪烁

while (1) {
    osal_msleep(500);
    uapi_gpio_toggle(BSP_LED);
}

osal_msleep(500):让任务暂停500毫秒(0.5秒)
uapi_gpio_toggle(BSP_LED):切换LED的状态。

  • 如果LED是亮的,就把它熄灭
  • 如果LED是灭的,就把它点亮
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值