Hi3861 OpenHarmony嵌入式应用入门--PWM 三色灯
这篇文章是讲解的pwm控制三色灯的部分,这部分也是后续全彩智能灯的基础。
硬件原理如下

IO管脚定义在hi-12f_v1.1.2-规格书-20211202.pdf文档中

GPIO API
| API名称 | 说明 |
| unsigned int IoTGpioInit(unsigned int id); | GPIO模块初始化 |
| hi_u32 hi_io_set_func(hi_io_name id, hi_u8 val); | 配置某个IO的复用功能 |
| unsigned int IoTPwmInit(unsigned int port); | 初始化一个PWM设备 |
| unsigned int IoTPwmStart(unsigned int port, unsigned short duty, unsigned int freq); | 根据给定的输出频率和占空比从指定端口启动PWM信号输出。 |
| unsigned int IoTPwmStop(unsigned int port); | 停止来自指定端口的PWM信号输出。 |
在官方给的代码中IoTPwmStart占空比参数范围为1-99,也就是不能达到全灭和全亮的程度。所以对源码进行修改。
修改D:\DevEcoProjects\test\src\device\hisilicon\hispark_pegasus\hi3861_adapter\hals\iot_hardware\wifiiot_lite\hal_iot_pwm.c
unsigned int IoTPwmStart(unsigned int port, unsigned short duty, unsigned int freq)
{unsigned short hiDuty;unsigned short hiFreq;if ((freq == 0) || (duty > DUTY_MAX)) {return IOT_FAILURE;}if ((CLK_160M / freq) > SHORT_MAX) {return IOT_FAILURE;}hiFreq = (unsigned short)(CLK_160M / freq);hiDuty = (duty * hiFreq) / DUTY_MAX;return hi_pwm_start((hi_pwm_port)port, hiDuty, hiFreq);
}
使其支持0和100.
修改D:\DevEcoProjects\test\src\device\hisilicon\hispark_pegasus\sdk_liteos\platform\drivers\pwm\hi_pwm.c
hi_u32 hi_pwm_start(hi_pwm_port port, hi_u16 duty, hi_u16 freq)
{hi_u32 ret;if ((pwm_check_port(port) != HI_ERR_SUCCESS) || (freq == 0)|| (duty > freq)) {return HI_ERR_PWM_INVALID_PARAMETER;}if (pwm_is_init(port) == HI_FALSE) {return HI_ERR_PWM_NO_INIT;}ret = pwm_lock(port);if (ret != HI_ERR_SUCCESS) {return ret;}pwm_set_enable(port, HI_TRUE);pwm_set_freq(port, freq);pwm_set_duty(port, duty);pwm_take_effect(port);return pwm_unlock(port);
}
同样是使其支持0和100.
以上就是对源码的修改。下面是测试代码部分。
修改D:\DevEcoProjects\test\src\vendor\rtplay\rt_hi3861\demo\BUILD.gn文件
# Copyright (c) 2023 Beijing HuaQing YuanJian Education Technology Co., Ltd
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License. import("//build/lite/config/component/lite_component.gni")lite_component("demo") {features = [#"base_00_helloworld:base_helloworld_example",#"base_01_led:base_led_example",#"base_02_loopkey:base_loopkey_example",#"base_03_irqkey:base_irqkey_example",#"base_04_adc:base_adc_example","base_05_pwm:base_pwm_example",]
}
创建D:\DevEcoProjects\test\src\vendor\rtplay\rt_hi3861\demo\base_05_pwm文件夹
文件夹中创建D:\DevEcoProjects\test\src\vendor\rtplay\rt_hi3861\demo\base_05_pwm\base_pwm_example.c文件D:\DevEcoProjects\test\src\vendor\rtplay\rt_hi3861\demo\base_05_pwm\BUILD.gn文件
# Copyright (c) 2023 Beijing HuaQing YuanJian Education Technology Co., Ltd
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License. static_library("base_pwm_example") {sources = ["base_pwm_example.c",]include_dirs = ["//utils/native/lite/include","//kernel/liteos_m/kal/cmsis","//base/iot_hardware/peripheral/interfaces/kits","//vendor/hqyj/fs_hi3861/common/bsp/include"]
}
/** Copyright (C) 2023 HiHope Open Source Organization .* Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/#include <stdio.h>
#include <unistd.h>#include "cmsis_os2.h"
#include "hi_io.h"
#include "iot_errno.h"
#include "iot_gpio.h"
#include "iot_pwm.h"
#include "ohos_init.h"#define RED_LED_PIN_NAME HI_IO_NAME_GPIO_10
#define RED_LED_PIN_FUNCTION WIFI_IOT_IO_FUNC_GPIO_10_GPIO
#define GREEN_LED_PIN_NAME HI_IO_NAME_GPIO_2
#define GREEN_LED_PIN_FUNCTION WIFI_IOT_IO_FUNC_GPIO_2_GPIO
#define BLUE_LED_PIN_NAME HI_IO_NAME_GPIO_7
#define BLUE_LED_PIN_FUNCTION WIFI_IOT_IO_FUNC_GPIO_7_GPIO#define PWM_FREQ_DIVITION 64000
#define DELAY_US 30000
#define STACK_SIZE (4096)
#define PWM0_PORT_NUM (0)
#define PWM1_PORT_NUM (1)
#define PWM2_PORT_NUM (2)static void PWMLedDemoTask(void)
{// pwm占空比记录变量unsigned short duty0 = 0, duty1 = 40, duty2 = 80;// 记录占空比是增加还是减少hi_bool duty0_increase = HI_TRUE;hi_bool duty1_increase = HI_TRUE;hi_bool duty2_increase = HI_TRUE;// 炫彩灯板的红灯hi_io_set_func(RED_LED_PIN_NAME, HI_IO_FUNC_GPIO_10_PWM1_OUT);hi_io_set_func(GREEN_LED_PIN_NAME, HI_IO_FUNC_GPIO_2_PWM2_OUT);hi_io_set_func(BLUE_LED_PIN_NAME, HI_IO_FUNC_GPIO_7_PWM0_OUT);IoTPwmInit(PWM0_PORT_NUM);IoTPwmInit(PWM1_PORT_NUM);IoTPwmInit(PWM2_PORT_NUM);while (1) {// use PWM control RED LED brightness// 蓝灯呼吸代码IoTPwmStart(PWM0_PORT_NUM, duty0, PWM_FREQ_DIVITION);if (duty0_increase) {duty0++;if (duty0 > 100) {// 自增超过100后需要进行自减duty0_increase = HI_FALSE;duty0 = 99;}} else {duty0--;if (duty0 == 0) {// 自减到0后需要进行自增duty0_increase = HI_TRUE;}}// 红灯呼吸代码IoTPwmStart(PWM1_PORT_NUM, duty1, PWM_FREQ_DIVITION);if (duty1_increase) {duty1++;if (duty1 > 100) {duty1_increase = HI_FALSE;duty1 = 99;}} else {duty1--;if (duty1 == 0) {duty1_increase = HI_TRUE;}}// 绿灯呼吸代码IoTPwmStart(PWM2_PORT_NUM, duty2, PWM_FREQ_DIVITION);if (duty2_increase) {duty2++;if (duty2 > 100) {duty2_increase = HI_FALSE;duty2 = 99;}} else {duty2--;if (duty2 == 0) {duty2_increase = HI_TRUE;}}usleep(DELAY_US);}
}static void PWMLedDemo(void)
{osThreadAttr_t attr;// set Red LED pin to GPIO functionIoTGpioInit(RED_LED_PIN_NAME);attr.name = "PWMLedDemoTask";attr.attr_bits = 0U;attr.cb_mem = NULL;attr.cb_size = 0U;attr.stack_mem = NULL;attr.stack_size = STACK_SIZE;attr.priority = osPriorityNormal;if (osThreadNew(PWMLedDemoTask, NULL, &attr) == NULL) {printf("[ColorfulLightDemo] Falied to create PWMLedDemoTask!\n");}
}
APP_FEATURE_INIT(PWMLedDemo);
目录结构
│ config.json
│
├─common
│ └─bsp
│ ├─include
│ └─src
├─demo
│ │ BUILD.gn
│ │
│ ├─base_00_helloworld
│ │ base_helloworld_example.c
│ │ BUILD.gn
│ │
│ ├─base_01_led
│ │ base_led_example.c
│ │ BUILD.gn
│ │
│ ├─base_02_loopkey
│ │ base_loopkey_example.c
│ │ BUILD.gn
│ │
│ ├─base_03_irqkey
│ │ base_irqkey_example.c
│ │ BUILD.gn
│ │
│ ├─base_04_adc
│ │ base_adc_example.c
│ │ BUILD.gn
│ │
│ └─base_05_pwm
│ base_pwm_example.c
│ BUILD.gn
│
└─doc│ HarmonyOS开发板实验指导书 v2.1.pdf│ 华清远见 FS_Hi3861开发指导.md│ 华清远见 FS_Hi3861新手入门手册.md│├─board│ FS-Hi3861-V4.2.pdf│ FS-Hi3861QDB-V3.2.pdf│ hi-12f_kit_v1.1.0规格书-20211025.pdf│ hi-12f_v1.1.2-规格书-20211202.pdf│ nodemcu-hi-07s_12f-kit_v1.1-20210913.pdf│ RTplay2.01_2024-06-14.pdf│└─figures
使用build,编译成功后,使用upload进行烧录。
运行效果如下,三色灯颜色会变化。

相关文章:
Hi3861 OpenHarmony嵌入式应用入门--PWM 三色灯
这篇文章是讲解的pwm控制三色灯的部分,这部分也是后续全彩智能灯的基础。 硬件原理如下 IO管脚定义在hi-12f_v1.1.2-规格书-20211202.pdf文档中 GPIO API API名称 说明 unsigned int IoTGpioInit(unsigned int id); GPIO模块初始化 hi_u32 hi_io_set_func(hi_i…...
CH5xx USB下载工具
文章目录 CH5xx USB下载工具1.前言2.介绍3. USB下载4. 串口免按键下载4.SWD下载 CH5xx USB下载工具 1.前言 CH5xx USB下载工具是一款专为沁恒 CH5xx系列 BLE SOC设计的程序的下载工具。这款工具与串口下载相比较,不仅提供了稳定的数据传输能力,而且提高…...
问题1.用PGP解密出keybox.xml,过程中报“Can‘t check signature: No public key”如图,这个正常吗?如何解决?
问题1.我要写Google attenstation key到设备。就需要keybox.xml生成keybox.kdb文件。而测试机构给我们的是加密的文件,需要用PGP解密出keybox.xml,过程中报“Can’t check signature: No public key”如图,这个正常吗?如何解决&am…...
网络物理隔离后 可以用保密U盘进行数据安全交换吗?
企业用的保密U盘通常被设计用于存储和传输敏感信息,以确保数据的安全和保密性。 在网络之间实现了物理隔离后,使用保密U盘进行数据安全交换是一种常见的做法。物理隔离确保了两个网络之间的完全分离,因此使用保密U盘可以作为一种安全的手段来…...
机械臂 CoppeliaSim Simulink联合仿真
实现机械臂在CoppeliaSim(以前称为V-REP)和Simulink上的联合仿真涉及多个步骤,包括环境设置、模型导入、通信配置、控制算法设计和测试调试。 前期准备 安装软件配置工作环境创建和配置CoppeliaSim场景 导入机械臂模型配置机械臂参数在Simuli…...
MySQL数据库(一):数据库介绍与安装
在嵌入式开发中,数据库的重要性体现在高效的数据存储和管理、数据持久化、复杂查询和处理、数据同步和共享、安全性和可扩展性。常见嵌入式数据库包括SQLite、MySQL、LevelDB等,应用于智能家居、工业控制、车载系统和物联网设备,提升了系统功…...
天津媒体邀约,及媒体名单?
传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 媒体宣传加速季,100万补贴享不停,一手媒体资源,全国100城线下落地执行。详情请联系胡老师。 天津作为中国北方的重要城市,拥有丰富的媒体资…...
Java | Leetcode Java题解之第168题Excel表列名称
题目: 题解: class Solution {public String convertToTitle(int columnNumber) {StringBuffer sb new StringBuffer();while (columnNumber ! 0) {columnNumber--;sb.append((char)(columnNumber % 26 A));columnNumber / 26;}return sb.reverse().t…...
代码随想录算法训练营刷题复习10:二叉树、二叉搜索树复习2
二叉树、二叉搜索树 力扣题复习 110. 平衡二叉树257. 二叉树的所有路径404. 左叶子之和513. 找树左下角的值112.路径之和113.路经总和ii450. 删除二叉搜索树中的节点701. 二叉搜索树中的插入操作 110. 平衡二叉树 左右子树高度差要小于1 ->递归调用(need新的函…...
预测准确率达95.7%,ChatMOF利用LLM预测和生成金属有机框架,包含人工智能词汇表(AI glossary)
预测准确率达95.7%,ChatMOF利用LLM预测和生成金属有机框架,包含人工智能词汇表(AI glossary)。 金属有机框架(MOF)因其孔隙率大、表面积大和出色的可调性而用于许多化学应用。然而,在利用 AI 深入探索 MOF 设计与性能优化的研究征途中,科学家们正面临着前所未有的挑战。…...
【Linux】环境基础开发工具使用(yum、vim、gcc/g++、gdb、make/Makefile)
文章目录 Linux 软件包管理器 yumLinux开发工具Linux编辑器-vim使用vim的基本概念vim下各模式的切换vim命令模式各命令汇总vim底行模式各命令汇总批量化注释和批量化去注释vim简单的配置解决一个小问题 Linux编译器-gcc/g作用gcc/g 语法预处理编译汇编链接什么是函数库 Linux调…...
Linux基础二
目录 一,tail查看文件尾部指令 二,date显示日期指令 三,cal查看日历指令 四,find搜索指令 五,grep 查找指令 六,> 和>> 重定向输出指令 七, | 管道指令 八,&&逻辑控…...
Linux运维面试--yum安装和编译安装区别
风吹哪页读哪页,花开何时看何时。 目录 # 1.安装方式差异 ## 1.1 yum安装 ## 1.2 源码编译安装 # 2.优缺点分析 ## 2.1 yum安装优缺点 ### 2.1.1 yum安装优点 ### 2.1.2 yum安装缺点 ## 2.2 源码安装优缺点 ### 2.2.1 源码安装优点 ### 2.2.2 源码安装缺点…...
redis 的内存尽量不要超过 10g,超过 10g 可能会有问题
在使用Redis时,内存大小的限制通常取决于多种因素,包括但不限于: 1. **物理内存**:服务器的总内存大小限制了Redis可以使用的最大内存。 2. **操作系统限制**:操作系统可能对单个进程可以使用的内存有限制。 3. **Red…...
力扣(2024.06.23)
1. 62——不同路径 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径&a…...
OpenCV颜色检测
OpenCV颜色检测 前言策略分析根据颜色检测目标对象相关链接 前言 绿幕技术是一种经典的视频编辑技术,可以用于将人物置于不同的背景中。例如在电影制作中,技术的关键在于演员不能身着特定颜色的衣服(比如绿色),站在只有绿色的背景前。然后&a…...
VScode开发ARM环境搭建
1. vscode安装 直接访问官网: Visual Studio Code - Code Editing. Redefined 2. 安装插件 2.1. 安装Embedded IDE 2.2. 安装Cortex-debug 3. 工程初始化 3.1. 导入现有工程(推荐) 3.2. 或可创建新的工程 3.2.1. 选择Cortex-M项目 指定项目名称&…...
AI-人工智能指数报告(四):科学、医学与教育
背景: 从2017年开始,斯坦福大学人工智能研究所(HAI)每年都会发布一份人工智能的研究报告,人工智能指数报告(AII),对上一年人工智能相关的数据进行跟踪、整理、提炼并进行可视化。这份…...
Redis内存数据库
Redis是一个开源的内存数据库,它可以用作缓存、数据库和消息中间件。Redis支持多种数据结构,包括字符串、哈希表、列表、集合、有序集合等,这使得它非常灵活且适用于多种用途。 以下是关于Redis的一些重要特点和功能: 内存存储&a…...
LabVIEW高精度电能质量监测系统
LabVIEW和研华采集卡的高精度电能质量监测系统利用虚拟仪器技术,实时监测电能质量的关键指标,如三相电压、频率和谐波。通过提高监测精度和效率,改善电网的电能质量。系 一、系统背景 电能作为现代社会的关键能源,其质量直接影响…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
