高级会员
- 积分
- 762
- 金钱
- 762
- 注册时间
- 2021-5-18
- 在线时间
- 28 小时
|
实现思路
1、我在工位发现了一个开发板,GD的一个单片机开发板GD32F450Z-EVAL 2016-10 V1.1,MCU是GD32F450ZKT6。带触摸屏,带SDRAM。性能强悍,资源丰富。
2、首先肯定要是有图形界面的,因为开发板上按键也不多,如果用命令行,那还不如杀了我和其他同事。然后,要使用SD卡,因为要支持所有产品,那么需要保存所有的boot程序,如果后期有新产品,增加boot程序,不希望更改我的程序,而是直接从SD卡读取配置文件和boot程序,实现灵活的调整。最后,已经使用大容量的SD卡,而且文件内容挺多的,我就不想自己管理数据了,就再加一个文件系统吧。
3、综上,使用了图形界面和用户交互,文件系统管理众多的数据。经过筛选,图形界面选择Littlvgl,文件系统使用Fatfs。Littlevgl从没接触过,但是我看到正点原子有littevgl的教程,我也用的控件也不多,所以应该不是很难。Fatfs正点原子也有教程,我之前学过且看过实现代码,所以这个也不难。ok,问题解决。开干。
4、使用流程,按照四个界面流转。
(1)第一个界面,提示支持的功能。
从母卡读取数据。这个功能是为了从已有的产品获取数据,省去用电脑下载数据的操作。母卡也是正常产品,只是因为从他这读取数据,他就叫母卡,不能白用人家不是!!
给产品写数据。从母卡读回来的数据写入新的产品,这个产品可能刚做回来,没有程序。也可能数据有损坏,无法正常使用了。
只给产品的flash写数据。有时只需要下载flash内容,满足这个需求。
只给产品的MCU下载boot程序。满足只下载boot的需求。
(2)选择配置文件。从SD卡的配置文件目录读取文件,显示在该界面。
(3)确认是否选择该配置文件。因为可能误触摸,所以要有一个确认界面,如果确认,就开始下载程序。如果点否,返回第二个界面,重新选择配置文件。
(4)等待界面。下载程序时,干看着也不行,要让用户有事干,知道当前下载进度,此界面显示当前下载进度。当下载结束后,返回第一个界面,开始新的循环。
目前效果
以上功能都实现了,但是速率很不理想,需要继续优化。
程序实现
首先说界面实现吧
全程使用label控件,原因是,大小,位置,显示内容,子对象,回调函数,我需要的他都有,没必要使用更高级的控件了。
void win_1_start(void)
{
lv_obj_t *src;
lv_obj_t *label_title; //title label的对象指针
lv_obj_t *label_Master; //from Master label的对象指针
lv_obj_t *label_Target; //to Target label的对象指针
lv_obj_t *label_Mcu; //to Mcu boot label的对象指针
lv_obj_t *label_Flash; //to Flash label的对象指针
msg_attr_t msg_attr;
pcfg_opt.is_running = 0;
pcfg_opt.program_bytes = 0;
pcfg_opt.process_percent = 0;
pcfg_opt.opt = NO_OPT;
memset(pcfg_opt.pcfg_file_name, 0, _MAX_LFN); //工装操作信息的初始值设置为0
memset(pcfg_opt.pcfg_boot_name, 0, _MAX_LFN); //boot.bin文件名
src = lv_scr_act();
desktop_1 = lv_obj_create(src, src);
msg_attr.P_parent = desktop_1;
msg_attr.P_obj = label_title;
msg_attr.width = 320;
msg_attr.y_mod = 0;
msg_attr.msg_str = "Card:\0";
msg_attr.callback_func = label_1_event_handler;
win_1_box_show(&msg_attr); //显示title label
msg_attr.P_obj = label_Master;
msg_attr.width = 200;
msg_attr.y_mod = 100;
msg_attr.msg_str = "from Mater\0";
msg_attr.opt_msg = FROM_MASTER_OPT;
msg_attr.callback_func = label_Master_event_handler;
win_1_box_show(&msg_attr); //显示from Master label
msg_attr.P_obj = label_Target;
msg_attr.width = 200;
msg_attr.y_mod = 150;
msg_attr.msg_str = "to Target\0";
msg_attr.opt_msg = TO_TARGET_OPT;
msg_attr.callback_func = label_Master_event_handler;
win_1_box_show(&msg_attr); //显示to Mcu boot label
每个label显示时调用的win_1_bos_show是自己写的函数,因为显示显示属性相似,不想重复粘贴,而且那么写也不好看所以做成了函数。
原文链接:http://bj.dyrs.com.cn/story/202111/1166001
|
|