OpenHarmony(鸿蒙南向)——平台驱动指南【PWM】

往期知识点记录:

  • 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总
  • 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~
  • 持续更新中……

概述

功能简介

PWM即脉冲宽度调制(Pulse Width Modulation)的缩写,是一种对模拟信号电平进行数字编码并将其转换为脉冲的技术。

PWM接口定义了操作PWM设备的通用方法集合,包括:

  • PWM设备句柄获取和释放
  • PWM周期、占空比、极性的设置
  • PWM使能和关闭
  • PWM配置信息的获取和设置

基本概念

脉冲是“电脉冲”的简称,指电路中电流或电压短暂起伏的现象,其特点是突变和不连续性。脉冲的种类很多,常见的脉冲波形有:三角脉冲、尖脉冲、矩形脉冲、方形脉冲、梯形脉冲及阶梯脉冲等。脉冲的主要参数包括重复周期T(T=1/F,F为重复频率)、脉冲幅度U、脉冲前沿上升时间ts、后沿下降时间t、脉冲宽度tk等。

运作机制

在HDF框架中,PWM接口适配模式采用独立服务模式(如图1所示)。在这种模式下,每一个设备对象会独立发布一个设备服务来处理外部访问,设备管理器收到API的访问请求之后,通过提取该请求的参数,达到调用实际设备对象的相应内部方法的目的。独立服务模式可以直接借助HDF设备管理器的服务管理能力,但需要为每个设备单独配置设备节点,增加内存占用。

独立服务模式下,核心层不会统一发布一个服务供上层使用,因此这种模式下驱动要为每个控制器发布一个服务,具体表现为:

  • 驱动适配者需要实现HdfDriverEntry的Bind钩子函数以绑定服务。

  • device_info.hcs文件中deviceNode的policy字段为1或2,不能为0。

PWM模块各分层作用:

  • 接口层提供打开PWM设备、设置PWM设备周期、设置PWM设备占空时间、设置PWM设备极性、设置PWM设备参数、获取PWM设备参数、使能PWM设备、禁止PWM设备、关闭PWM设备的接口。

  • 核心层主要提供PWM控制器的添加、移除以及管理的能力,通过钩子函数与适配层交互。

  • 适配层主要是将钩子函数的功能实例化,实现具体的功能。

图 1 PWM独立服务模式结构图

使用指导

场景介绍

通常情况下,在使用马达控制、背光亮度调节时会用到PWM模块。

接口说明

PWM模块设备属性如表1所示,PWM模块提供的主要接口如表2所示,具体API详见//drivers/hdf_core/framework/include/platform/pwm_if.h。

表 1 PwmConfig结构体介绍

名称描述
dutyuint32_t类型,占空时间,以纳秒为单位。
perioduint32_t类型,PWM周期,以纳秒为单位。
numberuint32_t类型,要生成的方波数:
- 正值:表示将生成指定数量的方波
- 0:表示方波将不断产生
polarityuint8_t类型,极性:正极性/反极性。
statusuint8_t类型,状态:启用状态/禁用状态。

表 2 PWM驱动API接口功能介绍

接口名接口描述
DevHandle PwmOpen(uint32_t num)打开PWM设备
void PwmClose(DevHandle handle)关闭PWM设备
int32_t PwmSetPeriod(DevHandle handle, uint32_t period)设置PWM设备周期
int32_t PwmSetDuty(DevHandle handle, uint32_t duty)设置PWM设备占空时间
int32_t PwmSetPolarity(DevHandle handle, uint8_t polarity)设置PWM设备极性
int32_t PwmEnable(DevHandle handle)使能PWM设备
int32_t PwmDisable(DevHandle handle)禁用PWM设备
int32_t PwmSetConfig(DevHandle handle, struct PwmConfig *config)设置PWM设备参数
int32_t PwmGetConfig(DevHandle handle, struct PwmConfig *config)获取PWM设备参数

说明:
本文涉及PWM的所有接口,支持内核态及用户态使用。

开发步骤

使用PWM的一般流程如下图所示。

图 2 PWM使用流程图

获取PWM设备句柄

在操作PWM设备时,首先要调用PwmOpen获取PWM设备句柄,该函数会返回指定设备号的PWM设备句柄。

DevHandle PwmOpen(uint32_t num);

表 3 PwmOpen参数和返回值描述

参数参数描述
numuint32_t类型,PWM设备号

返回值返回值描述
handle打开PWM设备成功,返回PWM设备句柄
NULL打开PWM设备失败

假设系统中的PWM设备号为0,获取该PWM设备句柄的示例如下:

uint32_t num = 0;         // PWM设备号
DevHandle handle = NULL;handle = PwmOpen(num);    // 打开PWM 0设备并获取PWM设备句柄
if (handle == NULL) {HDF_LOGE("PwmOpen: open pwm_%u failed.\n", num);return HDF_FAILURE;
}
销毁PWM设备句柄

关闭PWM设备,系统释放对应的资源。

void PwmClose(DevHandle handle);

表 4 PwmClose参数描述

参数参数描述
handleDevHandle类型,PWM设备句柄
PwmClose(handle);    // 关闭PWM设备销毁PWM设备句柄
使能PWM设备
int32_t PwmEnable(DevHandle handle);

表 5 PwmEnable参数和返回值描述

参数参数描述
handleDevHandle类型,PWM设备句柄

返回值返回值描述
HDF_SUCCESS使能PWM设备成功
负数使能PWM设备失败
int32_t ret;ret = PwmEnable(handle);    // 启用PWM设备
if (ret != HDF_SUCCESS) {HDF_LOGE("PwmEnable: enable pwm failed, ret:%d\n", ret);return ret;
}
禁用PWM设备
int32_t PwmDisable(DevHandle handle);

表 6 PwmDisable参数和返回值描述

参数参数描述
handleDevHandle类型,PWM设备句柄

返回值返回值描述
HDF_SUCCESS禁用PWM设备成功
负数禁用PWM设备失败
int32_t ret;ret = PwmDisable(handle);    // 禁用PWM设备
if (ret != HDF_SUCCESS) {HDF_LOGE("PwmDisable: disable pwm failed, ret:%d\n", ret);return ret;
}
设置PWM设备周期
int32_t PwmSetPeriod(DevHandle handle, uint32_t period);

表 7 PwmSetPeriod参数和返回值描述

参数参数描述
handleDevHandle类型,PWM设备句柄
perioduint32_t类型,要设置的周期,单位为纳秒

返回值返回值描述
HDF_SUCCESS设置PWM设备周期成功
负数设置PWM设备周期失败
int32_t ret;ret = PwmSetPeriod(handle, 50000000);    // 设置周期为50000000纳秒
if (ret != HDF_SUCCESS) {HDF_LOGE("PwmSetPeriod: pwm set period failed, ret:%d\n", ret);return ret;
}
设置PWM设备占空时间
int32_t PwmSetDuty(DevHandle handle, uint32_t duty);

表 8 PwmSetDuty参数和返回值描述

参数参数描述
handleDevHandle类型,PWM设备句柄
dutyuint32_t类型,要设置的占空时间,单位为纳秒

返回值返回值描述
HDF_SUCCESS设置PWM设备占空时间成功
负数设置PWM设备占空时间失败
int32_t ret;ret = PwmSetDuty(handle, 25000000);    // 设置占空时间为25000000纳秒
if (ret != HDF_SUCCESS) {HDF_LOGE("PwmSetDuty: pwm set duty failed, ret:%d\n", ret);return ret;
}
设置PWM设备极性
int32_t PwmSetPolarity(DevHandle handle, uint8_t polarity);

表 9 PwmSetPolarity参数和返回值描述

参数参数描述
handleDevHandle类型,PWM设备句柄
polarityuint8_t类型,要设置的极性,正/反

返回值返回值描述
HDF_SUCCESS设置PWM设备极性成功
负数设置PWM设备极性失败
int32_t ret;ret = PwmSetPolarity(handle, PWM_INVERTED_POLARITY);    // 设置极性为反
if (ret != HDF_SUCCESS) {HDF_LOGE("PwmSetPolarity: pwm set polarity failed, ret:%d\n", ret);return ret;
}
设置PWM设备参数
int32_t PwmSetConfig(DevHandle handle, struct PwmConfig *config);

表 10 PwmSetConfig参数和返回值描述

参数参数描述
handleDevHandle类型,PWM设备句柄
config结构体指针类型,配置参数

返回值返回值描述
HDF_SUCCESS设置PWM设备参数成功
负数设置PWM设备参数失败
int32_t ret;
struct PwmConfig pcfg;pcfg.duty = 25000000;                     // 占空时间为25000000纳秒
pcfg.period = 50000000;                   // 周期为50000000纳秒
pcfg.number = 0;                          // 不断产生方波
pcfg.polarity = PWM_INVERTED_POLARITY;    // 极性为反
pcfg.status = PWM_ENABLE_STATUS;          // 运行状态为启用ret = PwmSetConfig(handle, &pcfg);        // 设置PWM设备参数
if (ret != HDF_SUCCESS) {HDF_LOGE("PwmSetConfig: pwm set config failed, ret:%d\n", ret);return ret;
}
获取PWM设备参数
int32_t PwmGetConfig(DevHandle handle, struct PwmConfig *config);

表 11 PwmGetConfig参数和返回值描述

参数参数描述
handleDevHandle类型,PWM设备句柄
config结构体指针类型,配置参数
返回值返回值描述
HDF_SUCCESS获取PWM设备参数成功
负数获取PWM设备参数失败
int32_t ret;
struct PwmConfig pcfg;ret = PwmGetConfig(handle, &pcfg);    // 获取PWM设备参数
if (ret != HDF_SUCCESS) {HDF_LOGE("PwmGetConfig: pwm get config failed, ret:%d\n", ret);return ret;
}

使用实例

下面将基于Hi3516DV300开发板展示使用PWM完整操作,步骤主要如下:

  1. 传入PWM设备号,打开PWM设备并获得PWM设备句柄。

  2. 通过PWM设备句柄及待设置的周期,设置PWM设备周期。

  3. 通过PWM设备句柄及待设置的占空时间,设置PWM设备占空时间。

  4. 通过PWM设备句柄及待设置的极性,设置PWM设备极性。

  5. 通过PWM设备句柄及待获取的设备参数,获取PWM设备参数。

  6. 通过PWM设备句柄,使能PWM设备。

  7. 通过PWM设备句柄及待设置的设备参数,设置PWM设备参数。

  8. 通过PWM设备句柄,禁用PWM设备。

  9. 通过PWM设备句柄,关闭PWM设备。

#include "pwm_if.h"                                               // pwm标准接口头文件
#include "hdf_log.h"                                              // 标准日志打印头文件static int32_t PwmTestSample(void)
{int32_t ret;uint32_t num;uint32_t period;uint32_t duty;DevHandle handle = NULL;struct PwmConfig pcfg;pcfg.duty = 20000000;                                         // 占空时间为20000000纳秒                 pcfg.period = 40000000;                                       // 周期为40000000纳秒pcfg.number = 100;                                            // 生成100个方波pcfg.polarity = PWM_NORMAL_POLARITY;                          // 极性为正pcfg.status = PWM_ENABLE_STATUS;                              // 运行状态为启用num = 1;                                                      // PWM设备编号,要填写实际平台上的编号handle = PwmOpen(num);                                        // 获取PWM设备句柄if (handle == NULL) {HDF_LOGE("PwmTestSample: open pwm_%u fail!\n", num);return HDF_FAILURE;}period = 50000000;                                            // 设置周期为50000000纳秒ret = PwmSetPeriod(handle, period);if (ret != HDF_SUCCESS) {HDF_LOGE("PwmTestSample: pwm set period fail, ret:%d\n", ret);goto ERR;}duty = 25000000;                                              // 设置占空时间为25000000纳秒ret = PwmSetDuty(handle, duty);if (ret != HDF_SUCCESS) {HDF_LOGE("PwmTestSample: pwm set duty fail, ret:%d\n", ret);goto ERR;}ret = PwmSetPolarity(handle, PWM_INVERTED_POLARITY);          // 设置极性为反if (ret != HDF_SUCCESS) {HDF_LOGE("PwmTestSample: pwm set polarity fail, ret:%d\n", ret);goto ERR;}ret = PwmGetConfig(handle, &pcfg);                            // 获取PWM设备参数if (ret != HDF_SUCCESS) {HDF_LOGE("PwmTestSample: get pwm config fail, ret:%d\n", ret);goto ERR;}ret = PwmEnable(handle);                                      // 启用PWM设备if (ret != HDF_SUCCESS) {HDF_LOGE("PwmEnable: enable pwm fail, ret:%d\n", ret);goto ERR;}ret = PwmSetConfig(handle, &pcfg);                            // 设置PWM设备参数if (ret != HDF_SUCCESS) {HDF_LOGE("PwmTestSample: set pwm config fail, ret:%d\n", ret);goto ERR;}ret = PwmDisable(handle);                                     // 禁用PWM设备if (ret != HDF_SUCCESS) {HDF_LOGE("PwmTestSample: disable pwm fail, ret:%d\n", ret);goto ERR;}HDF_LOGD("PwmTestSample: all tests end.");
ERR:PwmClose(handle);                                             // 销毁PWM设备句柄return ret;
}

最后

经常有很多小伙伴抱怨说:不知道学习鸿蒙开发哪些技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?

为了能够帮助到大家能够有规划的学习,这里特别整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、WebGL、元服务、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植等等)鸿蒙(HarmonyOS NEXT)技术知识点。

在这里插入图片描述

《鸿蒙 (Harmony OS)开发学习手册》(共计892页):https://gitcode.com/HarmonyOS_MN/733GH/overview

如何快速入门?

1.基本概念
2.构建第一个ArkTS应用
3.……

鸿蒙开发面试真题(含参考答案):

在这里插入图片描述

《OpenHarmony源码解析》:

  • 搭建开发环境
  • Windows 开发环境的搭建
  • Ubuntu 开发环境搭建
  • Linux 与 Windows 之间的文件共享
  • ……
  • 系统架构分析
  • 构建子系统
  • 启动流程
  • 子系统
  • 分布式任务调度子系统
  • 分布式通信子系统
  • 驱动子系统
  • ……

图片

OpenHarmony 设备开发学习手册:https://gitcode.com/HarmonyOS_MN/733GH/overview

图片
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/432820.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flutter中使用FFI的方式链接C/C++的so库(harmonyos)

Flutter中使用FFI的方式链接C/C库(harmonyos) FFI plugin创建和so的配置FFI插件对so库的使用 FFI plugin创建和so的配置 首先我们可以根据下面的链接生成FFI plugin插件:开发FFI plugin插件 然后在主项目中pubspec.yaml 添加插件的依赖路径&…

排序--堆排序【图文详解】

二叉树的相关概念 叶子:没有子节点的节点叫叶子节点 大根堆:所有的父亲大于儿子 小根堆:所有的儿子大于父亲 父亲于儿子的的下标关系: 父亲的下标为i ,那么左孩子的下标为2*i1,右孩子的下标为2i2 子的下…

智源研究院与百度达成战略合作 共建AI产研协同生态

2024年9月24日,北京智源人工智能研究院(简称“智源研究院”)与北京百度网讯科技有限公司(简称“百度”)正式签署战略合作协议,双方将充分发挥互补优势,在大模型等领域展开深度合作,共…

tomcat服务搭建部署ujcms网站

tomcat服务搭建部署ujcms网站 关闭selinux和防火墙 setenforce 0 && systemctl stop firewalld安装java环境 #卸载原有java8环境 yum remove java*#上传java软件包,并解压缩 tar -xf openjdk-11.0.1_linux-x64_bin.tar.gz && mv jdk-11.0.1 jdk11…

Elasticsearch讲解

1.Elasticsearch基本知识 1.基本认识和安装 Elasticsearch是由elastic公司开发的一套搜索引擎技术,它是elastic技术栈中的一部分。完整的技术栈包括: Elasticsearch:用于数据存储、计算和搜索 Logstash/Beats:用于数据收集 Kib…

【学习笔记】地平线J3J5J6E对比

内容J3J5J6ECPU 4核Cortex-A53 1.2GHz 8核Cortex-A55 1.2GHz 6核Cortex-A78AE 1.5GHz MCU/ MStar 双核锁步Cortex-MStar 2核Cortex-R52 One DCLS core pairand one Split-Lock core 1.2GHz GPU// Mail-G78AE 800MHz 100 FP32 GFLOPS BPU 2*Bernoulli-architecture 5TOPS 2…

测试部署单副本 oceanbase-3.2.4.1 企业版

由于项目需要,测试部署单副本 oceanbase-3.2.4.1 企业版 1.安装前提 准备4cpu,12G内存,100G磁盘 统为centos7.9 yum install -y yum-utils wget net-tools tree yum-config-manager --add-repo https://mirrors.aliyun.com/oceanbase/OceanBase.repo 2.创建用…

计算机毕业设计Hadoop+Spark知识图谱体育赛事推荐系统 体育赛事热度预测系统 体育赛事数据分析 体育赛事可视化 体育赛事大数据 大数据毕业设计

《HadoopSpark知识图谱体育赛事推荐系统》开题报告 一、研究背景及意义 随着互联网技术的迅猛发展和大数据时代的到来,体育赛事数据的数量呈爆炸式增长。用户面对海量的体育赛事信息,常常感到信息过载,难以快速找到感兴趣的赛事内容。如何高…

C语言中的一些小知识(三)

一、你了解printf()吗? 你知道下面代码的输出结果吗? int a123; printf("%2d \n",a); printf() 函数是 C 语言中用于格式化输出的标准函数,它允许你将数据以特定的格式输出到标准输出设备(通常是屏幕)。p…

uniapp 知识点

自定义导航 在page.json navigationstyle":"custom"navigateTo传参 页面传参只能onLoad(option)里面拿 px和upx的关系 在750设计图中,1px1upx 路由 navigateBack返回上一页 重定向 其实就是把当前页面干掉了 公共组件和页面共同点 computed,watc…

vue初学随笔

Vue基础 Vue基本概念 Vue是什么 Vue是一个渐进式的JavaScript框架,它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。 渐进式:各个特性可以根据项目需要逐渐引入和…

认知杂谈84《菜鸟的自我修炼:知易行难与行难知易》

内容摘要: 理解与行动之间的差距是日常生活的常见挑战。"知易行难"体现在理解简单但执行困难,例如知道蔬菜有益但难以坚持食用。而"行难知易"则是开始时困难但后来容易的任务,如学习骑自行车。 这种差异源于心理惰性和习…

Oracle RMAN 无敌备份脚本

1 说明 上一篇文章:Oracle逻辑备份脚本,介绍了如何部署Oracle数据库的逻辑备份脚本,在数据迁移场景下十分好用,但是作为备份来说有点牵强。仅仅有逻辑备份时,当故障发生后,逻辑备份恢复只能恢复到某一时刻…

OpenHarmony(鸿蒙南向)——平台驱动指南【MIPI CSI】

往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ 持续更新中…… 概述 功能简介 CSI(Camera Serial Interface&#xf…

JavaScript 学习

一、输出 为方便调试可以输出内容&#xff0c;但是用户是看不到的。要在开发者模式中看。 console . log ( "Hello" )&#xff1b; 二、外部文件引用 可以直接在html中写JS <head> <meta charset"utf-8"> <script> console.log("he…

Java面试题之JVM20问

1、说说 JVM 内存区域 这张图就是一个 JVM 运行时数据图&#xff0c;「紫色区域代表是线程共享的区域」&#xff0c;JAVA 程序在运行的过程中会把他管理的内存划分为若干个不同的数据区域&#xff0c;「每一块儿的数据区域所负责的功能都是不同的&#xff0c;他们也有不同的创建…

MAGICORE:基于多代理迭代的粗到细精炼框架,提升大语言模型推理质量

大语言模型(LLM)的推理能力可以通过测试时聚合策略来改进,即为每个问题生成多个样本并对它们进行聚合以找到更好的答案。这些方法往往会达到饱和点,超过这个点后额外的样本不会带来更多收益。精炼(refinement)提供了另一种选择,它使用模型生成的反馈不仅采样更多解决方案,还提高…

使用离火插件yoloV8数据标注,模型训练

1. 启动 2.相关配置 2.1 data.yaml path: D:/yolo-tool/yaunshen-yolov8/YOLOv8ys/YOLOv8-CUDA10.2/1/datasets/ceshi001 train: images val: images names: [蔡徐坤,篮球] 2.2 cfg.yaml # Ultralytics YOLOv8, GPL-3.0 license # Default training settings and hyp…

解读 Story Protocol:IP 与区块链的潜力与障碍

撰文&#xff1a;100y.eth 编译&#xff1a;J1N&#xff0c;Techub News 8 月&#xff0c;据 The Block 报道&#xff0c;专注于知识产权&#xff08;IP&#xff09;的区块链 Story 宣布完成 a16z Crypto 领投 8000 万美元 B 轮融资&#xff0c;参投方包括 Polychain Capital&…

AI搜索软件哪个好,AI搜索引擎工具分享

随着AI技术的发展&#xff0c;AI搜索引擎工具正逐渐成为我们信息获取的重要方法。下面小编就来和大家分享一些好用的AI搜索引擎软件&#xff0c;感兴趣的同学可以逐个使用体验一下。因为每个AI搜索引擎工具不同&#xff0c;建议大家搜索的时候可以多个工具搜索&#xff0c;然后…