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

本文从搭建环境开始,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_cflagsinclude_dirs = board_include_dirsinclude_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_BIGENDIANspi_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灯对应IOHAL_GPIO_Init(GPIO_PORT_B, GPIO_PIN_15, &param);//OLED RESHAL_GPIO_Init(GPIO_PORT_B, GPIO_PIN_14, &param);//OLED DCHAL_GPIO_Init(GPIO_PORT_B, GPIO_PIN_3, &param);//OLED LEDHAL_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.rhkb.cn/news/333817.html

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

相关文章

【高阶数据结构(七)】B+树, 索引原理讲解

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:高阶数据结构专栏⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多数据结构   🔝🔝 高阶数据结构 1. 前言2. B树讲解…

【Web】CISCN 2024初赛 题解(全)

目录 Simple_php easycms easycms_revenge ezjava mossfern sanic Simple_php 用php -r进行php代码执行 因为ban了引号,考虑hex2bin,将数字转为字符串 php -r eval(hex2bin(16进制)); 注意下面这段报错,因为加不了引号,开…

【网络原理】HTTPS详解

一.HTTPS的相关基本概念 HTTPS:由于HTTP协议内容都是按照文本的方式明文传输的. 这就导致在传输过程中出现一些被篡改的情况. 可能会出现运营商劫持,黑客入侵等不利影响, 因此就引入了HTTPS,其本质上就是在HTTP协议的基础上,引入了一个加密层SSM.什么是运营商劫持? 例如我们要…

【服务器报错】Pycharm运行服务器代码提示 can‘t open file “本地文件路径“

1. 问题 Pycharm连接远程服务器,代码已经同步,运行时候报错 #模拟报错 bash: line 0: cd: G:/python/hhh/Hi: No such file or directory /home/hhh/anaconda3/envs/hard/bin/python: cant open file G:/python/hhh/hi/hei.py: [Errno 2] No such file…

SpringBootTest测试框架五

示例 package com.xxx;import com.xxx.ut.AbstractBasicTest; import com.xxx.ut.uttool.TestModel; import com.xxx.ut.uttool.TestModelEnum; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired;public class QueryXXXImp…

Keras深度学习框架第二十讲:使用KerasCV中的Stable Diffusion进行高性能图像生成

1、绪论 1.1 概念 为便于后文讨论,首先进行相关概念的陈述。 Stable Diffusion:Stable Diffusion 是一个在图像生成领域广泛使用的技术,尤其是用于文本到图像的转换。它基于扩散模型(Diffusion Models),这…

软件测试金字塔,对号入座,你在哪层?

自从学习了软件测试,脑袋也清晰了,目标也明确了,就是不知道学到哪里了.中间有很多的困难也有很多成就感,你目前在那个阶段呢? 初级测试工程师 技能要求:需求分析,使用等价类边界值等方法进行用例设计,执行功能测试,发现提交跟踪bug,使用禅道,会在测试中会操作数据库进行检查和…

Android Activity 设计详解

文章目录 Android Activity 设计说明1. Activity 的生命周期2. Activity 的启动模式3. Activity 的通信4. Activity 的布局和视图管理5. Activity 的配置变化处理6. Activity 的保存和恢复状态7. Activity 的任务和返回栈 总结 Android Activity 设计说明 在 Android 中&#…

css3 笔记02

目录 01 过渡 02 rotate旋转 03 translate函数 04 真正的3D 05 动画 06 阴影 07 自定义字体库 08 自定义动画库 01 过渡 过渡属性的使用: transition-property:要过渡的css属性名 多个属性用逗号隔开 过渡所有属性就写all transition-duration: 过渡的持续时间 s秒 …

万博智云×华为云 | HyperBDR云容灾上架,开启联营联运新篇章

日前,万博智云HyperBDR云容灾正式入驻华为云云商店,成为华为云基础软件领域联营联运合作伙伴。通过联营联运,双方将进一步加深在产品、解决方案、渠道拓展等多方面的强强联合,为企业提供更加安全、高效的数据保护解决方案&#xf…

力扣503. 下一个更大元素 II

Problem: 503. 下一个更大元素 II 文章目录 题目描述思路复杂度Code 题目描述 思路 由于此题是环形数组,我们在利用单调栈模板的基础上还需要将给定数组扩大一倍,但实际上我们只需要利用取余的操作模拟扩大数组即可(具体操作看代码。在解决有…

【简单介绍下容器是什么?】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

c++ (命名空间 字符串)

思维导图&#xff1a; 定义自己得命名空间myspace,在myspace中定义string类型变量s1,再定义一个函数完成字符串逆置 #include <iostream> #include <cstring> //定义自己得命名空间myspace,在myspace中定义string类型变量s1,再定义一个函数完成字符串逆置 using n…

python 办公自动化-生成ppt文本和图

最终样式 代码实现 # 可编辑折线+写入文字 成功 # 问题: 设置字体类型和加粗和字体为微软雅黑,是只改了字母和数字的字体,中文没变化 pip install pptx_ea_font 这个库可以解决这个问题 import pandas as pd import pptx_ea_font import matplotlib.pyplot as plt from pp…

社交媒体数据恢复:云叙

在使用云盘的过程中&#xff0c;由于误操作或其他原因&#xff0c;我们可能会遇到数据丢失的问题。了解云盘数据恢复的原理和技巧对于确保云盘数据安全非常重要。接下来&#xff0c;我将为您提供一份关于云盘数据恢复的教程。 一、文件恢复 当您发现文件丢失或损坏后&#xff0…

Wpf 使用 Prism 实战开发Day26

首页待办事项编辑和完成以及备忘录编辑功能 当用户双击待办事项或备忘录的时候&#xff0c;希望能进行编辑待办事项及备忘录的功能 一.在IndexView.xaml 视图&#xff0c;为待办和备忘录添加双击编辑功能 1.首先引入一个 behaviors 命名空间&#xff0c;用于进行处理鼠标双击…

K8S认证|CKA题库+答案| 14. 排查故障节点

目录 14、排查集群中的故障节点 CKA v1.29.0模拟系统 下载试用 题目&#xff1a; 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、查看节点状态 ​3&#xff09;、登录故障节点并提权 4&#xff09;、检查kubelet状态 5&#xff09;、 修复kubelet进程…

实现按块复制元素的进阶技巧

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、按块复制元素的重要性 二、使用LED模块创建数组并复制 三、实现按块复制的具体步骤 四…

隆道专属商城 | 助力企业跨平台整合优势资源,解决采购寻源比价难题!

数字化采购时代&#xff0c;企业面临着日益激烈的市场竞争&#xff0c;如何优化资源配置、降低采购成本、提高采购效率成为企业追求的核心目标。当前&#xff0c;网上商城凭借其强大的供应链资源整合能力&#xff0c;为企业内部采购商城的搭建提供了独特的优势&#xff0c;已然…

Qt自定义标题栏

效果如下&#xff1a; 代码如下&#xff1a; // widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr…