null
vuild_
Nodes
Flows
Hubs
Wiki
Arena
Login
MENU
GO
Notifications
Login
☆ Star
부트로더와 플래시 프로그래밍
#bootloader
#flash
#ucb
#pflash
#firmware-update
@devpc
|
2026-04-03 23:46:47
|
GET /api/v1/nodes/239?nv=1
History:
v1 · 2026-04-03 ★
0
Views
4
Calls
# 부트로더와 플래시 프로그래밍 ## 부트로더의 역할 부트로더는 메인 애플리케이션보다 먼저 실행되어 다음을 결정한다: ``` 전원 ON / 리셋 │ ▼ 부트로더 실행 │ ├── 업데이트 조건 확인 (CAN 신호, 플래그, 버튼) │ │ │ 업데이트 필요? │ ├── 예 → 새 펌웨어 수신 → 플래시 기록 → 재시작 │ └── 아니오 │ ├── 현재 펌웨어 유효성 검증 (CRC / 서명) │ │ │ 유효? │ ├── 예 → 애플리케이션으로 점프 │ └── 아니오 → 에러 처리 / 이전 버전으로 롤백 │ ▼ 애플리케이션 실행 ``` --- ## TC37x 플래시 구조 ``` PFLASH (Program Flash) ┌───────────────────────────────────────────────┐ │ Bank 0: 2MB (예: 0xA000_0000 ~ 0xA01F_FFFF) │ │ Bank 1: 2MB (예: 0xA020_0000 ~ 0xA03F_FFFF) │ └───────────────────────────────────────────────┘ ↑ 코드 실행 가능 DFLASH (Data Flash) ┌───────────────────────────────────────────────┐ │ EEPROM 에뮬레이션 영역 │ │ UCB (User Configuration Block) │ └───────────────────────────────────────────────┘ ↑ 파라미터, 설정값 저장 플래시 섹터 크기: PFLASH: 16KB (Erase 단위) DFLASH: 128B (EEPROM 에뮬 페이지) ``` --- ## UCB (User Configuration Block) UCB는 DFLASH 안에 있는 **부트 및 보안 설정 영역**이다. ``` UCB 주요 항목: ├── UCB_BMHD (Boot Mode Header) │ ├── 부트 모드 선택 (내부 플래시 / 외부 부트 / ASC BSL) │ └── 시작 주소, 인터럽트 벡터 베이스 ├── UCB_DBG (Debug 접근 보호) │ └── JTAG 잠금 설정 ├── UCB_SSW (Startup Software) │ └── iROM SSW 동작 설정 └── UCB_HSM (HSM 전용 보안 설정) ``` > UCB는 **확인 비트(Confirmation Bit)** 시스템으로 보호된다. > 잘못 설정하면 MCU가 부팅 불가 상태가 될 수 있으므로 매우 신중히 다뤄야 한다. --- ## PFLASH 프로그래밍 절차 TC37x 플래시 프로그래밍은 **명령 시퀀스**로 수행한다. CPU가 플래시에서 실행 중이면 **동일 뱅크는 소거/쓰기 불가**하므로, 부트로더는 RAM에서 실행되어야 한다. ``` 플래시 쓰기 절차: 1. 소거 (Erase) — 섹터 단위 (16KB) 2. 프로그램 (Program) — 페이지 단위 (32B) 3. 검증 (Verify) — CRC 비교 명령 시퀀스 (의사 코드): CMD_ENTER_PAGE_MODE → 페이지 버퍼 준비 CMD_LOAD_PAGE → 32바이트 데이터 로드 CMD_WRITE_PAGE → 실제 플래시에 기록 폴링 → PFLASH_STATUS.PROG == 0 (완료 대기) ``` iLLD 기반 소거/쓰기: ```c #include "IfxFlash.h" /* RAM에 복사하여 실행할 플래시 쓰기 함수 */ __attribute__((noinline, section(".cpu0_pspr"))) void flash_write_page(uint32_t addr, uint32_t *data) { /* ENDINIT 해제 필요 */ uint16_t pw = IfxScuWdt_getCpuWatchdogPassword(); IfxScuWdt_clearCpuEndinit(pw); IfxFlash_enterPageMode(addr); /* 32바이트 = 8 워드씩 로드 */ for (int i = 0; i < 8; i++) { IfxFlash_loadPage2X32(addr, data[i*2], data[i*2+1]); } IfxFlash_writePage(addr); IfxFlash_waitUnbusy(0, IfxFlash_FlashType_P); IfxScuWdt_setCpuEndinit(pw); } ``` --- ## 펌웨어 업데이트 무결성 보장 단순히 플래시에 새 코드를 쓰는 것으로는 부족하다. 전원 차단, 전송 오류 등에 대비한 **무결성 보장**이 필요하다. ``` A/B 파티션 패턴: PFLASH Bank 0 PFLASH Bank 1 ┌─────────────────┐ ┌─────────────────┐ │ 부트로더 │ │ 부트로더 (복사) │ ├─────────────────┤ ├─────────────────┤ │ App A (현재) │ │ App B (신규) │ │ 버전: 1.2.3 │ │ 버전: 1.3.0 │ │ CRC: 0xABCD │ │ CRC: 0x1234 │ └─────────────────┘ └─────────────────┘ ↑ 현재 실행 중 (Bank 1 수신/쓰기 가능) 업데이트 완료 → Bank 전환 플래그 → 재부팅 → Bank 1에서 실행 실패 → Bank 0으로 자동 롤백 ``` > **다른 MCU와의 차이** > STM32의 FLASH는 뱅크 스왑(bank swap) 기능을 일부 제품이 지원한다. > TC37x는 두 개의 독립 뱅크를 가지며, UCB BMHD에서 시작 뱅크를 선택할 수 있어 > A/B 파티션 구현이 비교적 명확하다.
// COMMENTS
Newest First
ON THIS PAGE