STM32 上实现 SD 卡读取 JPEG 解码 TFT 显示

一、总体架构

复制代码
SD 卡 (FATFS)
   ↓
JPEG 文件
   ↓
TJpgDec(轻量 JPEG 解码库)
   ↓
RGB565 像素缓冲
   ↓
TFT LCD(DMA 刷新)

优点

  • 内存占用极小(几 KB)
  • 解码速度快
  • 适合 STM32F1 / F4 / G0 / H7

二、硬件要求

模块 建议
MCU STM32F407 / F429 / H743(带 FSMC / LTDC 更好)
SD 卡 SPI 或 SDIO
LCD ILI9341 / ILI9488 / ST7789
RAM ≥ 32KB(解码缓冲)

STM32F103 只能显示小分辨率 JPEG(≤ 320×240)


三、软件组件选型

功能
文件系统 FatFs
JPEG 解码 TJpgDec(官方轻量库)
显示驱动 自定义 LCD 驱动
刷新方式 DMA + RGB565

四、关键数据结构

c 复制代码
#define LCD_WIDTH   320
#define LCD_HEIGHT  240

uint16_t lcd_buf[LCD_WIDTH];   // 一行像素缓冲

五、FatFs + SD 卡初始化

c 复制代码
#include "ff.h"
#include "diskio.h"

FATFS fs;
FIL file;

void SD_Init(void)
{
    f_mount(&fs, "", 0);
}

六、TJpgDec 移植(核心)

1、下载 TJpgDec

官网:http://elm-chan.org/fsw/tjpgd/

2、实现输入函数(从 SD 卡读数据)

c 复制代码
#include "tjpgd.h"

UINT jpeg_read(JDEC* jd, BYTE* buff, UINT nbyte)
{
    UINT br;
    FIL *fp = (FIL*)jd->device;
    f_read(fp, buff, nbyte, &br);
    return br;
}

3、实现输出函数(写 LCD)

c 复制代码
UINT jpeg_write(JDEC* jd, void* bitmap, JRECT* rect)
{
    uint16_t* src = (uint16_t*)bitmap;
    uint16_t x, y;

    for (y = rect->top; y <= rect->bottom; y++) {
        for (x = rect->left; x <= rect->right; x++) {
            LCD_DrawPixel(x, y, *src++);
        }
    }
    return 1;
}

更高效版本(推荐)

使用 LCD_DrawBitmap(x, y, w, h, buf) + DMA


七、JPEG 解码并显示

c 复制代码
void Show_JPEG(char *filename)
{
    JDEC jdec;
    JRESULT res;
    uint8_t work[3100];   // 解码工作缓冲(≥ 3100)

    f_open(&file, filename, FA_READ);

    res = jd_prepare(&jdec, jpeg_read, work, sizeof(work), &file);
    if (res != JDR_OK) {
        f_close(&file);
        return;
    }

    res = jd_decomp(&jdec, jpeg_write, 0); // 0 = 原尺寸
    f_close(&file);
}

八、TFT LCD 显示接口(示例)

c 复制代码
void LCD_DrawPixel(uint16_t x, uint16_t y, uint16_t color)
{
    LCD_SetCursor(x, y);
    LCD_WriteData(color);
}

DMA 刷新(大幅提升速度)

c 复制代码
void LCD_DrawBitmap(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t *buf)
{
    LCD_SetWindow(x, y, w, h);
    HAL_DMA_Start(&hdma_memtomem, (uint32_t)buf, (uint32_t)&LCD_RAM, w * h);
}

参考代码 stm32读取sd卡的jpeg图片,然后解码显示在tft液晶屏上面 www.youwenfan.com/contentcsu/69805.html

九、主函数流程

c 复制代码
int main(void)
{
    HAL_Init();
    SystemClock_Config();

    MX_SDIO_SD_Init();
    MX_FATFS_Init();
    LCD_Init();
    SD_Init();

    LCD_Clear(BLACK);
    Show_JPEG("test.jpg");

    while (1);
}
相关推荐
开发笔记-阿牛4 分钟前
解析一款有意思的产品||CK6159A语音芯片设计的儿童专注力训练机-舒尔特玩具
stm32·单片机·嵌入式硬件·音频
Echo缘35 分钟前
嵌入式系统C语言资源分类与内存分布分析
c语言·开发语言
JaneConan1 小时前
鸿蒙 ArkUI 深水区:@Watch 和 @Observed,状态变了「自动跑」+ 嵌套对象「深层重绘」
开发语言·后端·ui·harmonyos
赤水无泪1 小时前
qt中图标、名称的设置方式
开发语言·qt
王莎莎-MinerU1 小时前
MCP 解决的是工具接入,科研 Agent 还缺的是科学证据接口标准化
开发语言·网络·人工智能·深度学习·pdf·c#·php
橘子海全栈攻城狮1 小时前
【最新源码】基于SpringBoot + Vue的超市管理系统的设计与实现D002
java·开发语言·vue.js·spring boot·后端·spring
在水一缸2 小时前
深入浅出 Catch2:现代 C++ 测试框架的优雅实践
开发语言·c++·单元测试·log4j·测试框架·catch2
-银雾鸢尾-2 小时前
C#中Object类内的方法
开发语言·c#
浮江雾2 小时前
Flutter第十节-----Flutter布局与组件全解析
android·开发语言·前端·学习·flutter·入门
爱喝水的鱼丶2 小时前
SAP-ABAP:ALV跨版本兼容指南——适配ECC与S4 HANA系统的ALV开发注意事项
开发语言·性能优化·sap·abap·经验交流