单片机---HLK-W801图形框架LVGL下开发(五)

2023-10-10 02:10

本文主要是介绍单片机---HLK-W801图形框架LVGL下开发(五),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前文回顾

《单片机—HLK-W801并口驱动ST7789》
《单片机—HLK-W801驱动触摸屏》
《单片机—HLK-W801图形框架LVGL移植》
《单片机—HLK-W801图形框架LVGL下开发(一)》
《单片机—HLK-W801图形框架LVGL下开发(二)》
《单片机—HLK-W801图形框架LVGL下开发(三)》
《单片机—HLK-W801图形框架LVGL下开发(四)》

2022年3月24日效果,增加了汉化,APP包括温湿度,计算器,wifi连接,在wifi连接状态下,能够进行NTP时间同步及查询天气。

海凌科w801开发的单片机主机


前面由于转移到w801上,SRAM明显吃紧,连喜欢的背景图都放不下了,感觉很是可惜啊,这次就想着扩展一下图片存储。

在这里插入图片描述

本章重点

好几天都没更新了,主要是这几天等SD卡座,然后重新规划了一下这块开发板的引脚,最终重新规划后,只剩下了两个引脚没有用了。
买了SD卡座,就是为了今天的学习,学习一下文件系统和lvgl中使用文件作为多媒体素材的来源,例如图标,背景图片等等,因为总是用c文件来存这些东西,最终会把你的sram给装满,尽管它很容就装满了,一共才两百多kb。
为甚用SD做为扩展文件系统的方式,因为w801的demo中就提供了SDIO的文件读写demo,方便的紧。
然后配合lvgl直接读取图像,那就灵活多了。
后续结果……喜忧参半,咱们慢慢分解。
在这里插入图片描述

SDIO接口

卡座来了
在这里插入图片描述

W801上就提供了SDIO接口,正好对应的就是下面的引脚
在这里插入图片描述
对接好引脚,就可以用demo测试一下读写卡了,

demo中的意外

demo很简单,但是也很重要,这个通过了,才有下一步

int fatfs_func(void)
{FATFS fs; //FatFs文件系统对象FIL fnew; //文件对象FRESULT res_sd;//文件操作结果UINT fnum; //文件成功读写数量BYTE ReadBuffer[256] = {0};BYTE work[FF_MAX_SS];BYTE WriteBuffer[] = "成功移植了FatFs文件系统!\r\n"; //写缓存区wm_sdio_host_config(0);//挂载SD卡res_sd = f_mount(&fs, "0:", 1);//***********************格式化测试****************************if(res_sd == FR_NO_FILESYSTEM){while(1){TEST_DEBUG("SD卡没有文件系统,即将进行格式化...\r\n");//格式化res_sd = f_mkfs("0:", 0, work, sizeof(work));if(res_sd == FR_OK){TEST_DEBUG("SD卡成功格式化!\r\n");//格式化后先取消挂载res_sd = f_mount(NULL, "0:", 1);//再重新挂载res_sd = f_mount(&fs, "0:", 1);break;}else{TEST_DEBUG("文件格式化失败!错误代码:%d; will try again...\r\n",res_sd);}}}else if(res_sd != FR_OK){TEST_DEBUG("挂载文件系统失败!可能是因为文件初始化失败!错误代码:%d\r\n", res_sd);}else{TEST_DEBUG("文件系统挂载成功, 可进行读写测试!\r\n");}//***********************写测试****************************//打开文件,如果文件不存在则创建它TEST_DEBUG("即将进行文件写入测试....\r\n");//打开文件,若不存在就创建res_sd = f_open(&fnew, "0:FatFs读写测试文件.txt", FA_CREATE_ALWAYS | FA_WRITE);//文件打开成功if(res_sd == FR_OK){TEST_DEBUG("打开文件成功!开始写入数据!\r\n");res_sd= f_write(&fnew, WriteBuffer, sizeof(WriteBuffer), &fnum);if(res_sd == FR_OK){TEST_DEBUG("数据写入成功,共写入%d个字符!\r\n", fnum);TEST_DEBUG("数据:%s", WriteBuffer);}else{TEST_DEBUG("数据写入失败!\r\n");}//关闭文件f_close(&fnew);}//***********************读测试****************************//打开文件,如果文件不存在则创建它TEST_DEBUG("即将进行文件读取测试....\r\n");//打开文件,若不存在就创建res_sd = f_open(&fnew, "0:FatFs读写测试文件.txt", FA_OPEN_EXISTING | FA_READ);//文件打开成功if(res_sd == FR_OK){TEST_DEBUG("打开文件成功!开始读取数据!\r\n");res_sd= f_read(&fnew, ReadBuffer, sizeof(ReadBuffer), &fnum);if(res_sd == FR_OK){TEST_DEBUG("数据读取成功!\r\n");TEST_DEBUG("数据:%s\r\n", ReadBuffer);}else{TEST_DEBUG("数据读取失败!\r\n");}//关闭文件f_close(&fnew);}//取消挂载文件系统f_mount(NULL, "0:", 1);return 0;
}

这里的重点是wm_sdio_host_config(0);
这里我用的是w801,所以参数要修改为1,进去看一眼就知道了,就一眼啊,看第二眼就输了
在这里插入图片描述

意外又发生了

这个SDIOdemo程序一编译,立马就差点又炸了rodata部分。
rodata,主要就是一些const的常量数组,他们会静静的放在sram中,直到被访问,这件事还是通过跟家里的姐姐姐夫聊天聊到的,问了这些事情,说const的变量,到底是放在哪里,最后姐夫说,这些东西,可以在编译过后的记录文件中查看到,可以看到哪些内容占据了哪些位置。姐夫是单片机开发多年的专业人士,一语点醒我这个梦中人,其实我对单片机也就是爱好,纯纯业余。

我就在想,这个CDK也会有这种文件,果然一下就在fls文件旁边发现了这个map文件
在这里插入图片描述
里面就可以看到rodata占据了多大,后面还可以详细查看到哪个变量占据了多大控件
在这里插入图片描述
真是学无止境
在这里插入图片描述

读卡中的意外

说回这个文件读写,我这里有好几张microSD卡,但是只有一张能读出来,并初始化成功,然后能够写入文件读取文件。

有一张挂载,报错3
在这里插入图片描述
能用的那一张,一开始初化好之后,就开始用了起来,后来拷贝了几张图片进去,就又失败了。
然后再次格式化就不行了。

还有一张好像一开始不行,后来偶尔就又可以了。总之就是许多意外情况了。通过各种百度之后得到的结论是,底层不行。
在这里插入图片描述

重点来了

- 挂载失败问题解决

虽然到现在还是只有一张正常,一张读文件一会看不到后缀,一会名字错误,就感觉很神奇,不过所有的卡,在windows下的读卡器上都能正常工作。

原因1,时序问题,也就是底层读卡的问题,这里改了一点,就是用了1bit的方式传输数据,这里
在这里插入图片描述
改为0,表示走1bit的方式传输数据,
这里应该还可以配置一下,我这还没研究透彻这些寄存器的值,惭愧啊,不过希望后面有人能悟透,给我留个言,
在这里插入图片描述
另外还有网上找到的资料,解释挂载失败或者初始化失败的问题
在这里插入图片描述

- rodata爆炸

这里就需要去看一下到底谁吃掉了sram,一下就发现了两个超级大的const数组,原来是用来支持字符转化的,关键宏定义就是长文件名LFN
在ffconf.h中,这个宏定义要注意下在这里插入图片描述
单片机这点存储,可以容不下这尊大佛。

在这里插入图片描述

跟这个系列有关吗

其实我搞这个SD卡,再搞这个文件系统,其实就是为了lvgl的文件使用做准备,下一章介绍lvgl中使用文件显示图片。
预热一下。先放个背景图,熟悉《黑客帝国》的老人家可能见过这个背景。
在这里插入图片描述
图片列表
在这里插入图片描述
图片浏览
在这里插入图片描述

结束语

明天就要放假了,可惜还是无法大范围移动。
看到很多大三的学生在吐槽,自己的大学生活,疫情占了两年,也是挺惨的,还是抓紧时间好好学习吧。请添加图片描述
不过我每天还能有时间,陪陪老婆孩子,也算是很幸福了,可能过两年就会变成双城生活,还是得珍惜眼前的每一天陪伴。
请添加图片描述

这篇关于单片机---HLK-W801图形框架LVGL下开发(五)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/177181

相关文章

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二

Java 缓存框架 Caffeine 应用场景解析

《Java缓存框架Caffeine应用场景解析》文章介绍Caffeine作为高性能Java本地缓存框架,基于W-TinyLFU算法,支持异步加载、灵活过期策略、内存安全机制及统计监控,重点解析其... 目录一、Caffeine 简介1. 框架概述1.1 Caffeine的核心优势二、Caffeine 基础2

基于Go语言开发一个 IP 归属地查询接口工具

《基于Go语言开发一个IP归属地查询接口工具》在日常开发中,IP地址归属地查询是一个常见需求,本文将带大家使用Go语言快速开发一个IP归属地查询接口服务,有需要的小伙伴可以了解下... 目录功能目标技术栈项目结构核心代码(main.go)使用方法扩展功能总结在日常开发中,IP 地址归属地查询是一个常见需求:

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模