【XR806开发板试用】基础篇,从零开始搭建一个LCD彩屏时钟(ST7735S驱动)

news2024/9/25 11:19:39

本文从搭建环境开始,step by step教大家使用XR806实现驱动SPI屏幕(ST7735S驱动),并连接WiFi实现ntp对时,最终实现把时间显示到屏幕上。
#1. 搭建开发环境

1. 安装编译环境所需的依赖包

在这里插入图片描述

基于ubuntu 20.04,按照鸿蒙官方给的开发环境搭建教程安装以下依赖包

  1. 安装repo工具:
curl -s https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > repo
chmod a+x repo
sudo mv repo /usr/local/bin/
  1. 安装request工具,如果已经安装过可以忽略:
pip3 install -i https://repo.huaweicloud.com/repository/pypi/simple requests

在这里插入图片描述

  1. 安装必要的依赖,由于要安装的包比较多,建议先更换为适合自己所在地区的最快的软件源,相关方法可以搜索“ubuntu apt 换源”。
sudo apt update
sudo apt install -y git git-lfs build-essential gcc g++ make zlib* libffi-dev e2fsprogs pkg-config flex bison perl bc openssl libssl-dev libelf-dev libc6-dev-amd64 binutils binutils-dev libdwarf-dev u-boot-tools mtd-utils gcc-arm-linux-gnueabi cpio device-tree-compiler libncurses5-dev

在这里插入图片描述

  1. 安装hb编译工具,注意这里需要指定版本0.4.3,使用新版编译工具会报错。
sudo -H python3 -m pip install ohos-build==0.4.3
  1. 安装llvm
wget https://repo.huaweicloud.com/harmonyos/compiler/clang/9.0.0-36191/linux/llvm-linux-9.0.0-36191.tar
tar -zxvf llvm-linux-9.0.0-36191.tar -C ~/
vim ~/.bashrc
###
将这句话添加到~/.bashrc末尾:
export PATH=~/llvm/bin:$PATH
然后:wq回车保存退出
###
source vim ~/.bashrc

##2. 下载源码,按照官方给的下载方法操作即可
1. 首先创建一个文件夹用于接收源码,并作为之后编译工程的目录

mkdir xr806_openharmony
cd xr806_openharmony
  2. 然后将git的用户配置自己的gitee用户名和邮箱       
git config --global user.name "yourname"
git config --global user.email "your-email-address"
git config --global credential.helper store
  3. 接着初始化代码仓库
repo init -u https://gitee.com/openharmony-sig/manifest.git -b OpenHarmony_1.0.1_release --no-repo-verify -m devboard_xr806.xml

先不要着急同步代码,由于鸿蒙官方仓库暂时无法下载xr806的设备代码,需要修改代码同步配置文件指向备份下载仓库,使用文件管理器打开以下代码配置文件

gedit ~/xr806_openharmony/.repo/manifests/devboard_xr806.xml

定位到第5行,插入一行新的配置

在这里插入图片描述

定位到第34行,将sig修改为sig2

在这里插入图片描述

  定位到第116行,同样将sig修改为sig2

在这里插入图片描述

保存以上修改好的文件。

 4. 开始同步下载代码,该过程大约需要6分钟,可以去喝口茶休息一会.
repo sync -c
repo forall -c 'git lfs pull'

在这里插入图片描述

 5. 下载完代码后测试hb编译工具是否可行,在代码根目录输入hb -
    ,会有以下提示:

在这里插入图片描述
##3. 下载编译工具链:使用浏览器下载以下文件

https://developer.arm.com/-/media/Files/downloads/gnu-rm/10-2020q4/gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2

下载完成后解压放到~/tools文件夹内:

mkdir ~/tools
tar -jxvf gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2 -C ~/tools

在这里插入图片描述

#2. 执行首次编译,初始化编译环境

#(1)进入原生SDK目录
cd device/xradio/xr806/xr_skylark
#(2)复制配置文件
cp project/demo/audio_demo/gcc/defconfig .config
#(3)图形化界面配置
make menuconfig
#(4)清除旧配置
make build_clean
#(5)根据配置生成静态库和全局头文件
make lib -j
#(6)返回Harmony根目录
cd -
#(7)选择wifi_skylark
hb set
#(8)编译,后续不需要重新配置
hb build -f

(3)图形化界面配置
make menuconfig
在这里插入图片描述

(7)选择wifi_skylark
hb set
在这里插入图片描述

(8)编译,后续不需要重新配置
hb build -f
在这里插入图片描述

#3. 屏幕与开发板之间的连接:

编号屏幕端开发板端
1VCC3V3
2GNDGND
3CSPB6
4RESETPB15
5A0PB14
6SDAPB4
7SCKPB7
8LEDPB3
LCD屏幕:ST7735S
1.VCC---3V3
2.GND---GND
3.CS ---PB06
4.RESET---PB15
5.DC(A0)---PB14
6.MOSI(SDA)---PB04
7.CLK(SCK)---PB07
8.LED---PB03

在这里插入图片描述
在这里插入图片描述

#4. 编写我们的代码
##1. 创建一个工程
首先进入ohosdemo文件夹,新建一个工程文件夹lcd_weather_clock,并配置好ohosdemo中的BUILD.gn,添加我们新建的工程lcd_weather_clock。

cd ~/xr806_openharmony/device/xradio/xr806/ohosdemo
mkdir lcd_weather_clock
gedit BUILD.gn

其中 ~/xr806_openharmony/device/xradio/xr806/ohosdemo/BUILD.gn 主要内容如下(篇幅有限省略前面的注释):

group("ohosdemo") {
    deps = [
        #"hello_demo:app_hello",
        #"iot_peripheral:app_peripheral",
        #"wlan_demo:app_WlanTest",
        "lcd_weather_clock:app_lcd_weather_clock",
    ]
}

进入新建的工程文件夹,新建include文件夹用于存放头文件(.h),新建src文件夹用于存放源文件(.c),新建BUILD.gn

cd lcd_weather_clock
mkdir include
mkdir src
gedit BUILD.gn

其中 /home/starsky/xr806_openharmony/device/xradio/xr806/ohosdemo/lcd_weather_clock/BUILD.gn 主要内容如下(篇幅有限省略前面的注释):

import("//device/xradio/xr806/liteos_m/config.gni")

static_library("app_lcd_weather_clock") {
   configs = []

   sources = [
      "src/main.c",
      "src/my_wifi.c",
      "src/st7735s.c",
   ]

   cflags = board_cflags

   include_dirs = board_include_dirs
   include_dirs += [
        "//kernel/liteos_m/kernel/arch/include",
        "include",
        "//utils/native/lite/include",
            "//foundation/communication/wifi_lite/interfaces/wifiservice",
        "//base/iot_hardware/peripheral/interfaces/kits",
        "//device/xradio/xr806/xr_skylark/include/net/sntp",
   ]
}

##2. 编写代码实现相应的功能
该代码主要实现驱动ST7735S屏幕,连接到指定的WiFi,设定sntp服务器并自动对时,然后将时间和日期显示到LCD显示屏幕上。由于篇幅有限此处不展示所有代码,只对关键代码进行说,完整代码与工程文件参考文末的gitee仓库地址。

####1.SPI初始化代码
注意SPI频率以及模式的设定

static void spi_init(void)
{
	printf("spi_init started.\r\n");

	SPI_Global_Config spi_param;

	spi_param.cs_level = 0;
	spi_param.mclk = (48 * 1000 * 1000);

	HAL_SPI_Init(SPI0, &spi_param);

	SPI_Config spi_Config;
	HAL_Status ret = HAL_OK;

	spi_Config.firstBit = SPI_TCTRL_FBS_MSB; //
	//SPI_LITTLEENDIAN;//第一字节 SPI_LITTLEENDIAN,SPI_BIGENDIAN
	spi_Config.mode = SPI_CTRL_MODE_MASTER;
	//SPI_MODE_MASTER;//SPI_MODE_SLAVE 从,SPI_MODE_MASTER 主
	spi_Config.opMode = SPI_OPERATION_MODE_POLL;
	spi_Config.sclk = (24 * 1000 * 1000);
	spi_Config.sclkMode = SPI_SCLK_Mode0;

	printf("spi open...\r\n");
	ret = HAL_SPI_Open(SPI0, SPI_TCTRL_SS_SEL_SS0, &spi_Config, 5000);
	if (ret != HAL_OK)
	{
		printf("spi open failed");
		return;
	}
	HAL_SPI_Config(SPI0, SPI_ATTRIBUTION_IO_MODE, SPI_IO_MODE_NORMAL);
	printf("spi demo over.\r\n");
	return;
}

####2. GPIO初始化函数
注意,这里设定GPIO的模式以及设定GPIO输出电平必须要使用HAL库的函数,使用IoTGpioInit类函数无法正常驱动屏幕。

static void gpio_init(void)
{
    GPIO_InitParam param;
    param.driving = GPIO_DRIVING_LEVEL_1;
    param.mode = GPIOx_Pn_F1_OUTPUT;
    param.pull = GPIO_PULL_NONE;
    HAL_GPIO_Init(GPIO_PORT_A, GPIO_PIN_21, &param);//led灯对应IO
    
    HAL_GPIO_Init(GPIO_PORT_B, GPIO_PIN_15, &param);//OLED RES
    HAL_GPIO_Init(GPIO_PORT_B, GPIO_PIN_14, &param);//OLED DC
	HAL_GPIO_Init(GPIO_PORT_B, GPIO_PIN_3, &param);//OLED LED
	HAL_GPIO_WritePin(GPIO_PORT_B,GPIO_PIN_3,GPIO_PIN_HIGH);
	HAL_GPIO_WritePin(GPIO_PORT_A, GPIO_PIN_21,GPIO_PIN_HIGH);

	IoTGpioSetIsrMode(KEY1_PIN, IOT_INT_TYPE_EDGE, IOT_GPIO_EDGE_FALL_LEVEL_LOW);
	IoTGpioRegisterIsrFunc(KEY1_PIN, IOT_INT_TYPE_EDGE, IOT_GPIO_EDGE_FALL_LEVEL_LOW, IotGpioIrq, 0);
}

####3.设定sntp服务器以及显示日期与时间


struct sntp_arg{
	char *server_name;    /* remote server name, if this is not NULL, this will be preferred. */
	int recv_timeout;     /* the receive timeout from ntp server */
	uint8_t retry_times;  /* the retry times when receiver timeout */
};
static void MainThread(void *arg)
{
	struct timeval tv;
    struct tm *my_tm;
	struct sntp_arg ntp_arg;
	char ntp_server_name[24] = "time1.aliyun.com";
	char lcd_buffer[64] = {0x00};
    setenv("TZ", "CST-8", 1);
    tzset();
	printf("MainThread start\r\n");
	wifi_device_connect();
	
	ntp_arg.server_name = ntp_server_name;
	ntp_arg.recv_timeout = 100;
	ntp_arg.retry_times = 3;
	sntp_set_server(0,ntp_server_name);
	sntp_get_time(&ntp_arg, &tv);
	gpio_init();
	spi_init();
	LCD_Init();
	printf("after lcd_init\r\n");
	sntp_get_time(&ntp_arg, &tv);
	settimeofday(&tv, "CST-8");
	LCD_Clear(LIGHTBLUE);
	BACK_COLOR = LIGHTBLUE;
	while (1)
	{
		POINT_COLOR = GREEN;
		gettimeofday(&tv, NULL);
        my_tm = localtime(&(tv.tv_sec));
        strftime(lcd_buffer, sizeof(lcd_buffer), "%F %a", my_tm);
		LCD_Fill(1, 1, 128,20,BACK_COLOR);
        LCD_ShowString(1, 1, 16,(uint8_t *)lcd_buffer );
        strftime(lcd_buffer, sizeof(lcd_buffer), "%T", my_tm);
		LCD_Fill(1, 20, 80,40,BACK_COLOR);
        LCD_ShowString(1, 20, 16, (uint8_t *)lcd_buffer);
		if(my_tm->tm_hour%6 == 0 && my_tm->tm_sec==0)
		{
			// 每隔6小时执行一次对时
			sntp_get_time(&ntp_arg, &tv);
			settimeofday(&tv, "CST-8");
		}
		OS_MSleep(500);
	}
}

####4.设定WiFi账号与密码
请修改my_wifi.c开头的宏定义为自己的WiFi账号密码。

#5. 编译并烧录
##1.编译固件
执行以下命令,当没有报错的时候就是编译成功。

cd ~/xr806_openharmony
hb build -f

在这里插入图片描述

##2.接线
将开发板按照上述GPIO口定义连接好屏幕,并使用数据线将开发板连接到电脑
执行 ls /dev/ttyUSB* 查看连接是否成功。
在这里插入图片描述

执行以下命令将当前用户加入串口所在的组,以获取串口的读写权限。

sudo usermod -a -G dialout $USER

执行完成后需要重启系统生效,重启前注意保存自己打开的文档等工作内容。

如果不想重启,也可以使用以下命令赋予用户读写串口权限。

sudo chmod 0777 /dev/ttyUSB0 

##3.设置下载工具的配置
进入下载固件的工具目录

cd ~/xr806_openharmony/device/xradio/xr806/xr_skylark/tools
gedit settings.ini

主要修改两处,1是usb转串口的路径,修改为上面查询到的,2是存放编译好的固件的位置。

strComDev = /dev/ttyUSB0
strImagePath = ../out/xr_system.img

修改完成后保存。
在这里插入图片描述

##4.开始下载
执行命令 ./phoenixMC
在这里插入图片描述

当看到 100%: Upgrade OK! 表明下载已经成功,可以按下开发板的复位键或者直接拔插一下开发板的USB数据线让开发板复位重新上电,即可运行我们的程序。
在这里插入图片描述

#6. 附上工程文件下载地址
gitee工程文件链接
#7. 参考文章
实现本工程除了参考官方历程,还参考了以下作者的代码,在此表示感谢!
【XR806开发板试用】SPI外设使用&&驱动OLED显示
【XR806开发板试用】实时时钟

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

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

相关文章

第十二周 5.20 面向对象的三大特性(封装、继承、多态)(一)

一、封装 1.目前的程序无法保证数据的安全性、容易造成业务数据的错误 2.private:私有的,被private修饰的内容只能在本类中访问 3.为私有化的属性提供公开的get和set方法 (1)get方法,获取私有化属性的值: public 返回值类型 get属性名…

第十三周 5.27面向对象的三大特性(封装、继承、多态)(三)

3.instanceof避免类型转换异常: (1)语法:引用名 instanceof 类名 (2)执行:判断引用中存储的实际对象类型是否兼容于后面的类型(是否为后面类型的一种),兼容一true,不兼容—false (3)作用:可以在程序设计中避免类型转换异常 直接使用案例…

电磁辐射仿真软件CST的材料概述【仿真入门】

材料概述(1) CST中提供的各种材料! 下面介绍一下,CST中可以设置的材料属性。 -PEC是Perfect Electric Conductor的缩写,表示没有Loss的理想导体。 -Normal基本的材料模型,一般多用于介质(Dielectric)材料定义。 -Anisotropic…

M-A352AD在桥梁/建筑结构健康监测中的应用

钢筋混凝土的面世,使人类基建迈进了新的阶段,大规模的桥梁和高楼大厦拔地而起。随之而来的,就是对其安全的忧虑。因此,我们需要对其结构安全健康进行监测,以保证行恰当的维护和提前发现隐患。桥梁/建筑结构健康监测是以…

重庆耶非凡科技有限公司有选品师项目培训吗?

在当今科技飞速发展的时代,各种科技公司如雨后春笋般涌现,它们在不同领域发挥着重要作用。其中,重庆耶非凡科技有限公司以其独特的业务模式和专业服务,在业界赢得了良好的口碑。那么,重庆耶非凡科技有限公司究竟是做什…

Softing线上研讨会 | 使用Softing smartLink SW-HT将AB PLC下的HART设备连接到艾默生AMS设备管理器

| (免费) 线上研讨会时间:2024年6月25日 14:00~14:45 / 22:30~23:15 艾默生AMS设备管理器凭借其全面功能、优秀诊断能力、兼容性以及远程监控和管理功能,在过程工业中被证明是一款先进的工厂资产管理工具,可用于设备配置、诊断和监控、仪表校…

HCIE vs CCIE:网络界的巅峰对决,你选谁?

在网络工程领域,HCIE和CCIE是两个都属于是顶级认证。 作为网络工程师,你可能在选择认证时面临困惑。那么,HCIE和CCIE到底有什么区别?哪个更适合你? 今天,我们来一场巅峰对决,看看这两大认证的…

c++——模板初始识

1.函数模板 我们经常用到Swap函数交换两个值。由于需要交换的数据的类型不同,我们就需要写不同参数类型的同名函数,也就是函数重载: 然而这三个函数的逻辑是一样的,写这么多有些多此一举,通过函数模版可以写一个通用…

文献解读-群体基因组第一期|《对BMI的影响:探究BMI的基因型-环境效应》

关键词:应用遗传流行病学;群体测序;群体基因组;基因组变异检测; 文献简介 标题(英文):The Impact of ACEs on BMI: An Investigation of the Genotype-Environment Effects of BMI标…

民国漫画杂志《时代漫画》第28期.PDF

时代漫画28.PDF: https://url03.ctfile.com/f/1779803-1248635321-5c67ad?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了,截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!

Vue中使用Vue-scroll做表格使得在x轴滑动

页面效果 首先 npm i vuescroll 在main.js中挂载到全局 页面代码 <template><div class"app-container"><Header :titletitle gobackgoBack><template v-slot:icon><van-icon clickgoHome classicon namewap-home-o /></templat…

svix - webhooks

文章目录 一、关于 SvixClient Library Overview与 Svix 托管服务的区别 二、运行服务器1、部署1.1 Docker1) 使用 Docker Compose2) 独立容器 1.2 预编译的二进制文件1.3 从源代码构建 2、运行时依赖项3、Redis/Valkey 注意事项持久性 Eviction 政策4、服务器配置4.1 配置文件…

【探索数据之美】“从基础到精通——深入解析数据结构与二叉树的秘密“

gitee代码获取链接&#xff1a;https://gitee.com/flying-wolf-loves-learning/data-structure.git 一、树的概念 1.1 概念简述 数据结构中的树是一种层次结构&#xff0c;它由节点&#xff08;node&#xff09;和边&#xff08;edge&#xff09;组成。每个节点都有零个或多…

微服务-Nacos-安装-集成SpringBoot

微服务-SpringCloud-ALibaba-Nacos Nacos 是阿里巴巴推出的 SpringCloud的组件 官网:什么是 Nacos 主要是为了解决微服务的架构中 服务治理的问题服务治理就是进行服务的自动化管理&#xff0c;其核心是服务的注册与发现。 服务注册&#xff1a;服务实例将自身服务信息注册…

用友GRP-U8 sqcxIndex.jsp SQL注入漏洞(XVE-2024-12560)

声明&#xff1a; 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 简介 用友GRP-U8是用友公司专注于国家电子政务事业&#…

使用 Spring HATEOAS 开发 REST 服务-浅显的理解

随笔&#xff0c;简单理解 一、restful是什么 1、第一层次&#xff08;Level 0&#xff09;的 Web 服务只是使用 HTTP 作为传输方式&#xff0c;实际上只是远程方法调用&#xff08;RPC&#xff09;的一种具体形式。 SOAP 和 XML-RPC 都属于此类 2、第二层次&#xff08;Lev…

三坐标测量机在汽车零部件质量控制中的应用

高质量的零部件能够确保汽车的性能达到设计标准&#xff0c;包括动力性能、燃油效率、操控稳定性等&#xff0c;从而提供更好的驾驶体验&#xff0c;建立消费者对汽车品牌的信任&#xff1b;也推动了汽车行业的技术创新&#xff0c;制造商不断研发新材料、新工艺&#xff0c;以…

汽车制造业安全有效的设计图纸文件外发系统是什么样的?

在汽车制造的世界里&#xff0c;那些设计图不仅仅是公司智慧的闪光点&#xff0c;更是它们竞争的秘密武器。但问题来了&#xff0c;当公司需要和供应商、合作伙伴频繁交换数据时&#xff0c;怎样安全又高效地发送这些设计图&#xff0c;就成了一个头疼的问题。这篇文章会深挖一…

图解 BERT 模型

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学. 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总合集&…

go使用letteravatar生成圆形透明头像图标

官网地址&#xff1a;GitHub - disintegration/letteravatar: Letter avatar generation for Go 我对其中函数改了一下&#xff0c;支持多个字符&#xff0c;效果如下&#xff1a; func TestCreateAvatar(t *testing.T) {GenerateAvatar("Bird Fish", 0, "Bird…