diff --git a/backend/server.js b/backend/server.js index 885def1..fec45ca 100644 --- a/backend/server.js +++ b/backend/server.js @@ -52,7 +52,7 @@ const upload = multer({ cb(new Error('.bin 파일만 업로드 가능합니다')); } }, - limits: { fileSize: 8 * 1024 * 1024 }, // 8 MB + limits: { fileSize: 32 * 1024 * 1024 }, // 32 MB }); // ── 라우트 ────────────────────────────────────────────────────────────────── @@ -68,13 +68,14 @@ app.get('/api/firmware', (_req, res) => { }); // 펌웨어 업로드 -// 지원 필드: firmware(필수), bootloader(선택), partitions(선택) +// 지원 필드: firmware(필수), bootloader(선택), partitions(선택), boot_app0(선택) app.post( '/api/firmware/upload', upload.fields([ - { name: 'firmware', maxCount: 1 }, - { name: 'bootloader', maxCount: 1 }, - { name: 'partitions', maxCount: 1 }, + { name: 'firmware', maxCount: 1 }, + { name: 'bootloader', maxCount: 1 }, + { name: 'partitions', maxCount: 1 }, + { name: 'boot_app0', maxCount: 1 }, ]), (req, res) => { try { @@ -105,7 +106,15 @@ app.post( }); } - // 부트로더가 따로 없으면 0x0, 있으면 0x10000 + if (files.boot_app0) { + parts.push({ + file: files.boot_app0[0].filename, + offset: '0xe000', + label: 'Boot App0', + }); + } + + // 부트로더가 따로 없으면(병합 바이너리) 0x0, 있으면 0x10000 const appOffset = flashAddress || (files.bootloader ? '0x10000' : '0x0000'); diff --git a/flash-guide.html b/flash-guide.html new file mode 100644 index 0000000..4f66755 --- /dev/null +++ b/flash-guide.html @@ -0,0 +1,717 @@ + + +
+ + +Arduino IDE 빌드 파일을 웹 브라우저에서 ESP32에 플래시하는 방법
+
+ Sketch → Export Compiled Binary 클릭 후 빌드 폴더
+ (build/esp32.esp32.esp32s3/ 등)에 생성되는 파일들입니다.
+
| 파일명 | +크기 (예시) | +플래시 주소 | +용도 | +사용 여부 | +
|---|---|---|---|---|
*.ino.merged.bin |
+ ~16 MB | +0x0000 |
+ 전체 병합 바이너리 (모든 파일 합본) | +✓ 권장 | +
*.ino.bootloader.bin |
+ ~20 KB | +0x0000 |
+ 부트로더 | +분리 방식 시 | +
*.ino.partitions.bin |
+ ~3 KB | +0x8000 |
+ 파티션 테이블 | +분리 방식 시 | +
boot_app0.bin |
+ ~8 KB | +0xe000 |
+ OTA 부트 선택자 | +분리 방식 시 | +
*.ino.bin |
+ ~1 MB | +0x10000 |
+ 애플리케이션 (실제 코드) | +분리 방식 시 | +
*.ino.elf |
+ ~15 MB | +— | +디버그 심볼 (GDB용) | +불필요 | +
*.ino.map |
+ ~17 MB | +— | +메모리 맵 (분석용) | +불필요 | +
flash_args |
+ ~200 B | +— | +esptool 플래시 인수 (참고용) | +참고용 | +
--flash-mode dio --flash-freq 80m --flash-size 16MB +0x0 bootloader.bin +0x8000 partitions.bin +0xe000 boot_app0.bin +0x10000 app.bin+
+ 모든 파티션이 하나로 합쳐진 *.merged.bin 파일 하나만 업로드합니다.
+ 가장 간단하고 오류 가능성이 낮습니다.
+
+ bootloader, partitions, boot_app0, app을 각각 업로드합니다. + 파일 크기가 작고 부분 업데이트가 가능합니다. +
+http://localhost:3100 (Docker와 같은 PC인 경우)
+ CANFD_Logger.ino.merged.bin (또는 프로젝트명.ino.merged.bin)을 드래그하거나 클릭하여 선택합니다.
+ + 단계 1~3(브라우저 준비 → USB 연결 → 시리얼 연결 확인)은 방법 A와 동일합니다. + 4단계부터 차이가 있습니다. +
+ +boot_app0.bin은 빌드 폴더가 아닌 Arduino ESP32 코어 폴더에 있을 수 있습니다.%LOCALAPPDATA%\Arduino15\packages\esp32\hardware\esp32\버전\tools\partitions\boot_app0.bin
+ | 증상 | 원인 | 해결 방법 |
|---|---|---|
| 포트 연결 버튼이 비활성화 | +Firefox/Safari 사용 | +Chrome 또는 Edge 89+ 사용 | +
| "지원되지 않는 브라우저" 배너 | +HTTP + 외부 IP 접속 | +Docker와 같은 PC에서 localhost:3100으로 접속 |
+
| 포트 선택창에 ESP32가 안 보임 | +드라이버 미설치 또는 케이블 불량 | +데이터 전송 가능한 USB 케이블 사용, CP2102/CH340 드라이버 설치 | +
| 플래시 후 부팅 안 됨 | +Flash 크기 불일치 | +Arduino IDE 보드 설정의 Flash Size가 실제 보드와 일치하는지 확인 후 재컴파일 | +
| 업로드 실패 (파일 크기 초과) | +merged.bin이 32 MB 초과 | +분리 파일 방식 사용 (앱만 ~1 MB) | +
| 플래시 중 연결 끊김 | +USB 전원 불안정 | +허브 대신 PC 직접 연결, 전원 공급이 충분한 포트 사용 | +
| BOOT 버튼 관련 오류 | +ROM 부트로더 진입 실패 | +BOOT 버튼을 누른 상태로 ESP32 연결 또는 RST 후 BOOT 누르기 | +
+ flash_args 파일에 기록된 플래그는 Arduino IDE가 컴파일 시 설정한 값입니다.
+ 웹 플래셔는 이 값을 바이너리에서 자동으로 읽으므로 별도 입력이 필요 없습니다.
+
| 플래그 | 값 (예시) | 의미 | 웹 플래셔 입력 필요? |
|---|---|---|---|
--flash-mode |
+ dio | +SPI 플래시 통신 방식 (DIO = Dual I/O) | +불필요 (바이너리 내장) | +
--flash-freq |
+ 80m | +플래시 클럭 주파수 (80 MHz) | +불필요 (바이너리 내장) | +
--flash-size |
+ 16MB | +플래시 메모리 용량 (실제 보드와 일치해야 함) | +불필요 (바이너리 내장) | +
| PSRAM 설정 | +컴파일 옵션 | +PSRAM 활성화 여부 (ESP32-S3 4MB/8MB PSRAM) | +불필요 (바이너리 내장) | +
| CPU 주파수 | +240 MHz | +프로세서 동작 클럭 | +불필요 (바이너리 내장) | +
| 환경 | 지원 | 비고 |
|---|---|---|
| Chrome 89+ | ✓ 지원 | 권장 |
| Edge 89+ | ✓ 지원 | 권장 |
| Firefox | ✗ 미지원 | Web Serial API 없음 |
| Safari | ✗ 미지원 | Web Serial API 없음 |
| http://localhost | ✓ 동작 | 보안 컨텍스트 예외 |
| http://192.168.x.x (IP) | ✗ 미동작 | HTTPS 필요 |
| https://도메인 | ✓ 동작 | SSL 인증서 필요 |
*.merged.bin 하나만 업로드 (권장) |
+ 분리 파일: bootloader + partitions + boot_app0 + app