HI3861原理图

我们要点亮LED3 首先要宏定义 引脚IO02和引脚工作模式

/*
利用宏对当前使用的引脚和目标期望对应的工作模式进行预处理
*/
/*
明确当前使用的引脚是 IO02 引脚
*/
#define LED3_PIN HI_IO_NAME_GPIO_2

/*
设置当前引脚的工作模式为 GPIO 工作模式
    HI_IO_FUNC_GPIO_2_GPIO
    HI ==> 海思 
    IO ==> IO引脚
    FUNC ==> 工作方式配置
    GPIO_2 ==> 操作的引脚是通用引脚 2
    GPIO ==> 当前引脚工作模式为 GPIO 模式
*/
#define LED3_PIN_FUNC HI_IO_FUNC_GPIO_2_GPIO

然后对LED3 IO 引脚的工作状态进行配置(led_init()初始化)

void led_init(void)
{   
    hi_gpio_init();                              // 初始化 GPIO 模块
    hi_io_set_func(LED3_PIN, LED3_PIN_FUNC);     // 设置引脚复用功能为 GPIO 模式
    hi_gpio_set_dir(LED3_PIN, HI_GPIO_DIR_OUT);  // 设置为输出方向
    hi_io_set_pull(LED3_PIN, HI_IO_PULL_DOWN);   // 设置下拉(默认低电平)

}

在这里我对 IO 和 GPIO 的指向意义产生疑惑,询问chatGPT解答得以解惑

名称 全称 含义 主要作用 举例
IO Input/Output 物理引脚接口(针脚) 决定“这个引脚用于什么功能” UART、I2C、SPI、PWM、GPIO
GPIO General Purpose Input/Output 通用输入输出引脚功能 用于普通的高低电平控制 控制LED亮灭、检测按键状态

IO 就代表一个引脚 物理上的

GPIO 是引脚被设置的一种工作模式之一

初始化完成之后,根据原理图得知,要想LED3灯亮,需要对引脚 IO02 提供高电平,一般在线程函数中实现。

void led_thread(void *arg)
{
    led_init();
    while (1)
    {
        /*
        hi_u32 hi_gpio_set_ouput_val(hi_gpio_idx id, hi_gpio_value val);
            当前 IO 工作模式为 GPIO 情况下,设置对应输出高低电平情况
        */
        hi_gpio_set_ouput_val(LED3_PIN, HI_GPIO_VALUE1);
        osDelay(100);
        hi_gpio_set_ouput_val(LED3_PIN, HI_GPIO_VALUE0);
        osDelay(100);
    }
}

hi_gpio_set_ouput_val()函数:

hi_gpio_set_output_val() 用于设置某个 GPIO 引脚的输出电平(高电平或低电平)。

HI_GPIO_VALUE1HI_GPIO_VALUE0 是枚举常量(宏定义)

HI_GPIO_VALUE1 高电平 逻辑1

HI_GPIO_VALUE0 低电平 逻辑0

与之对称还有一个hi_gpio_get_input_val()函数,作用:用于 读取指定 GPIO 引脚的当前输入电平状态(高电平或低电平)。

下面是点亮LED灯的全部代码:

/*
C 语言标准库三剑客
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*
以下是需要导入的 OpenHarmony 相关头文件
    ohos_init.h OpenHarmony OS 系统初始化相关头文件
    cmsis_os2.h 实时操作系统头文件
    hi_timer.h 海思提供的 timer 定时器头文件
*/
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "hi_timer.h"

// 海思(OHOS) 提供的标准 IO 头文件,所有对外接口的模式,相关函数
#include "hi_io.h"
// 海思(OHOS) 提供的标准 GPIO 头文件,针对 GPIO 相关控制
#include "hi_gpio.h"

/*
利用宏对当前使用的引脚和目标期望对应的工作模式进行预处理
*/
/*
明确当前使用的引脚是 IO02 引脚
*/
#define LED3_PIN HI_IO_NAME_GPIO_2

/*
设置当前引脚的工作模式为 GPIO 工作模式
    HI_IO_FUNC_GPIO_2_GPIO
    HI ==> 海思 
    IO ==> IO引脚
    FUNC ==> 工作方式配置
    GPIO_2 ==> 操作的引脚是通用引脚 2
    GPIO ==> 当前引脚工作模式为 GPIO 模式
*/
#define LED3_PIN_FUNC HI_IO_FUNC_GPIO_2_GPIO

/**
 * @brief 配置当前 LED 对应 IO 引脚的工作状态.
 */
void led_init(void);

/**
 * @brief LED3 控制线程任务函数
 * 
 * @param arg 线程所需参数
 */
void led_thread(void *arg);

static ledTestTask(void)
{
    osThreadAttr_t thread_attr;
    memset(&thread_attr, 0, sizeof(osThreadAttr_t));

    thread_attr.name = "led_thread";
    thread_attr.stack_size = 1024;
    thread_attr.priority = osPriorityNormal;

    osThreadId_t tid = osThreadNew(led_thread, HI_NULL, &thread_attr);
    if (HI_NULL == tid)
    {
        perror("[osThreadNew] create led_thread failed!");
    }
}

APP_FEATURE_INIT(ledTestTask);

void led_init(void)
{
    /*
    1. 开启 GPIO 配置模式
        hi_u32 hi_gpio_init(hi_void);
        海思内部针对于 IO 引脚启动配置模式函数  
    */
    hi_gpio_init();

    /*
    2. 设置当前 IO02 工作模式为 GPIO 通用 IO 模式
        hi_u32 hi_io_set_func(hi_io_name id, hi_u8 val);
        设置当前 IO 引脚的工作模式  
        提供参数是当前 IO 引脚在 HI 中的名称枚举,和对应工作模式枚举,
        预先使用宏定义方式将 IO 引脚名称和模式,修改为当前功能模块对
        应名称,方便后续使用。
    */
    hi_io_set_func(LED3_PIN, LED3_PIN_FUNC);

    /*
    3. 设置当前 IO02 在 GPIO 工作模式下的输出方向
        hi_u32 hi_gpio_set_dir(hi_gpio_idx id, hi_gpio_dir dir);
            hi_gpio 表示当前操作的基于 IO 引脚已经明确工作模式为 GPIO 情况下
            进行输入/输出配置。
    */
    hi_gpio_set_dir(LED3_PIN, HI_GPIO_DIR_OUT);

    /*
    4. 设置当前 IO 引脚模式为低电平模式
        hi_u32 hi_io_set_pull(hi_io_name id, hi_io_pull val);
        设置指定 IO 引脚的电平情况
    */
    hi_io_set_pull(LED3_PIN, HI_IO_PULL_DOWN);
}

void led_thread(void *arg)
{
    led_init();
    while (1)
    {
        /*
        hi_u32 hi_gpio_set_ouput_val(hi_gpio_idx id, hi_gpio_value val);
            当前 IO 工作模式为 GPIO 情况下,设置对应输出高低电平情况
        */
        hi_gpio_set_ouput_val(LED3_PIN, HI_GPIO_VALUE1);
        osDelay(100);
        hi_gpio_set_ouput_val(LED3_PIN, HI_GPIO_VALUE0);
        osDelay(100);
    }
}

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐