Firmware Engineering · MCU

Nuvoton Cortex-M0 韌體:從 datasheet 到 TFT 驅動

以 Nano130KE3BN 為平台,實作 EBI 並列匯流排 TFT 驅動、RGB565 圖像輸出、Flash 資源規劃與完整 Keil + J-Link 工作流。下方附互動式 Flash 預算計算器與 EBI 寫入時序觀察器。

Cortex-M0 · 42 MHz Nano130KE3BN Keil µVision 5 J-Link SWD EBI / SPI / I²C / UART RGB565
NANO130 KE3BN Cortex-M0 · 42 MHz 128 KB Flash · 16 KB SRAM EBI[0:15] SPI0 MOSI I²C SDA UART TX TFT RS GPIO LED PWM ADC
01

核心技術規格

hardware target
MCU Core
Cortex-M0
42 MHz · Thumb-2 · NVIC
Flash / SRAM
128 KB / 16 KB
on-chip ROM + RAM
Display Bus
EBI Parallel
memory-mapped I/O
Pixel Format
RGB565
16-bit · 2 B / px
Target Resolution
200 × 220
~86 KB payload
Toolchain
Keil + J-Link
ARMCC · ELF · SWD flash
02

Flash 預算計算器

interactive · flash_bytes = W × H × bpp/8 × N
Code / Data
30 / 128 KB
Image payload
86 / 128 KB
Total
116 / 128 KB
Headroom
12 KB
fits in on-chip Flash
03

Flash-resident 影像 + EBI blit 實作

img2.c · main.c
img2.c — 200×220 RGB565 · Flash-resident
/* Generated via Rinky-Dink RGB565 converter.
   const keyword pins the array into Flash —
   zero SRAM allocation at runtime. */
const unsigned short img2[44000] = {
    0x0000, 0x0000, 0x1082, 0x2965, 0x41A7, 0x62AB,
    0x832F, 0xA4B3, 0xC636, 0xE7BA, 0xFFFF, 0xFFDE,
    /* ... 44 000 entries — each a 16-bit RGB565 pixel ... */
};
main.c — EBI write loop
/* Memory-mapped I/O: writing to an EBI-mapped
   address emits one pixel on the bus. */
void tft_blit(const uint16_t *buf, uint32_t n) {
    for (uint32_t i = 0; i < n; i++) {
        EBI_WRITE_DATA(buf[i]);    // asserts CS/WR strobe
    }
}

int main(void) {
    SYS_Init();            // clock tree + multifunction pins
    EBI_Open(0, 16);      // 16-bit bus on bank 0
    TFT_Init();            // controller reset + init sequence
    tft_blit(img2, 44000);
    while (1) { __WFI(); }    // sleep, wake on interrupt
}
04

EBI 寫入時序觀察器

interactive · compare tAS / tWP margins
WR cycle: CS → WR → DATA latched
CS WR DATA[15:0]
tAS (address setup) 6 ns
tWP (WR pulse width) 24 ns
tAH (address hold) 6 ns
latched byte 0xA4B3 ✓
05

PNG → MCU toolchain

5-step build pipeline
影像輸入
PNG / JPG,建議 200 × 220 以下
RGB565 轉換
Rinky-Dink converter 輸出 C header
加入專案
替換 img2.c,以 const 鎖進 Flash
EBI 時序對齊
設 tAS / tAH 匹配 TFT setup/hold
J-Link 燒錄
SWD flash,以邏輯分析儀驗證波形
06

實作難點 & 處置

problem → mitigation
Issue
Flash 容量不足
單張 200×220 RGB565 約 86 KB,加上 code 僅剩 12 KB 餘裕,無法容納第二張圖。
Fix
外掛 SPI Flash
影像移至 W25Q 系列,MCU 以 SPI DMA 逐行讀入 line buffer 後送 EBI。
Issue
EBI 時序不匹配
TFT 顯示亂碼或局部列遺失,根因通常為 setup / hold 未滿足控制器要求。
Fix
邏輯分析儀校正
量測 CS / WR / RD 波形反推 tAS / tAH 至穩定範圍,完成後鎖定設定。
Issue
Keil 32 KB 編譯上限
免費版本無法完整連結含大型 image 陣列的專案。
Fix
申請 PSN 教育授權
以學生身份取得免費教育版 license 解除限制。
07

教學系列

YouTube · Nano MCU playlist
08

技術文章

blog
09

跨域延伸

DSP × biomed
硬體 · 韌體 · 演算法 · 應用層整合

以 MCU 韌體為基礎,延伸至 ECG / PPG 生理訊號 FIR / IIR 濾波與心率擷取,與站內的 蛋白質 AINGS pipeline基因 AI 共同構成從感測器到模型推論的完整工程鏈。