๐ English Abstract
This technical article provides a deep dive into resolving screen tearing issues and optimizing DMA transmission bandwidth in ESP32-S3 based RGB display applications using LVGL. It explains the architectural bottlenecks of PSRAM latency during continuous pixel streaming and demonstrates how to effectively implement and tune Bounce Buffers in ESP-IDF. Developers will learn practical configuration strategies, memory allocation techniques, and clock timing adjustments to achieve smooth 60 FPS graphical user interfaces.
ESP32-S3๋ ๊ณ ์ฑ๋ฅ ๋์ผ ์ฝ์ด MCU์ ํจ๊ป ํ๋ถํ GPIO, ๊ทธ๋ฆฌ๊ณ Octal SPI PSRAM(Pseudo Static RAM)์ ์ง์ํ์ฌ ์๋ฒ ๋๋ GUI ๊ฐ๋ฐ ํ๊ฒฝ์์ ๋งค์ฐ ๋งค๋ ฅ์ ์ธ ์๋ฃจ์ ์ผ๋ก ์๋ฆฌ ์ก์์ต๋๋ค. ํนํ LVGL(Light and Versatile Graphics Library)๊ณผ 16๋นํธ RGB ์ธํฐํ์ด์ค(RGB565)๋ฅผ ์กฐํฉํ๋ฉด ๊ณ ํด์๋(์: 800x480, 480x480)์ ๋์คํ๋ ์ด์์๋ ํ๋ คํ ๊ทธ๋ํฝ์ ๊ตฌํํ ์ ์์ต๋๋ค.
ํ์ง๋ง ์ค์ ๋ก ๋๋ฐ์ด์ค๋ฅผ ๊ตฌ๋ํด ๋ณด๋ฉด, ํ๋ฉด์ด ๋น ๋ฅด๊ฒ ์ ํ๋๊ฑฐ๋ ๋ ๋๋ง ๋ถํ๊ฐ ๋์์ง ๋ ํ๋ฉด ์ฐข์ด์ง(Tearing Effect) ํ์์ด๋ ์์, ์ฌ์ง์ด ํฝ์ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋ฆฌ๋ ํ์์ ์์ฃผ ๊ฒช๊ฒ ๋ฉ๋๋ค. ์ด๋ ESP32-S3์ ๋ด๋ถ ๊ตฌ์กฐ์ PSRAM ์ก์ธ์ค ๋์ญํญ ์ ํ์์ ๋น๋กฏ๋๋ ์ ํ์ ์ธ DMA ์ธ๋๋ฐ(DMA Underrun) ๋ฌธ์ ๋๋ฌธ์ ๋๋ค.
๋ณธ ๊ธ์์๋ ESP32-S3 ๋ฐ LVGL ์์ฉ ํ๋ก๊ทธ๋จ ๊ฐ๋ฐ ์ ๋ฐ์ํ๋ RGB ๋์คํ๋ ์ด ๋์ญํญ ๋ถ์กฑ ๋ฌธ์ ์ ๊ทผ๋ณธ์ ์ธ ์์ธ์ ํ๋์จ์ด/ํ๋์ ๋ฉ๋ชจ๋ฆฌ ์ํคํ ์ฒ ๊ด์ ์์ ๋ถ์ํ๊ณ , ์ด๋ฅผ ์๋ฒฝํ๊ฒ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐ์ด์ค ๋ฒํผ(Bounce Buffer) ์ต์ ํ ํธ๋ฌ๋ธ์ํ ๊ธฐ์ ์ ๋ค๋ฃน๋๋ค.
1. ํ๋ฉด ์ฐข์ด์ง(Tearing Effect)์ ๊ทผ๋ณธ์ ์ธ ์์ธ ๋ถ์
ESP32-S3์ RGB ํจ๋ ์ปจํธ๋กค๋ฌ๋ LCD์ ์ง์์ ์ผ๋ก ํฝ์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ธฐ ์ํด continuous PCLK(Pixel Clock) ์ ์ก ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค. 800x480 ํด์๋๋ฅผ 60Hz๋ก ๊ตฌ๋ํ๊ธฐ ์ํด์๋ ์ฝ 24MHz~30MHz์ ๋ฌํ๋ PCLK๊ฐ ํ์ํ๋ฐ, ์ด ๋ง์ ๋จ ํ ์น์ ์ค์ฐจ๋ ์์ด ์ด๋น 25MB ์ด์์ ๋ฐ์ดํฐ๊ฐ LCD ์ ์ด ํ์ผ๋ก ๋ฟ์ด์ ธ ๋๊ฐ์ผ ํจ์ ์๋ฏธํฉ๋๋ค.
๊ฐ. PSRAM ์ก์ธ์ค ๋ณ๋ชฉ๊ณผ ๋๊ธฐ ์๊ฐ(Latency)
800x480 (16bpp) ํด์๋์ ํ๋ ์ ๋ฒํผ(Framebuffer) ํ๋๋ ์ฝ 768KB์ ๋๋ค. ESP32-S3 ๋ด๋ถ SRAM(Internal SRAM)์ 512KB ์์ค์ด๋ฏ๋ก ์ ์ฒด ํ๋ ์ ๋ฒํผ๋ฅผ ๋ด๋ถ SRAM์ ์ฌ๋ฆฌ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ฉฐ, ๋ฐ๋์ ์ธ๋ถ PSRAM์ ํ ๋นํด์ผ ํฉ๋๋ค.
- Octal SPI/Quad SPI ์ธํฐํ์ด์ค ํ๊ณ: ์ธ๋ถ PSRAM์ SPI/OPI ๋ฒ์ค๋ฅผ ํตํด ์ก์ธ์ค๋๋ฏ๋ก ๋ด๋ถ SRAM์ ๋นํด ๋๊ธฐ ์๊ฐ(Access Latency)์ด ๊ธธ๊ณ ๋์ญํญ(Bandwidth)์ ์ ํ์ด ์์ต๋๋ค.
- ๋ฒ์ค ๊ฒฝํฉ(Bus Contention): GDMA(General DMA)๊ฐ LCD ํจ๋๋ก ํฝ์ ์ ์ ์กํ๊ธฐ ์ํด PSRAM์ ์ฝ๊ณ ์๋ ์๊ฐ, CPU(LVGL ๋ ๋๋ง ์ค๋ ๋)๋ Wi-Fi/Bluetooth ์คํ, Flash ์ฝ๊ธฐ ์์ ์ด ๋์์ PSRAM/Flash ๋ฒ์ค๋ฅผ ์ ์ ํ๋ ค๊ณ ํ๋ฉด DMA ์ฝ๊ธฐ ์ง์ฐ์ด ๋ฐ์ํฉ๋๋ค.
- DMA ์ธ๋๋ฐ(DMA Underrun): PCLK๋ ๊ณ์ ๋ฐ๊ณ ์๋๋ฐ DMA๊ฐ PSRAM์์ ํฝ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ๊ฐ์ ธ์ค์ง ๋ชปํ๋ฉด, LCD ์ปจํธ๋กค๋ฌ๋ ์ด์ ๋ฐ์ดํฐ๋ฅผ ํ๋ ค๋ณด๋ด๊ฑฐ๋ ์๋ชป๋ ํฝ์ ์ ์ถ๋ ฅํ์ฌ ํ๋ฉด์ด ์ฐข์ด์ง๊ฑฐ๋ ๋์ปฅ๊ฑฐ๋ฆฌ๋ ํ์์ด ์ผ์ด๋ฉ๋๋ค.
๋. LVGL ๋ ๋๋ง ํ์ด๋ฐ๊ณผ V-Sync ๋ถ์ผ์น
LVGL์ด ํ๋ ์ ๋ฒํผ๋ฅผ ๊ฐฑ์ ํ๋ ์์ ๊ณผ RGB ํจ๋ ๋์คํ๋ ์ด๊ฐ ํ๋ฉด์ ์ค์บํ๋ ์์ ์ด ๋๊ธฐํ(Vertical Synchronization, V-Sync)๋์ง ์์ผ๋ฉด, ์ค์บ ์ค๊ฐ์ ๋ฒํผ์ ํฝ์ ๊ฐ์ด ๋ฐ๋์ด ํ๋ ์ ์๋จ๊ณผ ํ๋จ์ ๊ทธ๋ฆผ์ด ์๋ก ๋ค๋ฅธ ํ๋ ์์ ์ด๋ฏธ์ง๋ฅผ ๋ํ๋ด๊ฒ ๋ฉ๋๋ค.
2. ๊ตฌ์ํฌ์: ๋ฐ์ด์ค ๋ฒํผ(Bounce Buffer)์ ๊ตฌ์กฐ์ ๋์ ์๋ฆฌ
์ด ๋์ญํญ ๋ณ๋ชฉ ํ์์ ์ํํ๊ธฐ ์ํด ESP-IDF์ LCD RGB ๋๋ผ์ด๋ฒ๋ ๋ฐ์ด์ค ๋ฒํผ(Bounce Buffer)๋ผ๋ ์ค๊ณ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค.
[PSRAM Framebuffer (Large & High Latency)]
| (Task/EDMA Copy)
↓
[Bounce Buffer in Internal SRAM (Fast & DMA Capable)]
| (Hardware GDMA Stream)
↓
[RGB Display Panel]
๋ฐ์ด์ค ๋ฒํผ๋ PSRAM์ ์กด์ฌํ๋ ๊ฑฐ๋ํ ํ๋ ์ ๋ฒํผ์์ ๋ช ๋ผ์ธ(Line) ๋ถ๋์ ์์ ํฝ์ ๋ฐ์ดํฐ ์กฐ๊ฐ์ ์ด๊ณ ์ ๋ด๋ถ SRAM(Internal SRAM)์ ๋จผ์ ๋ณต์ฌํด ๋ ๋ค, GDMA๊ฐ ๋ด๋ถ SRAM์ผ๋ก๋ถํฐ ์ค์๊ฐ์ผ๋ก LCD ํจ๋์ ๋ฐ์ดํฐ๋ฅผ ์์์ฃผ๋๋ก ํ๋ ๊ธฐ๋ฒ์ ๋๋ค.
- ๋ด๋ถ SRAM์ ๋๊ธฐ ์๊ฐ์ด 0์ ๊ฐ๊น๊ณ ๋ฒ์ค ๋์ญํญ์ด ๋งค์ฐ ๋์ด PCLK ์ ์ก ์ DMA ์ธ๋๋ฐ์ด ๊ฑฐ์ ๋ฐ์ํ์ง ์์ต๋๋ค.
- ์ฃผ๋ก 2๊ฐ์ ๋ฐ์ด์ค ๋ฒํผ๋ฅผ ํํ(Ping-Pong) ๊ตฌ์กฐ๋ก ์ด์ฉํ์ฌ, ํ๋๊ฐ LCD๋ก ์ ์ก๋๋ ๋์ ๋ค๋ฅธ ํ๋๋ PSRAM์ผ๋ก๋ถํฐ ๋ค์ ๋ผ์ธ ๋ฐ์ดํฐ๋ฅผ ์ฑ์ ๋ฃ๋ ๋ฐฉ์์ ์ทจํฉ๋๋ค.
3. ์ค๋ฌด ํธ๋ฌ๋ธ์ํ ๋ฐ ๋ฐ์ด์ค ๋ฒํผ ์ต์ ํ ์ค์
ESP-IDF ํ๊ฒฝ์์ `esp_lcd` ๋์คํ๋ ์ด ๋๋ผ์ด๋ฒ ๊ตฌ์ฑ ์ ํ๋ฉด ์ฐข์ด์ง์ ์ก๊ธฐ ์ํ ๋จ๊ณ๋ณ ํ๋ ์ ์ฐจ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๊ฐ. `esp_lcd_rgb_panel_config_t` ํต์ฌ ํ๋ผ๋ฏธํฐ ์ต์ ํ
RGB ํจ๋์ ์ด๊ธฐํํ ๋ ๊ตฌ์กฐ์ฒด ์ค์ ์์ ๋ฐ์ด์ค ๋ฒํผ์ DMA ํ๋ ์๋ฒํผ ์ต์ ์ ์ธ๋ฐํ๊ฒ ์กฐ์ ํด์ผ ํฉ๋๋ค.
esp_lcd_rgb_panel_config_t panel_config = {
.clk_src = LCD_CLK_SRC_DEFAULT,
.timings = {
.pclk_hz = 16 * 1000 * 1000, // PCLK ๋์ญํญ ์กฐ์ (ํ์ ์ ๋ค์ดํด๋ญ)
.h_res = 800,
.v_res = 480,
.hsync_pulse_width = 4,
.hsync_back_porch = 8,
.hsync_front_porch = 8,
.vsync_pulse_width = 4,
.vsync_back_porch = 8,
.vsync_front_porch = 8,
.flags.pclk_active_neg = true,
},
.data_width = 16, // RGB565
.bits_per_pixel = 16,
.bounce_buffer_size_px = 800 * 10, // ๋ผ์ธ ๋จ์ ๋ฐ์ด์ค ๋ฒํผ ํฌ๊ธฐ (10 Line)
.sram_trans_align = 64,
.psram_trans_align = 64,
.flags = {
.fb_in_psram = 1, // ํ๋ ์ ๋ฒํผ๋ฅผ PSRAM์ ๋ฐฐ์น
.double_fb = 1, // ๋๋ธ ๋ฒํผ๋ง ์ ์ฉ (LVGL Direct mode ์ฐ๋ ์ ํ์)
.no_fb = 0,
.bb_invalidate_cache = 1, // Cache coherent ์ ์ง
}
};
๋. ๋ฐ์ด์ค ๋ฒํผ ํฌ๊ธฐ ๊ณ์ฐ ๋ฐ ์ต์ ์ ์ฐพ๊ธฐ
`bounce_buffer_size_px` ํ๋ผ๋ฏธํฐ๋ ํ๋ฉด ์ฐข์ด์ง๊ณผ ๋ฉ๋ชจ๋ฆฌ ์๋ชจ ์ฌ์ด์ ํธ๋ ์ด๋์คํ(Trade-off)๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
- ๋๋ฌด ์์ ๊ฐ (์: 1~2 ๋ผ์ธ): ๋ด๋ถ SRAM ์๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋, PSRAM ์ฝ๊ธฐ ์ง์ฐ์ ์ถฉ๋ถํ ๋ฐฉ์ดํ์ง ๋ชปํด ์ฐข์ด์ง ์ง์ ๋ฐ์.
- ์ ์ ์ถ์ฒ ๊ฐ (10 ~ 20 ๋ผ์ธ): 800px ๋๋น ๊ธฐ์ค 10 ๋ผ์ธ์ `800 * 10 * 2byte = 16KB` ์๋ชจ. ํํ ๋ฒํผ ๊ตฌ์กฐ๋ก 2๊ฐ๊ฐ ํ ๋น๋๋ฏ๋ก ์ด 32KB์ ๋ด๋ถ SRAM ์ฌ์ฉ. PSRAM์ ๋กฑ ํธ๋์ญ์ ์ง์ฐ์ ์ถฉ๋ถํ ํก์ํจ.
- ๋๋ฌด ํฐ ๊ฐ (์: 50 ๋ผ์ธ ์ด์): ๋ด๋ถ DRAM(SRAM) ๋ถ์กฑ์ผ๋ก ์ธํ `ESP_ERR_NO_MEM` ์๋ฌ ๋ฐ์ ์ํ.
๋ค. PCLK(Pixel Clock) ์ฃผํ์ ๋ค์ดํด๋ญ ํ๋
ํจ๋์ ์คํํธ์ ๊ธฐ์ฌ๋ ์ต๋ PCLK(์: 30MHz)๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ฉด PSRAM ์๊ตฌ ๋์ญํญ์ด ์นฉ์ ์ ๋ฌผ๋ฆฌ์ ํ๊ณ๋ฅผ ์ด๊ณผํฉ๋๋ค.
- PCLK๋ฅผ 16MHz ~ 20MHz ์์ค์ผ๋ก ๋ฎ์ถ๋ฉด, ์ด๋น ํ์ํ DMA ๋ฐ์ดํฐ ์ ์ก๋์ด ๊ฐ์ํ์ฌ PSRAM ๋์ญํญ์ ์ฌ์ ๊ฐ ์๊น๋๋ค.
- Refresh Rate๊ฐ ์ฝ 45Hz~50Hz๋ก ์ฝ๊ฐ ๋ฎ์์ง์ง๋ง, ํ๋ฉด ์ฐข์ด์ง๊ณผ ๋ ธ์ด์ฆ ํฝ์ ์ด ์์ ํ ์ฌ๋ผ์ง๋ ์์ ์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
๋ผ. LVGL ๋ฒํผ ๋ชจ๋ ์ค์ (Direct Mode vs Full Refresh)
LVGL ๋๋ผ์ด๋ฒ ์ค์ ์ `LV_DISP_RENDER_MODE_DIRECT` ๋ชจ๋๋ฅผ ํ์ฉํ๋ ๊ฒ์ด ๊ณ ํด์๋ PSRAM ํ๊ฒฝ์์ ๋งค์ฐ ํจ๊ณผ์ ์ ๋๋ค.
// LVGL Display Driver ์ด๊ธฐํ ์์ static lv_disp_drv_t disp_drv; lv_disp_drv_init(&disp_drv); // PSRAM์ ์์ฑ๋ ๋ ๊ฐ์ ํ๋ ์ ๋ฒํผ ํฌ์ธํฐ ์ง์ disp_drv.draw_buf = &disp_buf; disp_drv.buf1 = fb1_psram_ptr; disp_drv.buf2 = fb2_psram_ptr; // Direct Mode๋ฅผ ํตํด ๋ณ๊ฒฝ๋ ์์ต๋ง ํ๋ ์ ๋ฒํผ ๊ฐ ๋๊ธฐํ ๋ ๋๋ง disp_drv.render_mode = LV_DISP_RENDER_MODE_DIRECT; disp_drv.flush_cb = rgb_lcd_lvgl_flush_cb; lv_disp_drv_register(&disp_drv);
Direct Mode๋ ํ๋ฉด ์ ์ฒด๋ฅผ ๋งค๋ฒ ์๋ก ๊ทธ๋ฆฌ๋ ๋์ ๋ณ๊ฒฝ๋ ์์ ฏ ์์ญ๋ง PSRAM ํ๋ ์ ๋ฒํผ์ ์ง์ ๋ฎ์ด์ฐ๋ฏ๋ก PSRAM ์ฐ๊ธฐ ํธ๋ํฝ์ ๋น์ฝ์ ์ผ๋ก ์ค์ฌ์ค๋๋ค.
4. ์ฃ์ง ์ผ์ด์ค(Edge Cases) ๋์ ๋ฐ ์ฑ๋ฅ ๊ณ ๋ํ ์ ๋ต
๋ฐ์ด์ค ๋ฒํผ๋ฅผ ์ค์ ํ์์๋ ๋ถ๊ตฌํ๊ณ ํน์ ์์ฉํ ์กฐ๊ฑด์์ ์ฐข์ด์ง์ด๋ ํ๋ ์ ๋๋์ด ์ฌ๋ฐํ๋ ์ฃ์ง ์ผ์ด์ค๋ค์ ๋ค๋ฃน๋๋ค.
๊ฐ. Wi-Fi ๋ฐ Bluetooth ๋์ ๋์ ์ ๋ฉ๋ชจ๋ฆฌ ๋ฒ์ค ๊ฐ์ญ
ESP32-S3์์ Wi-Fi ์คํ์ด ํ์ฑํ๋๋ฉด ์ํธํ ์์ง ๋ฐ ํจํท ๋ฒํผ ์์ ์ผ๋ก ์ธํด ๋ด๋ถ Interconnect ๋ฒ์ค์ ์ ์ ์จ์ด ํญ์ฆํฉ๋๋ค. ์ด๋ก ์ธํด DMA ํ๋ ์น(Fetch) ๋๊ธฐ ์๊ฐ์ด ๊ธธ์ด์ง๋๋ค.
- ํด๊ฒฐ์ฑ : Menuconfig์์ `CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP` ์ต์ ์ ๋๊ณ , Wi-Fi ๋ฒํผ๋ ๊ฐ๋ฅํ ๋ด๋ถ SRAM์๋ง ๋ฐฐ์นํ์ฌ PSRAM ๋ฒ์ค๋ฅผ ๊ฑด๋๋ฆฌ์ง ์๋๋ก ๋ ๋ฆฝ์ํต๋๋ค.
- LVGL ๋ ๋๋ง ํ์คํฌ์ RGB DMA ๊ด๋ จ ํ์คํฌ์ CPU Core Affinity(์ฝ์ด ๊ณ ์ )๋ฅผ ๋ถ๋ฆฌํฉ๋๋ค. (์: Core 0 = Wi-Fi/System, Core 1 = LVGL GUI Task).
๋. PSRAM ์๋ ๋ชจ๋ ํ์ธ (Quad vs Octal 80MHz)
ESP32-S3 ๋ชจ๋ ์นฉ์ ์ ๋ฐ๋ผ PSRAM ์ฐ๊ฒฐ ๋ฐฉ์์ด ๋ค๋ฆ ๋๋ค. N8R8, N16R8 ๋ฑ ๋ค์ 'R8'์ด ๋ถ์ ๋ชจ๋์ 8-line Octal SPI PSRAM์ ํ์ฌํ๊ณ ์์ต๋๋ค.
- `sdkconfig` ์ค์ ์์ PSRAM Clock์ด 80MHz Flash / 80MHz PSRAM (Octal DDR)๋ก ์ ์ ์ค์ ๋์ด ์๋์ง ํํ ํ์ธํด์ผ ํฉ๋๋ค.
- 40MHz๋ก ํํฅ ์ค์ ๋์ด ์๊ฑฐ๋ Quad mode๋ก ๋์ ์ค์ด๋ผ๋ฉด RGB565 800x480 ํ๋ฉด ๊ตฌ๋ ์ ๋์ญํญ ๋ฏธ๋ฌ๋ก ๋ฌด์กฐ๊ฑด ์ฐข์ด์ง์ด ๋ฐ์ํฉ๋๋ค.
๋ค. V-Sync ์ธํฐ๋ฝํธ๋ฅผ ์ด์ฉํ ๋ ์ง์คํฐ ํ๋ ์ ์ค์ํ
ESP-IDF์ `on_vsync` ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฑ๋กํ์ฌ LVGL์ด ๋ ๋๋ง์ ๋ง์น ๋ฒํผ๋ฅผ V-Sync ๋ธ๋ญํฌ ๊ตฌ๊ฐ(Vertical Blanking Interval)์์๋ง ์ํ ์ ํ(Swap)ํ๋๋ก ์ ์ดํ์ญ์์ค.
static bool on_vsync_event(esp_lcd_panel_handle_t panel, const esp_lcd_rgb_panel_event_data_t *edata, void *user_ctx)
{
BaseType_t high_task_awoken = pdFALSE;
// V-Sync ์ ํธ๊ฐ ๋ฐ์ํ์ ๋๋ง LVGL Flush ์๋ฃ ์ธ๋งํฌ์ด๋ฅผ ํด์
xSemaphoreGiveFromISR(vsync_sem, &high_task_awoken);
return high_task_awoken == pdTRUE;
}
5. ๊ฒฐ๋ก ๋ฐ ์์ฝ ์ฒดํฌ๋ฆฌ์คํธ
ESP32-S3 ๊ธฐ๋ฐ์์ LVGL๊ณผ RGB ๋์คํ๋ ์ด๋ฅผ ํ์ฉํด ํ๋ฉด ์ฐข์ด์ง ์๋ ๋ถ๋๋ฌ์ด 60 FPS UI๋ฅผ ๊ตฌํํ๋ ํต์ฌ ์์๋ ๋ฉ๋ชจ๋ฆฌ ๋ฒ์ค ๋์ญํญ ๊ด๋ฆฌ์ ๋ฐ์ด์ค ๋ฒํผ์ ์ฌ๋ฐ๋ฅธ ํ์ฉ์ ๋๋ค.
| ์ ๊ฒ ํญ๋ชฉ | ๊ถ์ฅ ์ต์ ํ ์ค์ |
|---|---|
| PSRAM ๋์ ๋ชจ๋ | Octal SPI @ 80MHz (DDR) ํ์ ์ ์ฉ |
| Bounce Buffer ํฌ๊ธฐ | ํด์๋ ๋๋น x 10~20 ๋ผ์ธ (๋ด๋ถ SRAM DMA ๋ฉ๋ชจ๋ฆฌ ํ ๋น) |
| PCLK (Pixel Clock) | 16MHz ~ 20MHz ์ฌ์ด ํํ์ ๊ฒ์ (๋์ญํญ ๋ถ์กฑ ์ํ) |
| LVGL ๋ ๋ ๋ชจ๋ | Direct Mode (`LV_DISP_RENDER_MODE_DIRECT`) ์ฌ์ฉ |
| ๋๊ธฐํ ๊ธฐ์ | RGB Panel V-Sync ์ธํฐ๋ฝํธ ๊ธฐ๋ฐ ํ๋ ์๋ฒํผ ์ค์ํ ๊ตฌํ |
์๋ฒ ๋๋ ๊ทธ๋ํฝ ๊ฐ๋ฐ ์ ์ ๊ฐ์ด๋๋ฅผ ๋ฐํ์ผ๋ก ๋๋ฒ๊น ๊ณผ ๋ฉ๋ชจ๋ฆฌ ํ๋์ ์งํํ๋ค๋ฉด, ESP32-S3์ ํ๋์จ์ด ํ๊ณ๋ฅผ ๋์ด ์ค๋งํธ์์น๋ ๊ณ ๊ธ ๊ฐ์ ์ ํ ์์ค์ ๋งค๋๋ฝ๊ณ ์์ ์ ์ธ GUI๋ฅผ ์์ฑํ ์ ์์ ๊ฒ์ ๋๋ค.