目录
官方文档:点击跳转
1. 准备工作
1.1 环境准备
- 准备一块BearPi-Pico H3863开发板(本次点亮板载LED)
- 完成环境搭建(SDK中自带点灯案例)
- 根据官方文档教程,完成Windows环境下开发环境搭建,点击跳转
- 或者根据Windows环境下小熊派Hi3863环境搭建与输出HelloWorld 进行环境搭建
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是灭的,就把它点亮