[开发生态] 【SWDM-QFP100-34SVEA3测评】三:实现简单的电子相册

[复制链接]
874|0
 楼主| 数码小叶 发表于 2023-4-16 15:29 | 显示全部楼层 |阅读模式
本帖最后由 数码小叶 于 2023-4-16 15:14 编辑

要实现电子相册的功能,第一步是解决图片的来源,SWDM-QFP100-34SVEA3可以选择USB\串口\SD卡,最后选择了SD卡的方式,这种方式来的应该是最简单的,USB不论是主从,协议都比较复杂,调试起来也比较耗时,串口不能摆脱电脑,只有SD卡最简单、直接。

SWM341的SDIO接口模块具有如下特性:
⚫ 兼容 SD 主机控制标准规范 2.0
⚫ 兼容 SDIO 卡规范 2.0
⚫ 兼容 SD 存储卡规范 2.0(Draft 版本)
⚫ 兼容 SD 存储卡安全规范 1.01
⚫ 兼容 MMC 规范标准 3.31、 4.2 和 4.3
⚫ 支持 DMA 和非 DMA 操作两种模式
⚫ 支持 MMC Plus 和 MMC Mobile
⚫ 卡检测(插入/移除)
⚫ 可变时钟频率: 0~52MHz
⚫ 支持 1 位、 4 位、 8 位的 SD 模式
⚫ 支持多媒体卡中断模式
⚫ 4 位 SD 模式下, 传输速率高达 100Mbits/S
⚫ 8 位 SD 模式下, 传输速率高达 416Mbits/S
⚫ 支持读写控制, 暂停/恢复操作
⚫ 支持 MMC4.3 卡纠错
⚫ 支持 CRC 循环冗余校验
可见,性能还是很强的。


SWDM-QFP100-34SVEA3的SD卡模块直接连接到了MCU,因此,不用跳线

2023-04-15_21-24-30.png

SWM341 系列 SDIO 支持 2 GB ~ 32GB 的卡,刚好有个2G的,就用2G的卡吧。格式化完后复制好图片文件

2023-04-15_12-01-17.png

按照官方例程,是从SD卡中将图片复制到SPI Flash中,调用时,从SPI Flash搬运到SDRAM中。从SD卡中读写文件,用的是FATFS文件系统,这个不需要自己移植, SWM341 的例程已经完成了 FATFS 的移植。
SWDM-QFP100-34SVEA3内嵌了8MB SDRAM,这个是集成在芯片内部的。如果按 RGB565方式计算, 一张 800*480 的整图,其大小为 800 x 480 x 2 = 768000 Byte,能放下(8 x 1024 x 1024 ) / 768000= 10 张整图。这里有两种方式使用SDRAM,一种是采取静态内存分配: 将一开始就将全部 UI 素材从 SpiFlash 拷贝到 SDRAM,这样做可以使得刷图显示速度效果更好;另一种是采用动态内存空间分配, 采取分时复用的方式。动态的感觉稍复杂,还是看看静态的效果吧。
定义一个lv_img_dsc_t的结构体,来存储图片
  1. /** Image header it is compatible with
  2. * the result from image converter utility*/
  3. typedef struct
  4. {
  5.     lv_img_header_t header;
  6.     uint32_t data_size;
  7.     const uint8_t * data;
  8. } lv_img_dsc_t;



SWDM-QFP100-34SVEA3的板载SPI Flash型号是W25Q128JV,容量是16MB。如果按 RGB565方式计算, 一张 800 x 480 的整图,其大小为 800 x 480 x 2 = 768000 Byte,能放下(16 x 1024 x1024 ) / 768000 = 21 张整图。
2023-04-16_13-37-27.png
从SPI到SDRAM,例程中已经有实现的函数
  1. /**
  2. * [url=home.php?mod=space&uid=247401]@brief[/url]           加载图片信息至 SDRAM 内
  3. * @param [in]      src_path    : 源文件路径
  4. * @param [in/out]  image       : image 自定义解析 -> 此处约定为 LVGL 图片结构体(lv_img_dsc_t *)
  5. * @param           ram_malloc  : (分配成功的内存块首地址)<*内存分配回调>(预分配大小)
  6. * @retval          0           : success
  7. * @retval          other       : error code
  8. */
  9. static uint8_t load_to_sdram_image(const char *src_path, void *image, void *(*ram_malloc)(size_t))
  1. lv_img_dsc_t *img = (lv_img_dsc_t *)image;
  1. img->header.cf = LV_IMG_CF_TRUE_COLOR; // 真彩色 RGB
  2.         img->header.always_zero = 0;
  3.         img->header.w = JFIF_Info.Width;
  4.         img->header.h = JFIF_Info.Height;
  5.         img->data_size = (img->header.w) * (img->header.h) * LCD_FMT; // JFIF_Info.CodeLen 不可用 (缺失信息)
  6.         img->data = (const uint8_t *)mem_ptr;                         // 赋予图片源地址
其中比较重要的就是用指针,指向了图片的SDRAM区域,而不是复制整个图片资源。
显示时,直接调用LVGL的接口

  1. lv_obj_t *obj = lv_img_create(lv_scr_act(), NULL);
  2. lv_img_set_src(obj, image);


SWM341的SPI Flash有两种接口速率,一种高速SFC,一种低速普通SPI。高速接口SFC 可以将片外的 SPI-Flash 初始化挂载至总线上, 将其映射至 MCU 内部, 如此一来, 读取数据 可以直接
访问 MCU 内部 4G 地址空间( 0x70000000 ~ 0x7FFFFFFF)即可,简化了用户适配不同型号的 SPI-Flash 步骤。但是高速接口有容量限制,其支持的容量上限为 16MB,低速SPI无限制。

编译,解决一系列问题后,把工程烧录进板卡里,虽然可以显示图片,但是只有前几张图片可以播放,然后就会卡住。。。删减、增加、更换图片都没解决。最后在官方的文档里看到一个提醒:“待解码的 JPEG 图必须同时满足 Baseline DCT 压缩标准和 JFIF 文件格式,否则 JPEG 硬件解码器无法正常解码”。查看SWM341的芯片资料,在6.25 图像硬件解码器(JPEG)的概述里面确实也有这样的描述:“JPEG DECODER 是一个 JPEG 图像硬件解码器,支持 JPEG Sequential DCT-based baseline 格式的图片解码。


于是下载了一个官方推荐的软件JPEGsnoop,使用 JPEGsnoop软件查看图片信息
2023-04-15_14-13-26.png

2023-04-15_14-12-18.png


果然是有几张图片不满足需求的,还以为只要格式是.jpg就行了。
找了下这两者的区别:

2023-04-16_14-10-26.png

尝试用电脑已经安装的转换工具,对图片进行了格式转换,虽然官方也推荐了转换工具,不过还要下载安装

2023-04-15_14-34-11.png

再用JPEGsnoop去查看图片信息,已经满足要求了

2023-04-15_14-20-12.png



最后效果:设置的刷新间隔时间是2s


图片加载很快,为了更直观的查看性能,打开了LVGL的fps显示宏
  1. /*1: Show CPU usage and FPS count in the right bottom corner*/
  2. #define LV_USE_PERF_MONITOR     1
微信图片_20230416142045.jpg

微信图片_20230416142145.jpg





基本都是33帧的速率,CPU负载在89%到95%之间,这个速率,已经相当快了,连续运行一个多小时,MCU的热量也没有明显增加。
微信图片_20230416142059.jpg

您需要登录后才可以回帖 登录 | 注册

本版积分规则

105

主题

2560

帖子

19

粉丝
快速回复 在线客服 返回列表 返回顶部