OpenHarmony海思单片机 点亮led灯
·

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_VALUE1 和 HI_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);
}
}
更多推荐
所有评论(0)