HarmonyOS实战 —基于hi3861芯片鸿蒙2.0的避坑指南
特别说明:本文章与卡片开发无关,想看卡片开发的不用往下读了
最近学习鸿蒙设备开发的过程中遇到了很多问题,因为目前几乎所有设备开发教程都是针对OpenHarmony1.x的,用OpenHarmony2.0的过程中遇到了很多问题,于是想写一篇文章蹭一下卡片开发的热度,让更多人看到帮大家避坑。
1.wifi iot套件的专用sdk目录和数量变了
harmonyos1.0: harmonyos2.0: 我猜测可能时还没有来得及封装的原因, 我在用Openharmony2.0写一个简单的按键程序的时候我发现iot开头的头文件居然没有拉高电平的函数 但是在openharmony1.0的代码里面有相关函数的封装
最后通过看源码发现无论是新的sdk还是旧的sdk其实都是基于更底层的hi开头的sdk封装的,所以如果发现没有相应函数的时候可以直接调用这些hi开头的头文件
2.usr_config.mk文件位置改变
玩过OpenHarmony1.0的人应该都知道在使用某些功能的时候需要在配置文件把对应的选项写上才能使用该功能否则会报错。 openharmony1.0: 但是Open Harmony2.0里面这个文件的位置变了: 目前我在学习过程中也只发现这两个问题,后面遇到问题再补充吧, 这个好像不写够1000字还不让发,那我再附一个hi3861开发板用蜂鸣器放歌的鸿蒙2.0版本教程吧。
3.PWM播放音乐,基于hispark wifi套件采用harmony os 2.0全量代码
一、看原理图确定硬件电路
本例采用红绿灯扩展版上的蜂鸣器 注:可以发现由于红绿灯的蜂鸣器与GPIO9相连而核心板上的led也是与GPIO9相连的,所以控制蜂鸣器时核心板板载的led也会发生变化。
二、在源码中建立demo文件
在app下建立pwmdemo文件夹并创建BUILD.gn和pwm_buz_music.c文件
三、编写代码
在pwmdemo/pwm_buz_music.c中写入
#include <stdio.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "hi_gpio.h"
#include "hi_io.h"
#include "hi_pwm.h"
#include "hi_time.h"
static const uint16_t g_tuneFreqs[] = {
0,
38223,
34052,
30338,
28635,
25511,
22728,
20249,
};
static const uint8_t g_scoreNotes[] = {
1, 2, 3, 1, 1, 2, 3, 1, 3, 4, 5, 3, 4, 5,
5, 6, 5, 4, 3, 1, 5, 6, 5, 4, 3, 1, 1, 5, 1, 1, 5, 1,
};
static const uint8_t g_scoreDurations[] = {
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, 4, 8,
3, 1, 3, 1, 4, 4, 3, 1, 3, 1, 4, 4, 4, 4, 8, 4, 4, 8,
};
static void PwmGpioTask(void *arg){
(void)arg;
uint32_t tune;
uint16_t freqDivisor;
uint32_t tuneInterval;
for (size_t i = 0; i < sizeof(g_scoreNotes)/sizeof(g_scoreNotes[0]); i++)
{
tune = g_scoreNotes[i];
freqDivisor = g_tuneFreqs[tune];
tuneInterval = g_scoreDurations[i] * (125 * 1000);
printf("%d %d %d\r\n", tune, freqDivisor, tuneInterval);
hi_pwm_start(HI_PWM_PORT_PWM0, freqDivisor/2, freqDivisor);
hi_udelay(tuneInterval);
hi_pwm_stop(HI_PWM_PORT_PWM0);
}
}
static void PwmGpioEntry(void){
osThreadAttr_t attr;
hi_gpio_init();
hi_io_set_func(9, HI_IO_FUNC_GPIO_9_PWM0_OUT);
hi_pwm_init(HI_PWM_PORT_PWM0);
hi_pwm_set_clock(PWM_CLK_XTAL);
attr.name = "PwmGpioTask";
attr.attr_bits = 0U;
attr.cb_mem = NULL;
attr.cb_size = 0U;
attr.stack_mem = NULL;
attr.stack_size = 1024;
attr.priority = 25;
if (osThreadNew(PwmGpioTask, NULL, &attr) == NULL) {
printf("[LedExample] Falied to create LedTask!\n");
}
}
SYS_RUN(PwmGpioEntry);
这里的pwm相关函数用法参考源码 在pwmdemo/BUILD.gn中写入
static_library("pwmdemo") {
sources = [
"pwm_buz_music.c"
]
include_dirs = [
"//utils/native/lite/include",
"//kernel/liteos_m/components/cmsis/2.0",
"//base/iot_hardware/peripheral/interfaces/kits",
"//device/hisilicon/hispark_pegasus/sdk_liteos/include"
]
}
在上级目录的app/BUILD.gn中写入
import("//build/lite/config/component/lite_component.gni")
lite_component("app") {
features = [
"pwmdemo",
]
}
注:为了保证编译通过请修改配置文件 修改device/hisilicon/hispark_pegasus/sdk_liteos/build/config/usr_config.mk 加上
CONFIG_PWM_SUPPORT=y
四、在Linux下使用hb工具进行编译
root@DESKTOP-QAO2AOK:~/harmonyos/code-2.0-canary
[OHOS INFO] Input code path: .
OHOS Which product do you need? wifiiot_hispark_pegasus
root@DESKTOP-QAO2AOK:~/harmonyos/code-2.0-canary
如果曾经设置过hb set就不需要再设置了,直接这样就可以了
root@DESKTOP-QAO2AOK:~/harmonyos/code-2.0-canary
看到success字样即为编译成功
五、将编译好的固件烧录到开发板
将linux中的源码文件夹中的out拷贝到Windows下替换原有out文件夹就可以了,但是要先删除原有out文件夹 打开vscode使用DevEco Device Tool打开源码文件夹 选择对应的开发板型号 这里选择的是hi3861 然后在项目设置中按照实际端口情况进行如下设置 保存项目并打开 点击upload进行烧录,烧录时需要根据提示按下开发板的rst键,稍等片刻,看到success代表烧录成功。 按下rst键重启开发板,可以听到蜂鸣器播放儿歌两只老虎
【本文正在参与“有奖征文 | HarmonyOS征文大赛”活动】 活动页面链接.
|