OpenHarmony轻量系统开发【7】驱动之I2C显示OLED屏幕

7.1实验效果

Hispark WiFi开发套件又提供一个oled屏幕,但是鸿蒙源码中没有这个屏幕的驱动,我们需要自己去移植。

以下是移植效果:

接口:I2C

使用引脚:HI_IO_NAME_GPIO_13 、 HI_IO_NAME_GPIO_14

7.2代码

这里我直接用许思维老师之前移植好的代码,不过由于鸿蒙版本更新过快,许思维老师之前的代码是基于1.0版本,直接拿到3.0以上版本编译会出错,这里我修改了编译错误。放在我的仓库中。

整个代码目录如下:

主要是3个文件夹:

(1)examples

测试代码,里面有一个ssd1306_demo.c文件,是我们的入口函数。

(2)libm_port

从musl libc中抽取的sincos的实现。

(3)ssd1306

相关驱动代码部分。

接下来我们来重点看下代码部分:

(1)初始化入口函数

入口函数是 Ssd1306TestDemo ,它创建了Ssd1306TestTask线程,所以我们重点看 Ssd1306TestTask线程。

void Ssd1306TestTask(void* arg)
{(void) arg;//先初始化引脚IoTGpioInit(HI_IO_NAME_GPIO_13);IoTGpioInit(HI_IO_NAME_GPIO_14);//将引脚功能设置为I2C引脚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);//初始化I2C0IoTI2cInit(0, OLED_I2C_BAUDRATE);//WatchDogDisable();usleep(20*1000);//初始化SSD1306ssd1306_Init();//全部清空ssd1306_Fill(Black);ssd1306_SetCursor(0, 0);//显示 Hello HarmonyOS!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);TestDrawChinese1();TestDrawChinese2();TestGetTick();while (1) {//进行所有用例测试ssd1306_TestAll();usleep(10000);}
}

(2)I2C发送函数

我们要操作OLED屏幕,就需要使用I2C发送数据给OLED屏幕,代码使用

ssd1306_SendData函数发送I2C数据,该函数原型如下,直接调用的hi3861的i2c接口函数:

static uint32_t ssd1306_SendData(uint8_t* data, size_t size)
{int id = SSD1306_I2C_IDX;return IoTI2cWrite(id, SSD1306_I2C_ADDR, data, size);
}

(3)修改 usr_config.mk文件

注意,默认代码是没有打开i2c功能的,直接编译会提示相关的i2c函数没有定义,我们需要打开i2c的功能,具体是修改usr_config.mk文件 ,目前版本(3.1)的路径是:

device\soc\hisilicon\hi3861v100\sdk_liteos\build\config\usr_config.mk

但是代码结构可能会调整,路径可能会变。

增加 CONFIG_I2C_SUPPORT=y

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

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

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

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

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

相关文章

Java动态getter/setter

前言 个人日常工作中的开发经验总结 通过反射动态获取实体类getter 首先,构造getter方法的名字,然后通过getMethod()方法从Database类中获取该方法的引用。接着,使用invoke()方法来调用该方法,从而获取属性的值。在调用getMeth…

供应链金融机器学习建模实战

随着全球贸易的不断发展和供应链的日益复杂化,供应链金融作为一种新型金融工具,正逐渐受到企业和金融机构的关注和重视。供应链金融是指通过金融手段来优化和改进供应链中的资金流动和货物流动,以实现企业间的合作共赢。 供应链金融的核心是将…

Java的自定义线程池

Java的自定义线程池 自定义线程池的原因 在《阿里巴巴java开发手册》中指出了线程资源必须通过线程池提供,不允许在应用中自行显示的创建线程,这样一方面使线程的创建更加规范,可以合理控制开辟线程的数量;另一方面线程的细节管理…

docker容器内的进程启动监控,容器进程所在的PID namespce

在容器内启动进程 docker exec -it 9c6b0b0509da /bin/bash cd /home ./testapp 主机上的监控程序同样可以监控到 13022 /home/testapp !!!!!发现异常进程:testapp, exePath:/home/testapp GetExePath()函数返回的值是/home/testapp ,即:进程执行文件所…

不能在子类的初始化列表中初始化父类的成员

不能在子类的初始化列表中初始化父类的成员 错误示例代码 class A { protected:int n_; };class B : public A { public:B() : n_(0){} };编译报错如下: error: class ‘B’ does not have any field named ‘n_’前置知识 继承情况下的初始化顺序 子类对象的构…

FFmpeg: 自实现ijkplayer播放器--08视频解码线程设计

文章目录 视频解码解码流程视频解码线程音频解码线程数据帧队列类型定义数据帧队列api视频解码 视频解码,读取数据包(packet),生成数据帧(frame),放入数据帧队列,用来输出音频和视频 解码流程 stream_component_open: 分配解码器上下文 avcodec_alloc_context3将码…

高频九问:产品经理面试题解析

01 ▼ 需求评审时研发说需求实现不了怎么办? 1.站在技术的角度,了解无法实现的原因 2.看有哪些可以替代的方案 3.评估替代方案对项目本身的影响,如延迟,如若在可接受范围内,适当的妥协 02 ▼ 是否了解我们公司&a…

Flume配置案例@Source:文件,Channel+Sink:Kafka

Source:某个目录下所有文件 Channel:Kafka Sink:Kafka 【Source和Channel的选择】 1)TailDirSource TailDirSource相比ExecSource、SpoolingDirectorySource的优势。 TailDirSource:断点续传、多目录。Flume1.6以前…

大模型微调技术概览解读(chatGLM-6B)

目录 一些比较流行的PEFT方案 Prompt Tuning Prefix Tuning LoRA QLoRA 引用链接 参考文档:通俗解读大模型微调(Fine Tuning) - 知乎 从参数规模的角度,大模型的微调分成两条技术路线: 一条是对全量的参数,进行全量的训练…

【从零开始手搓12306项目】五、如何保证不超卖、不少卖、还能承受极高的并发?

逻辑设计&模型实现 余票查询:记录站站余票 座位购买:记录座位销售详情(将卖票变成01二进制数的计算) 使用事务保证原子性

VMware设置静态ip:以Centos7为例

1、获取网段,子网掩码和网关 到此获取到的信息: 网段:192.168.204.128 ~ 192.168.204.254 子网掩码:255.255.255.0 网关IP:192.168.204.2 2、修改Centos系统的网络配置 使用命令vim /etc/sysconfig/network-scripts/…

Kotlin从0到1,让你一周快速上手!!

声明 大家好,这里是懒羊羊学长,如果需要pdf版以及其他资料,请加入群聊。群里每天更新面经、求职资料,经验分享等,大家感兴趣可以加一下。 Kotlin 声明1.Kotlin基础2. Kotlin函数3.Kotlin进阶4.Kotlin集合5.Kotlin高…

全球顶级的低代码开发平台,你知道几个?

什么是低代码开发平台? 低码开发平台是一个应用程序,提供图形用户界面编程,从而以非常快的速度开发代码,减少了传统的编程工作。 这些工具有助于快速开发代码,最大限度地减少手工编码的努力。这些平台不仅有助于编码,而且还能快速安装和部署。 低码开发工具的好处 低代码平…

【QT教程】QT6数据库操作

QT6数据库操作 使用AI技术辅助生成 QT界面美化视频课程 QT性能优化视频课程 QT原理与源码分析视频课程 QT QML C扩展开发视频课程 免费QT视频课程 您可以看免费1000个QT技术视频 免费QT视频课程 QT统计图和QT数据可视化视频免费看 免费QT视频课程 QT性能优化视频免费看 免费Q…

为什么公共云的弹性能力很难被发挥出来?

作者|王小瑞 AutoMQ 联合创始人 & CEO 云计算通过资源池化实现单位资源成本更优,使企业能够将 IDC 建设、基础软件研发和运维等工作外包给云厂商,从而更专注于业务创新。资源池不仅包括服务器,还包括人才。云厂商集聚了优秀…

ubuntu20.04.3挂载共享文件夹

VMware设置win共享文件夹 在linux执行挂载命令 sudo vmhgfs-fuse /mnt/hgfs/ -o nonempty这样就可以用管理员访问/mnt/hgfs/share

Java全套智慧校园系统源码springboot+elmentui +Quartz可视化校园管理平台系统源码 建设智慧校园的5大关键技术

Java全套智慧校园系统源码springbootelmentui Quartz可视化校园管理平台系统源码 建设智慧校园的5大关键技术 智慧校园指的是以物联网为基础的智慧化的校园工作、学习和生活一体化环境,这个一体化环境以各种应用服务系统为载体,将教学、科研、管理和校园…

Docker仅需3步搭建免费私有化的AI搜索引擎-FreeAskInternet

简介 FreeAskInternet 是一个完全免费、私有且本地运行的搜索引擎,并使用 LLM 生成答案,无需 GPU。用户可以提出问题,系统会进行多引擎搜索,并将搜索结果合并到ChatGPT3.5 LLM中,并根据搜索结果生成答案。 什么是 Fr…

3D视觉引导麻袋拆垛破包 | 某大型化工厂

客户需求 此项目为大型化工厂,客户现场每日有大量麻袋拆垛破包需求,麻袋软包由于自身易变形、码放垛型不规则、运输后松散等情况,无法依靠机器人示教位置完成拆垛。客户遂引入3D视觉进行自动化改造。 工作流程: 3D视觉对紧密贴合…

win10系统自带的md5文件校验用法

开始--运行,回车 certutil -hashfile 文件名 md5 其它功能可以看链接:certutil | Microsoft Learn