OrangePi KunPengPro | 开发板开箱测评之学习与使用

news2024/10/5 14:17:06

OrangePi KunPengPro | 开发板开箱测评之学习与使用


时间:2024年5月23日20:51:12

文章目录

  • `OrangePi KunPengPro` | 开发板开箱测评之学习与使用
  • 概述
  • 1.参考
  • 2.资料、工具
  • 3.使用
    • 3-1.通过串口登录系统
    • 3-2.通过SSH登录系统
    • 3-3.安装交叉编译工具链
    • 3-4.复制文件到设备
    • 3-5.第一个程序`hello`
      • 代码
      • makefile
      • 编译
      • 运行
    • 3-6.`I2C`的测试和使用
      • 资料
      • 演示
    • 3-7.**i2c**点亮`OLED`屏实验
      • 硬件连线示意图
      • 检测`i2c`从设备
      • 数据手册
      • Demo实例代码
        • 用户态读写`IIC`
        • Makefil文件
      • 演示(点亮效果)
  • 后记

KunPengPro

概述

非常荣幸有机会参加CSDN的这次举办的OrangePi Kunpeng Pro开发板的开箱测评/使用机会。

因为之前很少玩过类似的板子,感觉这个板子挺精致的。开箱,有一个主板(配置是8GB内存,还有一个32GB的内存卡(已经装好了系统),同时板子还装好了散热风扇,,然后还有一个电源),没遇到太有难度的,基本连上电源,真的是开箱即用。

丰富接口,易于扩展

汇聚了MIPI DSI、MIPI CSI、USB3.0、Type-C3.0、HDMI2.0、千兆以太网、支持SATA/NVMe SSD 2280的M.2插槽等各类流行的接口,可应用于外部设备控制和扩展。

支持SATA/NVMe SSD 2280硬盘,扩展海量容量

板载M.2接口,支持接入SATA/NVMe SSD 2280硬盘,增加海量数据存储空间,满足快速读写和大容量存储的需求。

多通道输出,支持多屏异显

支持双HDMI视频输出,支持双4K高清输出,支持一个MIPI DSI视频输出,支持两个MIPI接口摄像头输入。

提供类PC桌面环境,简化上手难度

支持图形化桌面(gnome),支持浏览器(firefox),支持文本编辑(gedit),支持中文输入法,支持shell终端。

预安装openEuler、openGauss、DevKit

高效、稳定、安全,支持多种硬件架构和虚拟化技术,可广泛应用于企业级边缘计算场景等。

OrangePi Kunpeng Pro采用4核64位处理器+AI处理器,集成图形处理器,支持8TOPS AI算力,拥有8GB/16GB LPDDR4X,可以外接32GB/64GB/128GB/256GB eMMC模块,支持双4K高清输出。
OrangePi Kunpeng Pro引用了相当丰富的接口,包括两个HDMI输出、GPIO接口、Type-C电源接口、支持SATA/NVMe SSD 2280M.2插槽、TF插槽、千兆网口、两个USB3.0、一个USB Type-C 3.0、一个Micro USB(串口打印调试功能)、两个MIPI摄像头、一个MIPI屏等,预留电池接口等。
OrangePi Kunpeng Pro支持openEuler操作系统,满足大多数AI算法原型验证、推理应用开发的需求,同时可以为各种应用场景提供更高效的算力,如云计算、大数据、分布式存储、高性能计算等。

因为是新的板子,所以先搜集了下相关的资料,进行阅读。板子连上电源,然后通过MicroUSB连接电脑,即可通过串口进入系统终端,进行调试和交互。这一点,也非常合理,仅需要安装下驱动,也不需要额外的USB转串口工具。网络连接和无线连接也是完善和丰富的。

这边主要先实践了下串口和网络登录系统终端,学会通过已有的硬件,进入系统。然后学习传文件到系统,方便将自己的工具和软件传到板子上。

然后安装了交叉编译工具链,运行了自己的第一个程序hello,迈出了开发的第一步。

最后,使用板子的IIC接口点亮了一个IIC OLED屏幕。详细演示了如何在linux平台下如何进行IIC的调试和开发。

使用过程中,也遇到了一些问题:

1.比如按照文档,使用256GBSD卡烧录了系统,启动过程中卡住了,目前没有深入探究,后续有时间再看看是啥问题;

2.MicroUSB调试串口能够连上电脑,但是不能出调试信息,目前没有想这个问题,就是通过网络进入终端调试,暂时绕开了调试串口不出信息的问题;

1.参考

1.OrangePi Kunpeng Pro Orange Pi官网-香橙派(Orange Pi)开发板,开源硬件,开源软件,开源芯片,电脑键盘

2.Orange Pi - Orange Pi 论坛

3.鲲鹏社区-官网丨凝心聚力 共创行业新价值 (hikunpeng.com)

4.OrangePiKunPengPro | 开发板学习与使用-CSDN博客

2.资料、工具

1.官方资料和工具:

root@ThinkPad-FLY:/mnt/d/Download/OrangePiKunpengPro# tree
.
├── 外壳及散热器安装资料
│   ├── OPi Kunpeng pro外壳装配说明.mp4
│   ├── OPi kunpeng Pro开发板+散热器组件装配说明-20240429.pptx
│   └── Opi Kunpeng pro开发板+散热器.mp4
├── 官方工具
│   ├── FileZilla-SFTP软件
│   │   └── FileZilla_3.62.2_win64_sponsored2-setup.exe
│   ├── Linux镜像烧录工具-balenEther
│   │   ├── Linux_X64版本
│   │   │   ├── balena-etcher_1.18.8_amd64.deb
│   │   │   └── balenaEtcher-1.18.4-x64.AppImage
│   │   ├── MACOS_X64版本
│   │   │   └── balenaEtcher-1.18.4.dmg
│   │   ├── Windows_X64版本
│   │   │   ├── balenaEtcher-Portable-1.18.4.exe
│   │   │   └── balenaEtcher-Setup-1.18.4.exe
│   │   └── 开发板安装的arm64版本
│   │       ├── balena-etcher-electron_1.7.9+5945ab1f_arm64.deb
│   │       └── balenaEtcher-1.7.9+5945ab1f-arm64.AppImage
│   ├── MobaXterm
│   │   └── MobaXterm_Portable_v22.2.zip
│   ├── Windows-格式化软件-SDCardFormatter
│   │   └── SDCardFormatterv5_WinEN.zip
│   ├── 交叉编译工具链
│   │   └── toolchain.tar.gz
│   └── 查看YUV图片的软件
│       └── SuperImage.rar
└── 用户手册
└── OrangePi_KunPeng_Pro_用户手册_v0.1.pdf

2.CH343SER.EXE - 驱动下载

3.WinSCP :: Official Site :: Download

4.Wi-Fi+蓝牙模组:欧智通 6221BUUC_datasheet

3.使用

3-1.通过串口登录系统

首先需要下载驱动(驱动下载主页见上面的连接),然后安装驱动;

通过Micro USB 连接电脑和开发板,查看com口,然后通过串口工具登录系统;

为什么一开始选择串口登录?因为通过串口调试是最简单的方式。虽然有网口,但一开始也不知道ip,也没法登录。

手边有显示器,可以通过HDMI连接,但是没有USB键盘,因此也没法好好交互。所以先通过串口登录系统交互。

请添加图片描述

3-2.通过SSH登录系统

上面通过串口进入系统后,通过连接网线(同一网络下),查看设备IP,即可通过SSH登录系统;

也可以参考文档:OrangePi_KunPeng_Pro_用户手册_v0.1.pdf,使用WIFI连接网络,就可以减少网线或者串口线的连接来登录终端;

请添加图片描述

3-3.安装交叉编译工具链

# 新建目录
sudo mkdir /opt/OrangePiKunpengPro
# 解压文件
sudo tar -zxvf toolchain.tar.gz -C /opt/OrangePiKunpengPro/
# 设置环境变量
sudo vim /etc/profile
# 使环境变量生效
source /etc/profile
# 查看编译器版本
aarch64-target-linux-gnu-gcc --version
# 写源码
vim hello.c
# 编译源码
aarch64-target-linux-gnu-gcc hello.c -o hello

请添加图片描述

3-4.复制文件到设备

首先电脑上需要安装WinSCP软件。WinSCP :: Official Site :: Free SFTP and FTP client for Windows

将编译的之前交叉编译的hello可执行程序复制到设备上,修改可执行权限,就可以在设备上执行自己编译的程序。

请添加图片描述

3-5.第一个程序hello

代码

/*******************************************************************
 *   > File Name: hello.c
 *   > Author: fly
 *   > Mail: 
 *   > Create Time: Fri 17 May 2024 02:14:11 PM CST
 ******************************************************************/

#include <stdio.h>

int main(int argc, char* argv[])
{
    printf("hello\n\n");

    printf("__FILE__: %s\n", __FILE__);
    printf("__FUNC__: %s\n", __func__);
    printf("__LINE__: %d\n", __LINE__);

    return 0;
}

makefile

.PHONY:all

SRC=hello.c
BIN=hello
#CC=gcc
CC=aarch64-target-linux-gnu-gcc

all:
        @echo "预处理"
        $(CC) -E hello.c -o hello.i
        @echo "编译"
        $(CC) -S hello.i -o hello.s
        @echo "汇编"
        $(CC) -c hello.s -o hello.o
        @echo "链接"
        $(CC) hello.o -o hello

clean:
        $(RM) *.i *.s *.o hello

编译

编译是在一个Ubuntu docker中进行的,需要提前安装、配置好交叉编译工具链(命令行操作如下);

[fly@752fac4b02e9 02-hello]$ ls
hello.c  Makefile
[fly@752fac4b02e9 02-hello]$ make
预处理
aarch64-target-linux-gnu-gcc -E hello.c -o hello.i
编译
aarch64-target-linux-gnu-gcc -S hello.i -o hello.s
汇编
aarch64-target-linux-gnu-gcc -c hello.s -o hello.o
链接
aarch64-target-linux-gnu-gcc hello.o -o hello
[fly@752fac4b02e9 02-hello]$ ls
hello  hello.c  hello.i  hello.o  hello.s  Makefile
[fly@752fac4b02e9 02-hello]$ file hello
hello: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, not stripped

运行

通过WinSCP将编译后的程序上传到板子上,检测板子上程序的可执行权限,然后运行(如下命令行操作)。

[root@openEuler ~]# ls -l
总用量 24
drwxr-x--- 2 root root  4096  11  1970 hdc_ppc
-rw------- 1 root root 12728  526 01:15 hello
drwxr-xr-x 2 root root  4096  56 04:34 tmp
[root@openEuler ~]# chmod +x hello
[root@openEuler ~]# ./hello
hello

__FILE__: hello.c
__FUNC__: main
__LINE__: 16

3-6.I2C的测试和使用

资料

1.linux下i2c调试神器i2c-tools安装及使用_i2c调试助手-CSDN博客

2.0.91inch IIC OLED Module SSD1306 SKU:MC091GX - LCD wiki

3.Linux应用开发【第十二章】I2C编程应用开发 - 知乎 (zhihu.com)

4.【五一创作】Linux—I2C应用编程_linux i2c应用程序-CSDN博客


嵌入式开发中,有时候需要确认硬件是否正常连接,设备是否正常工作,设备的地址是多少等等,这里我们就需要使用一个用于测试I2C总线的工具——i2c-tools

i2c-tools工具是一个专门调试i2c的,开源,可获取挂载的设备及设备地址,还可以读写I2C设备寄存器

命令介绍:
	i2cdetect:检测i2c芯片
	i2cdump:查看寄存器值
	i2cget:获取单个寄存器值(8位寄存器)
	i2cset:设置单个寄存器值(8位寄存器)
参数介绍:
	-y:禁用交互模式。
	-f:强制访问设备。
	-r:写入后立即读回该值。

演示

请添加图片描述


3-7.i2c点亮OLED屏实验

0.91inch_IIC_OLED_Module_MC091GX_User_Manual_CN.pdf

硬件连线示意图

在这里插入图片描述

检测i2c从设备

通过输入如下命令,可知从设备地址为0x3C;

# 未连接I2C从设备前检测
[root@openEuler /]# i2cdetect -y -r 7
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
# 连接I2C从设备后检测
[root@openEuler /]# i2cdetect -y -r 7
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
# 查看i2c设备所有寄存器的值
[root@openEuler /]# i2cdump -y -f 7 0x3c
No size specified (using byte-data access)
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43    CCCCCCCCCCCCCCCC
10: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43    CCCCCCCCCCCCCCCC
20: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43    CCCCCCCCCCCCCCCC
30: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43    CCCCCCCCCCCCCCCC
40: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43    CCCCCCCCCCCCCCCC
50: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43    CCCCCCCCCCCCCCCC
60: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43    CCCCCCCCCCCCCCCC
70: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43    CCCCCCCCCCCCCCCC
80: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43    CCCCCCCCCCCCCCCC
90: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43    CCCCCCCCCCCCCCCC
a0: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43    CCCCCCCCCCCCCCCC
b0: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43    CCCCCCCCCCCCCCCC
c0: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43    CCCCCCCCCCCCCCCC
d0: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43    CCCCCCCCCCCCCCCC
e0: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43    CCCCCCCCCCCCCCCC
f0: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43    CCCCCCCCCCCCCCCC

数据手册

0.91寸屏驱动i2c数据手册:

SSD1306-Revision 1.5.pdf

8.1.5 MCU I2C接口

I2C通信接口包括从机地址位SA0I2C总线数据信号SDA(输出为SDAOUT/D2,输入为SDAIN/D1)和I2C总线时钟信号SCLD0)。数据信号和时钟信号都必须连接到上拉电阻。RES#用于设备的初始化。

a) 从机地址位(SA0

SSD1306在通过I2C总线发送或接收任何信息之前,必须先识别从机地址。设备将响应由从机地址位(“SA0”位)和读写选择位(“R/W#”位)跟随的从机地址,其字节格式如下:

b7 b6 b5 b4 b3 b2 b1 b0
0 1 1 1 1 0 SA0 R/W#

“SA0”位为从机地址提供扩展位。可以选择“0111100”或“0111101”作为SSD1306的从机地址。D/C#引脚作为SA0用于从机地址选择。

“R/W#”位用于确定I2C总线接口的操作模式。R/W#=1,处于读取模式;R/W#=0,处于写入模式。

b) I2C总线数据信号SDA

SDA作为发射器和接收器之间的通信通道。数据和确认都是通过SDA发送的。

应该注意的是,“SDA”引脚上的ITO轨道电阻和上拉电阻形成了一个电压分压器。因此,确认信号在“SDA”上可能无法达到有效的逻辑0电平。

SDAIN”和“SDAOUT”连接在一起作为SDA使用。“SDAIN”引脚必须连接以作为SDA使用。“SDAOUT”引脚可以断开。当“SDAOUT”引脚断开时,I2C总线中的确认信号将被忽略。

c) I2C总线时钟信号SCL

I2C总线中的信息传输遵循时钟信号SCL。每个数据位的传输都在SCL的一个时钟周期内发生。

8.1.5.1 I2C总线写数据

I2C总线接口允许向设备写入数据和命令。请参考图8-7,了解I2C总线写模式按照时间顺序的流程。
在这里插入图片描述

8.1.5.2 I2C总线写数据的流程

  1. 主设备通过起始条件启动数据通信。起始条件的定义如图8-8所示(详见数据手册)。起始条件是通过在SCL保持高电平时,将SDA高电平拉至低电平来建立的。

  2. 紧随起始条件之后的是从设备地址,用于识别。对于SSD1306,通过将SA0设置为低电平或高电平(D/C引脚作为SA0使用),从设备地址是“b0111100”或“b0111101”。

  3. 通过将R/W#位设置为逻辑“0”来建立写模式。

  4. 在接收到一个字节的数据(包括从设备地址和R/W#位)后,将生成一个应答信号。请参考图8-9了解应答信号的图形表示。应答位定义为在应答相关时钟脉冲的高电平期间,SDA线被拉低。

  5. 在发送从设备地址后,可以通过SDA发送控制字节或数据字节。控制字节主要由CoD/C#位组成,后面跟着六个“0”。
    a. 如果Co位设置为逻辑“0”,则后续传输的信息将仅包含数据字节。
    b. D/C#位确定下一个数据字节是作为命令还是数据。如果D/C#位设置为逻辑“0”,则定义下一个数据字节为命令。如果D/C#位设置为逻辑“1”,则定义下一个数据字节为要存储在GDDRAM中的数据。在每次数据写入后,GDDRAM列地址指针将自动增加1。

  6. 在接收到每个控制字节或数据字节后,将生成应答位。

  7. 当应用停止条件时,写模式将结束。停止条件也在([图8-8中定义(详见数据手册)SSD1306-Revision 1.5.pdf ](http://www.lcdwiki.com/res/MC091GX/SSD1306-Revision 1.5.pdf))。停止条件是通过在SCL保持高电平时,将“SDA输入”从低电平拉至高电平来建立的。

    请注意,数据位的传输有一些限制。

    1. 在每个SCL脉冲期间传输的数据位必须在时钟脉冲的“HIGH”周期内保持稳定状态。请参考图8-10以获得图形表示。除了在开始或停止条件下,数据线只能在SCLLOW时切换。
    2. 数据线(SDA)和时钟线(SCL)都应该通过外部电阻上拉

8.2. 命令解码器

此模块确定输入数据是被解释为数据还是命令。数据的解释基于D/C#引脚的输入。

如果D/C#引脚为高电平D[7:0]将被解释为写入图形显示数据RAM(GDDRAM)的显示数据。

如果D/C#引脚为低电平D[7:0]的输入将被解释为命令。然后,数据输入将被解码并写入相应的命令寄存器。

Demo实例代码

1.kernel.org/doc/Documentation/i2c/dev-interface

2.树莓派学习笔记——wiringPi I2C设备使用详解_wiringpii2c-CSDN博客

3.linux i2c应用程序模块-CSDN博客

4.OranggePi KunPengPro点亮IIC OLED DEMO

[fly@752fac4b02e9 i2c_oled]$ tree
.
├── demo_iic_oled.c
├── inc
│   ├── bmp.h
│   ├── delay.h
│   ├── gui.h
│   ├── iic.h
│   ├── oledfont.h
│   ├── oled.h
│   ├── test.h
│   └── type.h
├── lib
├── Makefile
└── src
    ├── delay.c
    ├── gui.c
    ├── iic.c
    ├── oled.c
    └── test.c

3 directories, 15 files
用户态读写IIC
//
static int iic_open(int adapter_nr)
{
	int fd;
	char filename[20];
    
	snprintf(filename, 19, "/dev/i2c-%d", adapter_nr);
	fd = open(filename, O_RDWR);
	if(fd < 0){
		perror("I2C Device open");
		return -1;
	}

	return fd;
}

static int i2c_write(int fd, unsigned int slave_addr, unsigned char reg_addr, unsigned char value)
{
	unsigned char outbuf[2];
	struct i2c_rdwr_ioctl_data packets;
	struct i2c_msg messages[1];

	messages[0].addr = slave_addr;
	messages[0].flags = 0;
	messages[0].len = sizeof(outbuf);
	messages[0].buf = outbuf;
	/* The first byte indicates which register we‘ll write */
	outbuf[0] = reg_addr;
	/*
	* The second byte indicates the value to write. Note that for many
	* devices, we can write multiple, sequential registers at once by
	* simply making outbuf bigger.
	*/
	outbuf[1] = value;
	/* Transfer the i2c packets to the kernel and verify it worked */
	packets.msgs = messages;
	packets.nmsgs = 1;
	if(ioctl(fd, I2C_RDWR, &packets) < 0){
		perror("Unable to send data");
		return 1;
	}

	return 0;
}

static int i2c_read(int fd, unsigned char slave_addr, unsigned char reg_addr, unsigned char *value)
{
	unsigned char inbuf, outbuf;
	struct i2c_rdwr_ioctl_data packets;
	struct i2c_msg messages[2];
	/*
	* In order to read a register, we first do a "dummy write" by writing
	* 0 bytes to the register we want to read from. This is similar to
	* the packet in set_i2c_register, except it‘s 1 byte rather than 2.
	*/
	outbuf = reg_addr;
	messages[0].addr = slave_addr;
	messages[0].flags = 0;
	messages[0].len = sizeof(outbuf);
	messages[0].buf = &outbuf;
	/* The data will get returned in this structure */
	messages[1].addr = slave_addr;
	messages[1].flags = I2C_M_RD/* | I2C_M_NOSTART*/;
	messages[1].len = sizeof(inbuf);
	messages[1].buf = &inbuf;
	/* Send the request to the kernel and get the result back */
	packets.msgs = messages;
	packets.nmsgs = 2;
	if(ioctl(fd, I2C_RDWR, &packets) < 0){
		perror("Unable to send data");
		return 1;
	}
	*value = inbuf;
	return 0;
}

//

uint32_t iic_fd;

uint32_t IIC_init(void)
{
	uint32_t fd;
	fd = iic_open(IIC_ADAPTER_NR);
	return fd;
}

/*****************************************************************************
 * @name       :void IIC_WriteCmd(uint8_t I2C_Command)
 * @date       :2018-09-14 
 * @function   :write a byte of command with iic bus
 * @parameters :I2C_Command:command to be writen
 * @retvalue   :None
******************************************************************************/
void IIC_WriteCmd(uint8_t I2C_Command)
{
	i2c_write(iic_fd, IIC_SLAVE_ADDR, IIC_COMMAND, I2C_Command);
}

/*****************************************************************************
 * @name       :void IIC_WriteDat(uint8_t I2C_Data)
 * @date       :2018-09-14 
 * @function   :write a byte of data with iic bus
 * @parameters :I2C_Data:data to be writen
 * @retvalue   :None
******************************************************************************/
void IIC_WriteDat(uint8_t I2C_Data)
{
	i2c_write(iic_fd, IIC_SLAVE_ADDR, IIC_DATA, I2C_Data);
}
Makefil文件
#CC = gcc
CC=aarch64-target-linux-gnu-gcc
CFLAGS = -g -Wall -O0
OBJS = demo_iic_oled
INCDIRS :=

INCDIRS = -I./inc

SRC = \
        demo_iic_oled.c

SRC += \
        src/iic.c \
        src/oled.c \
        src/gui.c \
        src/delay.c \
        src/test.c

$(OBJS) : $(SRC)
                $(CC) $(CFLAGS) -o $@ $^ $(INCDIRS)

clean:
                $(RM) $(OBJS) .*.sw?

演示(点亮效果)

香橙派Kunpeng Pro测评试用 | 通过IIC点亮OLED屏幕

香橙派Kunpeng Pro试用 | 通过IIC点亮OLED


后记

后续可能,还会继续探究各硬件模块和接口的功能和能力。再继续深入了解的情况,深入软件功能的探究,赋予这个丰富/强大的硬件,更灵活的软件使用。

同时,也希望和各位试用者多多交流,实现更有创意的想法。

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

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

相关文章

Android 使用 ActivityResultLauncher 申请权限

前面介绍了 Android 运行时权限。 其中&#xff0c;申请权限的步骤有些繁琐&#xff0c;需要用到&#xff1a;ActivityCompat.requestPermissions 函数和 onRequestPermissionsResult 回调函数&#xff0c;今天就借助 ActivityResultLauncher 来简化书写。 步骤1&#xff1a;创…

攻防世界[GoodRe]

攻防世界[GoodRe] 学到知识&#xff1a; 逆向的精髓&#xff1a;三分懂&#xff0c;七分蒙。TEA 算法快速识别&#xff08;蒙&#xff09;&#xff1a; 数据处理的形式&#xff1a;进入加密时的数据和加密结束后的数据&#xff0c;处理时数据的分组等等&#xff0c;都能用来…

AtCoder Beginner Contest 355 A~F

A.Who Ate the Cake?(思维) 题意 已知有三个嫌疑人&#xff0c;有两个证人&#xff0c;每个证人可以指出其中一个嫌疑人不是罪犯&#xff0c;如果可以排除两个嫌疑人来确定犯人&#xff0c;输出犯人的身份&#xff0c;如果无法确定&#xff0c;输出"-1"。 分析 …

Pytorch(Overview)

目标 如何利用pytorch完成学习系统&#xff1f; 理解神经网络&#xff08;neural networks&#xff09;和深度学习&#xff08;deep learning&#xff09;基础。 需要了解线性代数和概率论数理统计等相关关系&#xff0c;和python编程语言。 讨论理解 到底什么是human int…

vue3项目+TypeScript前端项目 ———— elemnet-plus,svg图标配置,sass,mock数据

一.集成element-plus 官网地址 安装 pnpm install element-plus 引入 // main.ts import { createApp } from vue import ElementPlus from element-plus import element-plus/dist/index.css import App from ./App.vueconst app createApp(App)app.use(ElementPlus) app.…

esp32-idf 开发踩坑记录

现象 直接使用原始命令编译idf.py build 但是提示idf 版本错误 卸载旧版本 编译出错build 问题 然后删除编译文件后&#xff0c;重新编译&#xff0c;还是出错 解决方法1 最后发现是因为项目所在文件夹有中文目录&#xff0c;把项目迁移到英文目录后&#xff0c;重新编译&a…

重学java 46.集合 ① Collection集合

事常与人违&#xff0c;事总在人为 —— 24.5.26 集合 知识导航 1.集合的特点以及作用 2.使用collection接口中的方法 3.使用迭代器迭代集合 4.ArrayList以及LinkedList的使用 5.使用增强for遍历集合 一、单列集合框架的介绍 1.长度可变的容器&#xff1a;集合 2.集合的特点 a.…

TCP/IP协议(一)

一.报文和协议 协议有什么作用&#xff1f;协议定义通信实体间所交换报文的格式和次序&#xff0c;以及在报文发送和/或接收或者其他事件方面所采取的行动(响应)。 什么是报文&#xff1f;指在网络中传输的数据单元&#xff0c;网络通讯的基本单位。&#xff08;HTTP报文、TCP报…

录屏技巧:win11怎么录屏?这5个电脑录屏方法快速了解下

无论您是想进行工作演示还是游戏直播&#xff0c;电脑录屏都有很大帮助。录制 Win 11 屏幕在很多方面都非常有效&#xff0c;因为它能让事情变得更简单。但 Win11怎么录屏呢&#xff1f;如果您仍有困惑&#xff0c;请查看本篇文章中列出的5个方法。在本文中&#xff0c;我们列出…

Python 获取当前IP地址(爬虫代理)

Python 获取当前IP地址&#xff08;爬虫代理&#xff09; 在Python中&#xff0c;获取当前的公网IP地址通常涉及到发送一个请求到外部服务&#xff0c;因为本地IP地址通常只在你的私有网络内部是可见的&#xff0c;而公网IP地址是由你的ISP&#xff08;互联网服务提供商&#x…

猫抓(cat-catch)插件的常规用法

目录 1.1、前言1.2、抓取图片资源1.3、抓取音频资源1.4、抓取视频资源 1.1、前言 本文将介绍利用猫抓&#xff08;cat-catch&#xff09;插件如下抓取网页上的图片、音频、视频等资源&#xff0c;猫抓&#xff08;cat-catch&#xff09;插件的安装及设置请参考推荐一款媒体影音…

【网络技术】【Kali Linux】Wireshark嗅探(十五)SSDP(简单服务发现协议)报文捕获及分析

往期 Kali Linux 上的 Wireshark 嗅探实验见博客&#xff1a; 【网络技术】【Kali Linux】Wireshark嗅探&#xff08;一&#xff09;ping 和 ICMP 【网络技术】【Kali Linux】Wireshark嗅探&#xff08;二&#xff09;TCP 协议 【网络技术】【Kali Linux】Wireshark嗅探&…

picamera配opencv做发现移动物体后录像50秒

本来是想配合上一篇写的测距传感器数据打开摄像头录制个50秒实时画面&#xff0c;后来这个测距传感器&#xff08;因为我是歪用&#xff0c;用来识别范围内的移动物体&#xff09;给的数据&#xff0c;false alarming还是太高了。于是想到使用本人之前深恶痛绝的opencv来试一试…

如何使用Kimi和通义千问辅助快速阅读论文

说明 上一篇博文我介绍了最新阅读的一篇TinyML的论文。我有个习惯就是使用Google Schloar跟踪当前最新的论文&#xff0c;只要在Google Schloar中设置好关键字&#xff0c;它每天就把最新的相关论文的链接和摘要发送到邮箱里面。不过现在论文太多了&#xff0c;每篇都认真读取…

分享免费的手机清理软件app,一款国外开发的手机清理神器,让手机再战两年!

手机内存越来越大&#xff0c;软件却越来越占地方&#xff0c;就像微信这家伙&#xff0c;轻轻松松就吃了十几个G&#xff01; 害得阿星8128G的手机&#xff0c;本来想换新的&#xff0c;结果用了这款Avast Cleanup软件&#xff0c;瞬间感觉手机还能再战两年&#xff01; 注意…

让大模型变得更聪明三个方向

让大模型变得更聪明三个方向 随着人工智能技术的飞速发展&#xff0c;大模型在多个领域展现出了前所未有的能力&#xff0c;但它们仍然面临着理解力、泛化能力和适应性等方面的挑战。那么&#xff0c;如何让大模型变得更聪明呢&#xff1f; 方向一&#xff1a;算法创新 1.1算…

Generative Action Description Prompts for Skeleton-based Action Recognition

标题&#xff1a;基于骨架的动作识别的生成动作描述提示 源文链接&#xff1a;https://openaccess.thecvf.com/content/ICCV2023/papers/Xiang_Generative_Action_Description_Prompts_for_Skeleton-based_Action_Recognition_ICCV_2023_paper.pdfhttps://openaccess.thecvf.c…

【云原生】kubernetes声明式管理-----YAML文件

目录 引言 一、声明式管理简介 &#xff08;一&#xff09;什么是声明式管理 &#xff08;二&#xff09;支持格式 二、YAML文件 &#xff08;一&#xff09;YAML文件基本格式 &#xff08;二&#xff09;YAML文件实践 三、YAML文件创建方式 &#xff08;一&#xff0…

TabAttention:基于表格数据的条件注意力学习

文章目录 TabAttention: Learning Attention Conditionally on Tabular Data摘要方法实验结果 TabAttention: Learning Attention Conditionally on Tabular Data 摘要 医疗数据分析通常结合成像数据和表格数据处理&#xff0c;使用机器学习算法。尽管先前的研究探讨了注意力…

2024/05/25学习记录

1、面经复习&#xff1a;前端广度 2、代码随想录刷题&#xff1a;动态规划 3、rosebush 完成input组件基础