打印
[开发生态]

【SWDM-QFP100-34SVEA3测评】三:实现简单的电子相册

[复制链接]
575|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 数码小叶 于 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,因此,不用跳线



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



按照官方例程,是从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的结构体,来存储图片
/** Image header it is compatible with
* the result from image converter utility*/
typedef struct
{
    lv_img_header_t header;
    uint32_t data_size;
    const uint8_t * data;
} 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 张整图。

从SPI到SDRAM,例程中已经有实现的函数
/**
* [url=home.php?mod=space&uid=247401]@brief[/url]           加载图片信息至 SDRAM 内
* @param [in]      src_path    : 源文件路径
* @param [in/out]  image       : image 自定义解析 -> 此处约定为 LVGL 图片结构体(lv_img_dsc_t *)
* @param           ram_malloc  : (分配成功的内存块首地址)<*内存分配回调>(预分配大小)
* @retval          0           : success
* @retval          other       : error code
*/
static uint8_t load_to_sdram_image(const char *src_path, void *image, void *(*ram_malloc)(size_t))
lv_img_dsc_t *img = (lv_img_dsc_t *)image;
img->header.cf = LV_IMG_CF_TRUE_COLOR; // 真彩色 RGB
        img->header.always_zero = 0;
        img->header.w = JFIF_Info.Width;
        img->header.h = JFIF_Info.Height;
        img->data_size = (img->header.w) * (img->header.h) * LCD_FMT; // JFIF_Info.CodeLen 不可用 (缺失信息)
        img->data = (const uint8_t *)mem_ptr;                         // 赋予图片源地址
其中比较重要的就是用指针,指向了图片的SDRAM区域,而不是复制整个图片资源。
显示时,直接调用LVGL的接口

lv_obj_t *obj = lv_img_create(lv_scr_act(), NULL);
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软件查看图片信息





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



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



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





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


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








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


使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

103

主题

2540

帖子

19

粉丝