Hi3861 硬件 i2c 驱动 oled

news/2024/10/21 21:57:02/

一、前言

最近想用 3861 做个有意思的东西,记录一下开发过程。今天使用 3861 的硬件 i2c 驱动 oled。

硬件平台:Bearpi-Nano

软件SDK:润和sdk

二、搬一个 OLED 轮子

我之前写过一篇基于 stm32cubemx 快速使用 iic 接口 oled 的过程,里面有现成的 oled 接口,我们只要直接拿过来替换掉底层接口就行。

 STM32CubeMX驱动4脚OLED模块

替换的接口位置如下位置:

三、Hi3861 i2c 接口

SDK提供了两层接口封装,一层是芯片级的 driver 驱动,由原厂sdk提供:

另一层 open Harmony 级的驱动,是操作系统对原厂sdk的封装,主要为了兼容不同芯片开发:

原厂的 driver 接口更加细致,系统层的driver其实就是对原厂的一层封装,简单开发可以直接使用系统提供的driver接口,复杂开发则推荐研究一下原厂的接口,因为sdk不是很完善,不符合需求的可以直接改原厂的sdk。

我们简单驱动个i2c,使用系统封装的接口:

unsigned int IoTI2cInit(unsigned int id, unsigned int baudrate);

unsigned int IoTI2cDeinit(unsigned int id);

unsigned int IoTI2cWrite(unsigned int id, unsigned short deviceAddr, const unsigned char *data, unsigned int dataLen);

unsigned int IoTI2cRead(unsigned int id, unsigned short deviceAddr, unsigned char *data, unsigned int dataLen);

unsigned int IoTI2cSetBaudrate(unsigned int id, unsigned int baudrate);

用上面的读写接口替换掉 oled 轮子里面的 i2c 接口

四、使用驱动代码

在主函数中创建一个线程,调用 i2c、oled初始化接口,将初始化代码注册到系统运行回调中

#include <unistd.h>

#include "stdio.h"

#include "ohos_init.h"

#include "cmsis_os2.h"

#include "hi_io.h"

#include "hi_i2c.h"

#include "iot_errno.h"

#include "iot_i2c.h"

#include "iot_gpio.h"

#define OLED_I2C_BAUDRATE 400000

static void iot_i2c_init(void)

{

    IoTGpioInit(HI_IO_NAME_GPIO_0);

    IoTGpioInit(HI_IO_NAME_GPIO_1);

    //将引脚功能设置为 I2C 引脚

    hi_io_set_func(HI_IO_NAME_GPIO_0, HI_IO_FUNC_GPIO_0_I2C1_SDA);

    hi_io_set_func(HI_IO_NAME_GPIO_1, HI_IO_FUNC_GPIO_1_I2C1_SCL);

    //初始化 I2C0

    uint32_t ret = IoTI2cInit(HI_I2C_IDX_1, OLED_I2C_BAUDRATE);

    if (ret != IOT_SUCCESS) {

        printf("[OLED_TASK] Init i2c Fail. ret = %d\n", ret);

    }

    printf("[OLED_TASK] Init i2c succ.\n");

}

void oled_i2c_init(void)

{

    iot_i2c_init();

    OLED_Init();

    OLED_Clear();

}

void *oled_demo(const char *arg)

{

    (void)arg;

    char i = 0;

    char dat[10] = { 0 };

    oled_i2c_init();

    while (1) {

        printf("[OLED_TASK] i = %d!\n", i);

        OLED_ShowNum(10, 10, i++, 1, 8);

        osDelay(100);

    }

}

void oled_demo_init(void)

{

    osThreadAttr_t attr;

    attr.name = "OLED_Task";

    attr.attr_bits = 0U;

    attr.cb_mem = NULL;

    attr.cb_size = 0U;

    attr.stack_mem = NULL;

    attr.stack_size = 2048;

    attr.priority = 26;

    if (osThreadNew((osThreadFunc_t)oled_demo, NULL, &attr) == NULL) {

        printf("[OLED_TASK] Falied to create OLED_TASK!\n");

    }

}

SYS_RUN(oled_demo_init);

编译后通过 uart 下载代码

hb build -f

五、调试现象


http://www.ppmy.cn/news/49114.html

相关文章

如何区分高压和低压电阻接地系统

电阻接地系统或电阻接地中性线系统是通过一个或多个电阻在中性线和大地之间有意连接的系统。在这些系统中&#xff0c;接地故障期间造成的损坏远小于在牢固接地系统中接地故障期间造成的损坏&#xff0c;并且设备上的机械应力也大大降低。 电阻通常具有比接近接地点的系统电抗…

探索Linux设备树:硬件描述与驱动程序的桥梁

目录标题 引言&#xff1a;Linux设备树简介 | Introduction: Linux Device Tree Overviewa. 设备树的背景与发展 | Background and Development of Device Treeb. 设备树的作用与意义 | The Role and Significance of Device Tree 设备树语法与结构 | Device Tree Syntax and S…

回归预测 | MATLAB实现GA-GRU遗传算法优化门控循环单元的数据多输入单输出回归预测

回归预测 | MATLAB实现GA-GRU遗传算法优化门控循环单元的数据多输入单输出回归预测 目录 回归预测 | MATLAB实现GA-GRU遗传算法优化门控循环单元的数据多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 MATLAB实现GA-GRU遗传算法优化门控循环单元的数据…

无法启动此程序,因为计算机中丢失VCRUNTIME140.dll”错误的解决办法

vcruntime140.dll是什么什么文件呢&#xff1f;为什么电脑在运行一些游戏或许软件的时候会出现丢失vcruntime140.dll&#xff0c;然后游戏或许软件运行失败?这个dll文件是电脑重要的运行库文件。丢失了会导致很多程序无法运行。 首先打开电脑浏览器以后在顶部网页栏目输入&am…

跨平台开发工具怎么选?IDE工具推荐

软件开发工具链的价值&#xff0c;越来越多企业看到了它。近年来&#xff0c;国内也迎来了软件开发工具的自主化浪潮&#xff0c;今天就来跟大家盘点一下2023年十大移动开发IDE工具。 一、Android Studio 作为Android开发IDE工具的首选&#xff0c;Android Studio提供了一个全…

Revit插件 | 建模助手下半年规划大揭秘!

​hi&#xff0c;这里是建模助手。 在上周推送『建模助手年度版本大更新』后&#xff0c;很多盆友和我们反馈这次的升级&#xff0c;真被细节打动。 版本的兼容性更给力了&#xff0c;避免了某版本的Revit不可用的现象&#xff1b; 有求必应板块更细致了&#xff0c;新增了阶…

走进小程序【十一】微信小程序【使用Echarts 和 腾讯地图】

文章目录 &#x1f31f;前言&#x1f31f;效果展示&#x1f31f;使用Echarts&#x1f31f;Echarts官网&#x1f31f;体验示例小程序&#x1f31f;下载&#x1f31f;引入组件&#x1f31f;创建图表&#x1f31f;暂不支持的功能 &#x1f31f;使用地图&#x1f31f;map组件&#…

mybatis的参数处理详解

mybatis的参数处理详解 parameterType配置参数 1、参数的使用说明 使用标签的 parameterType 属性来设定。该属性的取值可以是基本类型&#xff0c;引用类型&#xff08;例如:String 类型&#xff09;&#xff0c;还可以是实体类类型&#xff08;POJO 类&#xff09;。同时也…