Harmony OS 设备开发学习记录(十二)-- 通过I2C点亮oled显示汉字、图片。
基于hispark wifi套件采用harmony os 2.0全量代码
一、看原理图确定硬件电路
oled原理图
二、在源码中建立demo文件
先在gitee上吧hihopeorg中大神移植好的驱动克隆下来并移动到项目目录中
git clone https://gitee.com/hihopeorg/harmonyos-ssd1306.git
cd harmonyos-ssd1306/
cp -r ssd1306/ /root/harmonyos/code-2.0-canary/applications/sample/wifi-iot/app/
cp -r examples/ /root/harmonyos/code-2.0-canary/applications/sample/wifi-iot/app/
cp -r libm_port/ /root/harmonyos/code-2.0-canary/applications/sample/wifi-iot/app/
目录将出现下列文件夹
三、修改代码
由于鸿蒙1.0中使用的sdk在openharmony2.0中已经弃用,需要对部分代码进行修改
在ssd1306/ssd1306.c中修改头部
#include "ssd1306.h"
#include <math.h>
#include <stdlib.h>
#include <string.h> // For memcpy
#include <stdio.h>
#include <unistd.h>
#include "cmsis_os2.h"
// #include "wifiiot_i2c.h" //注释掉这两个头文件
// #include "wifiiot_errno.h"
#include "hi_errno.h"
#include "hi_i2c.h"
在ssd1306/ssd1306.c中修改ssd1306_SendData函数
static uint32_t ssd1306_SendData(uint8_t* data, size_t size)
{
hi_i2c_idx id = SSD1306_I2C_IDX;
hi_i2c_data i2cData = {0};
i2cData.send_buf = data;
i2cData.send_len = size;
return hi_i2c_write(id, SSD1306_I2C_ADDR, &i2cData);
}
在examples/ssd1306_demo.c中修改头部
#include <ctype.h>
#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "hi_io.h"
#include "hi_gpio.h"
#include "hi_pwm.h"
#include "hi_adc.h"
#include "hi_i2c.h"
#include "hi_errno.h"
#include "hi_watchdog.h"
#include "ssd1306.h"
#include "ssd1306_tests.h"
在examples/ssd1306_demo.c中修改Ssd1306TestTask函数
void Ssd1306TestTask(void* arg)
{
(void) arg;
hi_gpio_init();
hi_io_set_func(HI_IO_NAME_GPIO_13, HI_IO_FUNC_GPIO_13_I2C0_SDA);
hi_io_set_func(HI_IO_NAME_GPIO_14, HI_IO_FUNC_GPIO_14_I2C0_SCL);
hi_i2c_init(HI_I2C_IDX_0, OLED_I2C_BAUDRATE);
hi_watchdog_disable();
usleep(20*1000);
ssd1306_Init();
ssd1306_Fill(Black);
ssd1306_SetCursor(0, 0);
ssd1306_DrawString("Hello HarmonyOS!", Font_7x10, White);
uint32_t start = HAL_GetTick();
ssd1306_UpdateScreen();
uint32_t end = HAL_GetTick();
printf("ssd1306_UpdateScreen time cost: %d ms.\r\n", end - start);
while (1) {
TestDrawChinese1();
osDelay(500);
TestDrawChinese2();
osDelay(500);
TestShowChars(Font_6x8, 6, 8);
osDelay(500);
TestShowChars(Font_7x10, 7, 10);
osDelay(500);
ssd1306_TestAll();
}
}
并将上述文件中所有的WIFI_IOT_SUCCESS修改为HI_ERR_SUCCESS
分别修改三个文件夹下的BUILD.gn,将include_dirs的内容替换如下
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 = [
"ssd1306:oled_ssd1306",
"examples:oled_test",
"libm_port:libm_port"
]
}
四、在Linux下使用hb工具进行编译
root@DESKTOP-QAO2AOK:~/harmonyos/code-2.0-canary# hb set
[OHOS INFO] Input code path: .
OHOS Which product do you need? wifiiot_hispark_pegasus
root@DESKTOP-QAO2AOK:~/harmonyos/code-2.0-canary# hb build
如果曾经设置过hb set就不需要再设置了,直接这样就可以了
root@DESKTOP-QAO2AOK:~/harmonyos/code-2.0-canary# hb build
看到success字样即为编译成功
五、将编译好的固件烧录到开发板
将linux中的源码文件夹中的out拷贝到Windows下替换原有out文件夹就可以了,但是要先删除原有out文件夹
打开vscode使用DevEco Device Tool打开源码文件夹
选择对应的开发板型号
这里选择的是hi3861
然后在项目设置中按照实际端口情况进行如下设置
保存项目并打开
点击upload进行烧录,烧录时需要根据提示按下开发板的rst键,稍等片刻,看到success代表烧录成功。
按下rst键重启开发板,这时候可以看到开发板上的oled模块上面依次开始显示不同的内容即为运行成功。