项目背景 本项目是【RT-Thread x RISC-V 应用创新大赛】参赛项目之一 项目简介本项目解决了什么问题? 本项目有什么创新点(实现了哪些功能)? 硬件部分本项目主要包括五个硬件模块: AB32VG1开发板,作为主控制器控制其他外设; ESP8266 WiFi模块,用于联网获取时间和实时天气信息; 微雪的Arduino墨水屏扩展板,用于驱动墨水屏,同时带有一个128KB的SPI RAM芯片(用于作为显存),和一个T-Flash卡槽(没用到); 4.2英寸三色墨水屏,分辨率400x300,用于显示画面,一帧画面至少需要占用45KB 内存(400 x 300 x 3 / 8 = 45000); W25Q128闪存模块,容量16MB,用于存储中文字体,以及阳历和农历的对应关系;
硬件模块间连接五个硬件模块之间的整体连接关系如下图: 开发板引脚分配开发板和外设的引脚连接关系(电源部分): 主要使用到的资源,以及开发板和外设的引脚连接关系(控制部分): 具体使用情况说明: 1、RTC 2、UART1 3、SPI1 4、GPIO 连接墨水屏扩展板上的RAM_CS,用于输出SRAM的片选信号 连接墨水屏扩展板上的EPD_CS,用于输出墨水屏的片选信号; 连接墨水屏扩展板上的EPD_DC,用于输出墨水屏的数据/命令信号; 连接墨水屏扩展板上的EPD_RST,用于输出墨水屏的复位信号; 连接墨水屏扩展板上的EPD_BUSY,用于墨水屏的繁忙状态的输入; 连接W25Q128模块的CS,用于输出闪存芯片的片选信号; 开发板自带的三个按键,用于作为输入按键;
5、3V3/GND 软件部分本项目的软件部分基于RT-Thread物联网操作系统,除了本项目开发的业务逻辑代码外,还使用了一些RT-Thread 内核API、一些RT-Thread软件包,以及一些三方组件,下面分别介绍。 主代码仓:https://gitee.com/swxu/e-calender.git 下载命令:git clone --recursive https://gitee.com/swxu/e-calender.git 部分组件通过git submodule引用了其他代码仓,具体见.gitmodules文件; 组件框图软件各部分的组件框图如下: 业务代码本项目开发的业务代码位于applications目录下,具体文件功能如下(大部分是.c和.h两个文件): amap_location_api 高德定位和搜狐IP查询API对接; amap_weather_api 高德天气预报API对接; chinese_date_api 农历查询API对接; flash_init.c 闪存分区挂载(依赖RT-Thread内核的fatfs支持); http_api_utils http工具函数; hzk16 HZK16汉字字体相关接口; hzk16_data HZK16汉字字体数据; hzk16_setup 将HZK16字体安装到闪存分区; key_task 按键扫描任务; kvdb 封装了FlashDB里面的KVDB,更容易使用; main.c 程序入口; network_task 网络任务,用于处理网络请求(由于UART串口传输速度较慢,查询较慢,所以单独放在一个任务里面执行); time_utils 时间处理工具函数; ui_consts UI常量; ui_draw UI绘制,界面绘制逻辑单独放在了这里面; ui_task UI任务,调用ui_draw实现相关功能;
RT-Thread软件包本项目使用到的RT-Thread软件包位于packages目录下: 1、bluetrum_sdk 2、at_device 提供ESP8266 AT命令构造和响应解析功能,实现联网; 修改:将所有sscanf都替换为atoi和strtol了(测试过程中间发现,每次send/recv会crash在sscanf里面); 修改后代码仓:https://gitee.com/swxu/at_device.git
3、netutils 4、webclient 5、cJSON 6、FlashDB 一个嵌入式数据库,提供了键值数据库(KVDB)和时序数据库(TSDB)两类API,同时提供了一些msh的测试命令; 修改:开启了DEBUG日志,bench命令中的KV测试次数改为100 代码仓:https://gitee.com/swxu/FlashDB.git
7、fal 8、gbk2utf8 其他三方软件包本项目使用到的其他三方软件均来自外设模块供应商,代码放在board目录下,包括: 1、epaper 微雪墨水屏扩展板驱动软件包,来自微雪的E-Paper_Shield)页面; 删除了无用的代码,包括不是4.2寸屏幕的代码、以及SD卡驱动; 修改了GPIO相关的代码,改为用RT-Thread的pin驱动接口; 修改了SPI相关的代码,改为用重新实现的bsp_spi接口; 添加了基于RT-Thread finsh的墨水屏测试程序(绘制棋盘格、全屏填充、输出引脚测试),可以在shell模式下通过命令调用执行;
2、w25qxx W25Q128 闪存驱动,来自微雪的W25QXX DataFlash Board页面; 修改了GPIO相关代码,改为使用RT-Thread的pin驱动接口; 修改了SPI相关代码,改为用重新实现的bsp_spi接口; 添加了基于RT-Thread msh的RAM测试程序(字模式、页模式、流模式),可以在shell模式下通过命令调用执行;
3、重新实现的bsp_spi.h和bsp_spi.c 硬件SPI初始化,使用了greedyhao大佬提供的代码,参考AB32VG1_DOC; SPI接收和发送,使用了Bluetrum技术群中的SDK_AB53XX_V061_20190103.zip里面的相关代码; greedyhao大佬提供的驱动,实现部分全部在libhal.a中,暂时不太好移植到RT-Thread驱动框架上; 效果展示界面显示:
演示视频: https://gitee.com/swxu/e-calender/raw/master/pic/ui-show.gi 图片是原视频经过ffmpeg缩放、降低帧率后生成的gif,原始视频请戳这里:https://www.bilibili.com/video/BV1DP4y1H7UB/ 项目小结1、目前实现的功能还比较基础,只绘制了一个月历的,后续可以添加日历、周历的显示; 2、目前WIFI配网功能没有实现,后续可以添加配网功能,参数配置可以考虑基于嵌入式HTTP服务器(例如webnet组件)开发,实现网页化配置,不用安装APP; 3、SPI驱动目前使用的不是RT-Thread驱动框架,这部分后续可以尝试实现一个基于RT-Thread硬件驱动(目前难点在于SPI初始化代码还没有可供参考的,寄存器文档上也没有SPI相关的说明),这部完成后,可以继续改进: 注意事项对于部分想要基于本项目进行二次开发的朋友,需要注意: 1、本项目代码仓使用了git submodule功能,用git clone --recursive https://gitee.com/swxu/e-calender.git才能下载全部代码,网页端下载的zip包不包含子模块,编译会失败; 2、本项目后期我是用scons命令编译的,RT-Thread Studio的工程文件.cproject,.project和.settings已经不是最新的了,不保证可以直接导入RT-Thread Studio成功,以及编译通过; 3、boards下的epaper和w25qxx目录里面的原始代码来自微雪电子(本人只对GPIO、SPI相关代码做了修改),版权归原作者所有,这里仅是学习用途,三方使用与本人无关;
|