Target
Board
STM32F765(W5500)
Host
Raspberry Pi CM5
목표
W5500 TCP/IP 이더넷 통신 속도 개선

 

1. 배경

: Raspberry Pi CM5 ↔ STM32F765(W5500) TCP/IP 이더넷 통신 구성

CM5는 기본 이더넷 포트가 1개(eth0) 있는데 외부 통신용으로 할당하여, STM32F765(W5500)과 통신을 위해 USB to Ethernet(AX88772C, eth1)을 추가로 구성했다.

 

2. 문제점

: CM5 eth1 ↔ STM32F765(W5500) 경로에서만 통신이 느려짐

CM5 eth1 ↔ STM32F765(W5500) 통신할 때 파일 전송이 느리고, 중간중간 뚝뚝 멈추는 현상이 발생. 반면 CM5 eth0(네이티브)로는 문제가 없었다.

 

3. 원인 규명

  • 현상1 : 케이블/W5500 자체 문제 아님. 유실(loss)은 항상 0, TCP가 복구.
  • eth1(USB)은 재전송 272건·~1.0Mbps, eth0(네이티브)는 재전송 0건·~1.7Mbps로 확연히 차이.
  • 이 시점 가설: USB 배칭(batching)으로 패킷이 버스트로 나가서 W5500 8KB 버퍼를 순간적으로 초과 → 재전송.

 

  • 현상 2 : 체감상 느려 보였지만, 실제로는 멈춤이 반복된 것
  • 로그를 보니 실제로는 200ms 이상 뚝 끊기는 간헐적 정지였다(정상 구간은 1~11ms, 그 중간값은 전혀 없었음). 이 멈춤 길이는 CM5의 재전송 대기시간(RTO)과 정확히 일치 — 즉 "멈춤 = 재전송 대기".
  • 원인은 eth1(USB 랜칩 AX88772C)이 USB 특성상 데이터를 뭉쳐서 내보내며 패킷 순서가 실제로 뒤바뀌는 것(reord_seen 6~7회 로그 확인). 보통 TCP는 SACK으로 "몇 번만 빠졌다"고 알아채 재정렬하지만, W5500엔 SACK이 없어(데이터시트 확인) 순서만 바뀐 것도 유실로 간주해 뒤를 통째로 재전송한다.
  • 게다가 수신 버퍼가 2KB(조각 2개분)라 중복 ACK이 3번 쌓이지 못해 "빠른 재전송(~0.1ms)" 대신 "느린 재전송(RTO 200ms)"으로 빠진다.
  • eth0는 SoC 전용 하드웨어가 DMA로 처리해 순서 뒤바뀜 자체가 없어 문제가 안 드러났을 뿐, 버퍼는 eth0도 똑같이 2KB였다(같은 약점이 있지만 회선이 깨끗해 발현 안 됨).

 

4. 조치 (STM32F765 펌웨어)

① SPI 클럭 상향 (1.7MHz → 27MHz)

: SPI_BAUDRATEPRESCALER_64 → SPI_BAUDRATEPRESCALER_4 (64분주→4분주, 16배).

static void MX_SPI1_Init(void)
{

  /* USER CODE BEGIN SPI1_Init 0 */

  /* USER CODE END SPI1_Init 0 */

  /* USER CODE BEGIN SPI1_Init 1 */

  /* USER CODE END SPI1_Init 1 */
  /* SPI1 parameter configuration*/
  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
  hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 7;
  hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
  hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN SPI1_Init 2 */

  /* USER CODE END SPI1_Init 2 */

}
 

- 동작 원리

: W5500 RX 버퍼의 데이터를 꺼내오는 유일한 통로가 SPI. SPI가 느리면 읽기 자체가 오래 걸려 다음 폴링까지 지연이 길어짐.

- 효과 범위

: 읽는 시간만 줄임 ; 2KB 한 번 읽기가 계산상 9.7ms→0.6ms, 로그 실측도 11ms→1~2ms로 일치. 재전송 대기(멈춤)에는 영향 없음.

 

② 수신 버퍼 2KB → 8KB

#ifndef W5500_MAX_BUF_K
#define W5500_MAX_BUF_K 8 // default 2k, MAX 8,
#endif
 

- W5500은 총 16KB RX 버퍼를 8개 소켓에 나눠 씀. 기존엔 8소켓×2KB 균등분배({2,2,...,2}). 파일소켓 하나에 8KB를 몰아주려면 나머지 소켓을 줄여야 함.

- 핵심 메커니즘

: TCP는 "빠른 재전송"(중복ACK 3회→즉시재전송, ~0.1ms)과 '느린 재전송'(RTO 타임아웃, ~200ms) 두 경로가 있다. 버퍼 2KB(조각 2개분)면 뒤에 최대 1개만 쌓여 중복ACK 1번뿐 → 3번을 못 채워 200ms RTO를 그대로 기다림. 버퍼 8KB(조각 8개분)로 늘리면 뒤에 최대 7개가 쌓여 중복ACK 3회 조건을 즉시 만족 → 0.1ms 만에 회복.

- 정리

: eth1의 패킷 순서 뒤바뀜 자체는 못 없애지만, W5500에 없는 SACK 기능을 '버퍼 확대로 빠른 재전송 유도' 방식으로 대체 보완한 것.

 

중요: ①만 단독 적용하면 오히려 느려짐(1.649초→2.207초). ①은 "읽는 속도"를, ②는 "오류 시 멈춤 회복"을 고치는 것이라 서로 다른 문제이기 때문에 ①+②를 함께 적용해야 효과가 남.

 

5. 결과

SPI속도, 버퍼
총 소요시간
재전송 비율
개선 전 (1.7MHz, 2KB)
1.649초
0~8.5%
①만 (27MHz, 2KB)
2.207초
6.1~15.2% (오히려 악화)
①+② (27MHz, 8KB)
0.175초
18~39% (더 늘었지만 총시간은 최소)
  • 개선 전 대비 약 9.4배 빨라졌다. 체크섬(c=cc)도 3개 파일 모두 일치해 데이터가 깨지지 않았음을 확인했다. 다시 말해 이번 조치는 "오류(순서 뒤바뀜)를 없앤 것"이 아니라, 오류가 나도 빠르게 회복하도록 만든 것이다. W5500에는 없는 SACK 기능을, 버퍼를 키워서 대신 채워준 셈이다.
  • 이번 개선(SPI 27MHz + 버퍼 8KB)으로 멈춤 문제는 해결했고 실측 처리량도 최대 약 6.9Mbps까지 나왔다. 다만 W5500은 RX/TX 각 16KB뿐인 소형 버퍼로 동작하는 임베디드용 이더넷 칩이라, 이 정도가 실질적인 상한에 가깝다. 소용량 데이터를 주고받는 임베디드 통신에는 충분하지만, 대용량 파일 전송이나 고속 스트리밍용으로는 여전히 부족한 대역폭이다. 더 큰 대역폭이 필요하면 SPI 클럭을 더 올리는 정도로는 한계가 있고, 아키텍처 자체(예: 네이티브 이더넷 MAC 탑재 MCU, 또는 별도 고속 인터페이스)를 바꿔야 한다.

 

'ST > MCU' 카테고리의 다른 글

리눅스 기반 임베디드 플랫폼 선택을 위한 SoC/MPU 비교표  (0) 2025.05.14
ST Stellar(스텔라) 32-bit automotive MCU  (1) 2025.04.24
MCU(4) - NXP  (0) 2025.03.17
MCU(3) - Infineon  (0) 2025.03.17
MCU(2) - TI  (0) 2025.03.17

 

임베디드 프로그래밍 언어 트렌드

데이터와 해석 기준

  • 항목: 현재 진행 중인 임베디드 프로젝트에서 '주로'사용하는 언어
  • 연도: 2017, 2019, 2023
  • 그래프 비교는 C, C++, Python, Assembly, Java, C# 공통 항목으로 구성
  • C: 56% → 56% → 52%, 여전히 1위
  • C++: 23% 정점 후 **18%**로 하락
  • Python: 3% → 6% → 5%, 완만한 상승 뒤 보합
  • Assembly·Java·C#: 저변 유지
  • 분야별 현실: MCU/RTOS = C 중심, 임베디드 리눅스 = C/C++ + Python 조합이 일반적
  • 주 사용 언어 하나만 응답하는 구조이므로, 보조 스크립트(특히 Python)의 체감 점유는 현장에서는 더 높게 느껴질 수 있음

왜 C가 1위인가?

  • 리소스 제약·하드 리얼타임 환경에서 오버헤드가 작다
  • 드라이버·SDK·레거시 자산이 방대하다
  • 빌드·디버그·테스트 체계가 예측 가능하다

 

C++은 왜 줄었나

  • 소형 제품·초저가 MCU 비중에서 C만으로 충분한 케이스가 지속
  • 언어·런타임 복잡도에 민감한 팀에서 보수적 선택이 유지
  • 반면 임베디드 리눅스의 멀티미디어·네트워킹 영역에선 C++17/20 채택이 견고

 

Python은 어디서 강한가

  • 테스트·툴링·프로토타이핑에 사실상 표준
  • SBC 애플리케이션층에서 UI·네트워킹·AI 래핑에 광범위하게 활용
  • 펌웨어 본체(드라이버·RT)에는 여전히 C/C++이 중심

 

그 외 언어

  • Assembly: 부트·핵심 루프 등 극소 영역에 한정
  • Java/C#: 산업 단말의 상위 HMI·앱층에 제한적 존재
  • Ada: 항공·방산·철도 등 안전 분야에서 실전 채택 유지
  • Rust: 관심 급증, 채택은 점진적(보안·안전성 요구 모듈부터 도입 시도)

 

상황별 권장 스택

MCU/RTOS (STM32, NXP, ESP 등)

  • 코어/드라이버: C
  • 성능 임계부: C/어셈블리
  • 툴·테스트·스크립트: Python

 

임베디드 리눅스 SoC (Raspberry Pi, i.MX, Jetson 등)

  • 커널/드라이버: C
  • 서비스·라이브러리: C/C++
  • 앱/자동화/UI/AI 래핑: Python(+ C/C++ 바인딩)
  • 보안·안전 민감 모듈: Rust 부분 도입

 

체크리스트

  • MCU/RTOS 신규 프로젝트: C 기본, 임계부만 어셈블리, 테스트 파이프라인은 Python
  • 임베디드 리눅스: C/C++ 코어 + Python 앱층 혼합
  • 장기 유지·보안 중시: 신규 모듈부터 Rust 파일럿 고려
  • 팀 역량과 온보딩 비용을 언어 선택에 반영

결론

  • C는 여전히 왕좌이나, 플랫폼 레이어별 역할 분담이 중요
  • 하드웨어에 가까울수록 C, 애플리케이션에 가까울수록 C++/Python 비중이 커짐
  • 보안·안전성 요구가 높을수록 Rust의 기회가 확대됨
  • 언어 선택은 성능·안전·생산성·팀 역량의 균형에서 결정하는 것이 현실적

 

 

1. 포토커플러(Photocoupler) : 이하 PC357기준으로 설명

- PC357은 입력 LED와 출력 포토트랜지스터가 들어 있는 4핀 SMD 포토커플러

- 입력과 출력을 전기적으로 분리하면서 ON/OFF 신호를 전달. 주로 센서 입력, PLC, MCU 입력 보호, 서로 다른 GND 사이의 신호 전달에 사용.

 

2. 핀 구성

명칭
기능
1
Anode
입력 LED 양극
2
Cathode
입력 LED 음극
3
Emitter
출력 트랜지스터 이미터
4
Collector
출력 트랜지스터 컬렉터

- 입력 LED가 켜지면 포토트랜지스터가 켜져 출력 전압을 Low로 당김

- 출력은 전압을 직접 만들어내는 로직 출력이 아니라 전류를 GND로 당기는 오픈 컬렉터 형태이므로 일반적으로 풀업저항이 필요.

 

3. 주요 전기적 사양

- 순방향 전류 IF의 절대 최대정격은 50mA이나, 실제 특성은 IF=20mA 기준

- 순방향 전압 VF는 IF=20mA에서 typ 1.2V(max 1.4V)이므로, 저항 설계 시 이 전압강하를 반영

- Collector current IC는 IF=5mA, VCE=5V에서 typ 5mA로, 사실상 전류전달비(CTR)를 규정한다.

- IC의 편차는 min 2.5mA ~ max 30mA로 크므로, 설계는 최악값을 기준으로 여유를 둔다.

- 포화전압 VCE(sat)는 IF=20mA, IC=1mA에서 typ 0.1V(max 0.2V)다.

- IF를 20mA 가까이 흘리면 IC 1mA에서 VCE가 0.2V 이하로 떨어져 완전한 온(ON) 스위치로 동작

- 컬렉터-이미터 내압 VCEO는 80V, 컬렉터 전류 IC는 50mA, 컬렉터 손실 PC는 150mW는 권장 동작값이 아니라 절대최대정격으로, 실제 회로에서는 충분한 여유를 둬야함.

- 절연내압 Viso는 3.75kV(rms), 절연저항은 5×10¹⁰Ω 이상으로 입출력을 전기적으로 완전히 분리

- 응답속도는 상승시간 typ 4µs, 하강시간 typ 3µs(max 18µs)로, 저속 스위칭에 적합

 

4. CTR (Current Transfer Ratio)

  • 정의 : LED의 입력 전류(IF)에 대해 포토트랜지스터에서 출력되는 전류(IC)의 비율
CTR = IC / IF × 100 (%)

예를 들어 입력 전류가 5mA이고 CTR이 100%라면 출력 컬렉터 전류는 약 5mA

 

- CTR은 LED에서 발생한 광 신호가 포토트랜지스터에 얼마나 효과적으로 전달되는지 표시

- CTR은 퍼센트(%)로 표현되며, VCE=5V, 25℃ 조건에서 50~600%

회로는 최대 CTR이 아니라 사용할 모델의 최소 CTR을 기준으로 계산한다. 또한 CTR은

VCE=5V에서 측정한 값이므로, 출력이 포화되는 스위칭 회로에서는 계산값을 한계까지 사용하지 않고 여유를 둬야함.

 

5. hFE (DC Current Gain)

  • 사용 소자 : BJT(바이폴라 접합 트랜지스터)에서 사용
  • 정의 : 베이스 전류(IB)에 대해 컬렉터 전류(IC)의 비율
hFE = IC / IB
  • 설명 :

- hFE는 트랜지스터의 증폭 능력

- hFE는 특정 온도와 전류에서 정해지며, 일반적으로 데이터시트에 제공

구분
CTR
hFE
사용 소자
포토커플러
BJT
입력
LED 전류 IF
베이스 전류 IB
의미
광전류 전달비
전류 증폭률
표현
퍼센트
배율

→ CTR은 포토커플러의 전달비이고 hFE는 BJT의 증폭률

 

6. 사용 예제 회로

 

MCU 출력으로 PhotoCoupler를 On-Off

- PhotoCoupler를 사용하여 회로 분리

① TR의 IB대비 IC에 흐를수 있는 전류(hFE)를 최저 20배라고 놓고 설계

② PhotoCoupler의 증폭률은 50%로 설계

③ 위 회로는 PhotoCoupler의 출력에 OUTPUT의 입력 전류가 그대로 흐르게 된다.

→ PhotoCoupler의 출력의 Ic의 maximum 값은 50mA로, OUTPUT의 입력 전류가 이 값을 넘어가면 회로가 파손 될수 있고, 파손되지 않더라도 PhotoCoupler에 열이 많이 날 수 있음

 

 

7. 실무시 주요 참조 사항

- 입력 LED에는 반드시 전류 제한 저항을 사용

- 출력에는 일반적으로 풀업저항이 필요

- 입력 측과 출력 측 GND를 연결하면 갈바닉 절연의 장점이 사라짐

- IF가 1mA 미만이면 CTR 편차가 커질 수 있음

- LED는 장기간 사용하면 광출력이 감소하므로 최소 CTR에 추가적인 여유가 필요

- LED 전류를 지나치게 높이면 출력이 깊게 포화되어 OFF 전환이 느려질 수 있음

- 일반적인 ON/OFF 신호에는 적합하지만 빠른 통신에는 고속 포토커플러나 디지털 아이솔레이터가 적합

- 부품 절연 내압과 별도로 PCB의 공간거리와 연면거리도 검토해야 함

 

8. 출력 전류 IC와 입력 전류 IF와 출력 전압 VCE의 상관 관계

 

IF에 따른 IC를 알려면 데이터시트 Fig.8(IC–VCE)과 Fig.14(VCE–IF)를 같이 봐야 하는데, 두 그래프를 오가며 보기 어렵고 상관관계가 직관적으로 와닿지 않아서, IC = f(IF, VCE)를 3D로 합쳐 한눈에 볼수 있게 만들어 보았다.

(html  안되서 파일로 첨부)

 

 

 

 

PC357N_3D_interactive.html
5.13MB

 

 

 
Target
Board
Raspberry Pi CM5 + IO Board
Host
PC - Window
목표
Raspberry Pi CM5 - UI(Avalonia) 환경 구축

 

라즈베리 파이에서 UI를 구성할 때 여러 가지 선택지가 있는데, 주력 플랫폼은 크게 아래의 네 종류가 있다.

 

1. Qt (가장 전통적이고 실제 사용량이 가장 많음)

임베디드 리눅스 UI의 사실상 표준에 가까운 프레임워크

산업용 디스플레이, 제어기, 기기 UI에서 폭넓게 검증됨

라즈베리 파이에서도 하드웨어 가속, 안정성, 최적화 수준이 가장 높음

특징:

  • 성능·안정성 우수
  • 산업용에서 가장 많은 사례
  • 습득 난이도, 라이선스 고려 필요

 

2. Flutter (모던 UI용으로 빠르게 성장 중)

원래 모바일 UI지만, ARM 리눅스를 공식 지원하면서 파이에서도 활용 가능

애니메이션·렌더링 품질이 좋아 모던한 UI가 필요할 때 많이 고려됨

특징:

  • 크로스플랫폼 개발 속도 빠름
  • 예쁜 UI 제작에 유리
  • 런타임 리소스 요구량이 비교적 큼

 

3. Avalonia (.NET 기반 UI의 사실상 유일한 실전 선택지)

C#, XAML 기반으로 데스크톱 개발 경험을 그대로 가져올 수 있음

ARM64 파이에서 빌드·실행이 쉽고, .NET 기반 프로젝트와 궁합이 가장 좋음

특징:

  • .NET 생태계 활용
  • XAML 기반이라 UI 구조화가 편함
  • 임베디드 레퍼런스는 Qt·Flutter보다 적음

 

4. Web 기반 UI (실제로 많이 사용됨)

Electron이 아니라, WebView 또는 전체 화면 브라우저 기반 UI를 의미

라즈베리 파이 기반 키오스크, 대시보드, 관리 UI에서 자주 보임

특징:

  • HTML/CSS/JS로 개발 → 유지보수 매우 쉬움
  • PC·모바일·파이 모두 동일 UI 사용 가능
  • 복잡한 애니메이션·Native 성능은 한계가 있음

(참고: Electron은 기술적으로 가능하지만 리소스 부담이 커 실제 제품에서는 거의 안 씀)

 

추가로 언급할 수 있는 건 있지만, 실사용 비중이 매우 낮음

  • LVGL
  • Kivy (Python 기반)

 

여기서는 Avalonia로 UI 구성하는 방법을 설명한다.


 

Avalonia?

1. 개요

- Avalonia는 .NET 기반의 크로스플랫폼 UI 프레임워크

- C#과 XAML로 화면을 만들며 Windows / Linux / macOS / 임베디드 리눅스에서 동일 코드로 실행

 

2. UI 구성 방식

- XAML 기반 레이아웃, 스타일 시스템, 데이터 바인딩을 지원해서 데스크톱 수준의 일관된 UI 구조를 만들 수 있음

 

3. 성능 및 렌더링

- GPU 기반 렌더러를 사용해 고해상도 환경에서도 안정적이고 빠르게 동작

 

4. 배포와 환경 구성

- 독립 실행 형태로 배포할 수 있어 라즈베리 파이 같은 ARM 장치에서도 설정이 단순

 

5. 생태계 특징

- 오픈소스이며 .NET 라이브러리들과 자연스럽게 연동됨

- 라이선스 비용 부담이 없음

 

Avalonia를 라즈베리 파이에서 사용하기 위한 환경 구성 절차는 다음과 같음

1. NET 런타임 설치

2. 개발 환경 구성(PC)

3. 프로젝트 빌드 및 배포 파일 생성

4. 라즈베리 파이에 배포 및 실행

 


1. NET 런타임 설치

- 라즈베리 파이 OS(64비트 기준)에 Microsoft 패키지 저장소를 등록한 뒤 .NET SDK 설치

- Visual Studio 2022 설치 하면 .NET SDK는 같이 설치됨

- 확장 관리자에서 Avalonia 설치(Avalonia, Avalonia Template Studio)

설치 후 dotnet --info 명령으로 ARM64 환경이 정상 인식되는지 확인

 

 

 

3. 프로젝트 빌드 및 배포 파일 생성

다음 명령으로 라즈베리 파이용 실행 파일을 생성

dotnet publish -c Release -r linux-arm64 --self-contained true
 

이 방식은 .NET 런타임이 포함된 독립 실행 파일을 생성하므로 파이에 별도 설치가 필요 없음

 

 

4. 라즈베리 파이에 배포 및 실행

Publish 디렉터리 전체를 라즈베리 파이에 복사한 후 실행 파일을 실행

Avalonia는 X11 또는 Wayland 환경에서 자동으로 렌더링되며, 터치 디스플레이도 기본적으로 지원됨

 

 

Target
Board
Raspberry Pi5
Camera
Arducam V3Link Camera Solution
목표
Raspberry Pi5 - FPD-Link with MIPI CSI 구동

 

1. Arducam FPD-Link Camera Solution 테스트

- Raspberry Pi의 MIPI CSI-2 카메라는 센서를 보드 근처에 두는 것을 전제로 설계되었기 때문에 FPC 길이에 제한이 있음

- 기구 설계 관련하여 카메라를 보드에서 떨어진 위치에 배치해야 했음. 이를 위해 SerDes 기반 FPD-Link 를 테스트 해봐야 했고 Arducam V3Link Camera Solution을 구매함.

 

Arducam V3Link Camera Solution은 구성은 다음과 같음

  • Arducam FPD-Link Camera
  • Deserializer Board
  • Coaxial Cable

https://docs.arducam.com/V3Link-Camera-Solution/V3Link-Camera-Solution-for-Raspberry-Pi/Quick-Start-Guide/#package-list

 

Quick Start Guide - Arducam Wiki

Quick Start Guide Hardware Package List Connection of Camera Module Connection of camera and adapter board Final Steps Software Preparation Firstly, you should confirm the sensor of your camera module and execute the corresponding steps to access it. You c

docs.arducam.com

 


 

2. Raspbery Pi 시스템 설정

  • config.txt 수정
pi $ sudo nano /boot/firmware/config.txt
 

아래와 같이 수정

camera_auto_detect=0
.
.
dtoverlay=imx219
 

저장 후 재부팅

 

  • i2c 몇번에 장치가 붙었는지 확인
pi $ i2cdetect -l
 

Raspberry pi5 기준 CSI0는 4, CSI1는 6

 

  • 해당 장치에 0xc0가 있는지 확인
pi $ i2cdetect -y 6
 

 

  • Channel 1(CSI1) 카메라 선택
pi $ sudo i2ctransfer -f -y 6 w3@0x0c 0xff 0x55 0x01
 
  • Channel 1(CSI1) 카메라 영상 출력 확인
pi $ rpicam-still -t 0
 

 

  • Channel 2(CSI1) 카메라 선택
pi $ sudo i2ctransfer -f -y 6 w3@0x0c 0xff 0x55 0x01
 
  • Channel 2(CSI1) 카메라 영상 출력 확인
pi $ rpicam-still -t 0
 

FPD-Link 뒤에 연결되어 있지만 RPi에서는 일반 MIPI 카메라처럼 인식됨.


 

테스트 중 no camera 라면서 동작 하지 않는 문제가 있었는데 검색 결과, 특정 버전 이후로 Raspberry Pi I2C 신호 타이밍이 변경 된것으로 보인다.

그래서 과거 버전으로 rollback 해서 동작 확인 하였고, 내가 사용한 버전은 2024-03-15 버전이다.

 

https://forum.arducam.com/t/v3link-kit-no-cameras-available/6457/19

 

V3Link kit: no cameras available

The attempt to modify the baudrate has not been effective. This is the information before modification. sudo cat /boot/firmware/config.txt | grep dtparam= dtparam=i2c_arm=on #dtparam=i2s=on #dtparam=spi=on dtparam=audio=on dmesg | grep i2c [ 0.536821] plat

forum.arducam.com

 

 

1. GMSL, FPD-Link 사용 이유

임베디드·산업·자동차 시스템에서 카메라를 SoC 근처에 둘 수 없는 경우가 많은데 이때 가장 현실적인 해결책이 GMSL(Analog Devices)FPD-Link(Texas Instruments).

이 두 기술은 흔히 'MIPI 연장' 이라고 말하지만, 정확히 말하면 MIPI를 장거리로 끌고 가는 기술이 아니고 본질은 카메라의 위치 제약을 제거하기 위한 SerDes 링크 구조임.

 

1-1. 왜 MIPI는 그대로 연장할 수 없는가

MIPI CSI-2는 애초에 다음 전제를 기반으로 설계된 인터페이스

  • SoC 바로 근처에 센서 배치
  • PCB 트레이스 또는 짧은 FPC 전제
  • 수 cm ~ 수십 cm 이내 거리
  • 케이블, 커넥터 사용 비권장

 

그래서 현실적으로는 다음 문제가 발생

  • FPC 길이 증가 시 신호 무결성 붕괴
  • 외부 케이블 사용 시 EMI, skew, eye collapse 발생
  • 거리 확장은 사실상 불가능함

즉, MIPI에는 '연장'이라는 개념 자체가 없음.

 

1-2. SerDes 구조의 본질

GMSL과 FPD-Link는 MIPI 인터페이스가 아니라 입력 인터페이스를 직렬화하여 장거리 전송 가능한 링크로 변환하는 기술

 

기본 구조는 다음과 같음

CMOS Sensor

↓ (MIPI CSI-2 또는 병렬)

Serializer

↓ (Coax / STP 장거리 링크)

Deserializer

↓ (MIPI CSI-2 등)

SoC / CPU

 

여기서 핵심은 다음임.

  • MIPI는 짧은 구간에서만 유지
  • 장거리 구간은 SerDes 전용 물리계층
  • 케이블, 커넥터, EMI를 전제로 설계된 링크

그래서 정확한 표현은

'MIPI를 장거리로 연장한다'가 아니라 'MIPI 구간을 국소화한다'가 맞는 표현.


 

2. GMSL (Gigabit Multimedia Serial Link)

2-1. 개요

  • 제조사: Analog Devices(구 Maxim)
  • 주요 사용처: 자동차, 고신뢰 산업 시스템
  • 설계 성향: 링크 안정성, EMI 내성 우선

 

2-2. GMSL 대표 IC 구성

Serializer (카메라 모듈 쪽)

  • MAX9295A
  • MAX9296A
  • MAX96717 / MAX96717F (GMSL2)
  • MAX96799 (GMSL3)

대부분의 MIPI 카메라 모듈은

CMOS Sensor → MAX9295A 구조를 사용

 

Deserializer (SoC 보드 쪽)

  • MAX96712 (4채널 멀티카메라 허브)
  • MAX9296A
  • MAX96722
  • MAX96724 (GMSL3)

멀티카메라 시스템에서는

MAX96712가 사실상 표준

 

2-3. GMSL 구현 구조

[CMOS Sensor]
|
MIPI CSI-2
|
[Serializer: MAX9295A]
|
Coax / STP + PoC
|
[Deserializer: MAX96712]
|
MIPI CSI-2
|
[SoC]

 

2-4. GMSL 구현 절차

  1. CMOS 센서 해상도, FPS, MIPI lane 수 확정
  2. Serializer를 센서 출력 규격에 맞게 선택
  3. Deserializer를 카메라 수 기준으로 선택
  4. Bias-T 기반 PoC 회로 설계
  5. I2C 제어는 SerDes 내부 터널링 사용
  6. 초기화 순서는
  7. Deserializer → Serializer → Sensor 필수
  8. FSYNC, EQ, EMI 관련 기능은 자동 처리됨

 

2-5. GMSL 특성 요약

  • 케이블 길이와 편차에 매우 강함
  • EMI 환경에서 안정성 높음
  • 멀티카메라 동기 정확함
  • IC 단가와 설계 난이도는 높음

 

3. FPD-Link

3-1. 개요

  • 제조사: Texas Instruments
  • 주요 사용처: 산업용, 머신비전, 중저가 자동차
  • 설계 성향: 단순성, 비용 효율성 중시함

 

3-2. FPD-Link 대표 IC 구성

Serializer

  • DS90UB933
  • DS90UB953
  • DS90UB971 (FPD-Link IV)
  • DS90UB925 (병렬 RGB)

Deserializer

  • DS90UB960 (4채널 허브)
  • DS90UB964
  • DS90UB914

실무에서는

DS90UB953 + DS90UB960 조합이 가장 흔함.

 

3-3. FPD-Link 구현 구조

[CMOS Sensor]
|
MIPI CSI-2
|
[Serializer: DS90UB953]
|
Coax / STP + PoC
|
[Deserializer: DS90UB960]
|
MIPI CSI-2
|
[SoC]

 

3-4. FPD-Link 구현 절차

  1. 센서 출력 클럭과 lane 구조 확인
  2. Serializer 선택
  3. Deserializer로 카메라 수 집약
  4. TI 레퍼런스 기반 PoC 회로 설계
  5. I2C Alias 설정으로 주소 충돌 방지
  6. Link Lock 상태 확인

 

3-5. FPD-Link 특성 요약

  • 설정 구조 직관적
  • 비용 경쟁력 있음
  • 양산에 유리

EMI 성능은 PCB 레이아웃 영향 큼


4. 최종 정리

- GMSL과 FPD-Link는 서로 호환되지 않음

- Serializer와 Deserializer는 반드시 같은 계열로 구성해야 함

- 케이블이 같아도 내부 프로토콜은 완전히 다름

 

이 두 기술은 MIPI를 단순히 연장하는 방식이 아니라,

- 카메라의 위치 제약을 제거하기 위해 MIPI 구간을 최소화

- 장거리 구간을 SerDes 링크로 대체하는 구조

 

뭘 사용할지는,

- 케이블 길이

- EMI 환경

- 카메라 개수

- 비용 조건

이 네 가지에 의해 결정됨

 

'Raspberry Pi > Pi4 & Pi5' 카테고리의 다른 글

Raspberry Pi5 - FPD-Link with MIPI CSI  (0) 2026.01.17
Raspberry Pi4 - 크로스 컴파일 환경 구축(1)  (0) 2025.03.19
Raspberry Pi  (0) 2025.03.19

 

Raspberry Pi 5 + EDATEC 10.1인치 LCD를 사용 중이다. 최근 Raspbian이 Trixie로 업데이트 되었는데 LCD 드라이버가 제대로 동작하지 않는 문제가 발생했다. 여러 방법을 시도해봤지만 해결되지 않아, 결국 이전 버전으로 롤백하게 됐다. 여기서는 그 과정과 방법을 정리해두었다.

 

1. Rasberry pi OS

Raspberry Pi Foundation에서 개발한 공식 Raspberry Pi용 OS으로 Debian 기반으로 만들어진 배포판

 

2. Raspberry Pi OS 이력

날짜
릴리스(기반)
핵심 변화
2012-07-18
Raspbian (Debian Wheezy)
첫 공식 Raspbian SD 이미지 공개, 기존 Debian Squeeze 이미지 대체. Raspberry Pi
2015-09-29
Raspbian Jessie (Debian 8)
데스크톱 기본 부팅, LibreOffice 포함 등. Raspberry Pi

2016-09-28
PIXEL 데스크톱 도입
새 테마/아이콘/스플래시(PI‑Improved Xwindows Environment, Lightweight). Raspberry Pi
2017-08-17
Raspbian Stretch (Debian 9)
Debian 9 기반으로 업데이트. Raspberry Pi

2019-06-25
Raspbian Buster (Debian 10)
Pi 4 지원, OpenGL 비디오 드라이버 기본. Raspberry Pi

2020-05-29
이름 변경 → Raspberry Pi OS
32‑bit 업데이트 + 64‑bit 베타 공개. Raspberry Pi

2021-11-08
Raspberry Pi OS Bullseye (Debian 11)
GTK3 전환, KMS 디스플레이, 새 카메라 스택(libcamera), mutter 채택. Raspberry Pi
2021-12-02
Raspberry Pi OS (Legacy, Buster)
호환성 유지를 위한 레거시 브랜치 제공. Raspberry Pi

2022-02-02
Raspberry Pi OS 64‑bit 공식
arm64 정식 이미지 공개. Raspberry Pi

2023-10-11
Raspberry Pi OS Bookworm (Debian 12)
Wayland(wayfire) 기본(Pi 4/5), PipeWire, NetworkManager, 최적화된 Firefox. Raspberry Pi
2024-10-28
Bookworm 대규모 업데이트
Wayland 컴포지터를 wayfire → labwc로 교체, 모든 모델에서 Wayland 기본화. Raspberry Pi
2025-10-02
Raspberry Pi OS Trixie (Debian 13)
새 테마/글꼴, Control Centre 통합 설정 앱, 데스크톱 메타 패키지 도입. Raspberry Pi
 
Bookworm

Trixie

 

3-1. Raspberry Pi OS Download

https://www.raspberrypi.com/software/operating-systems/

 

Raspberry Pi OS downloads – Raspberry Pi

Raspberry Pi OS (previously called Raspbian) is our official, supported operating system.

www.raspberrypi.com

 

3-2. Raspberry Pi OS 이전 버전 Download

Raspberry Pi OS 공식적으로 이전 릴리스들을 아카이브 형식으로 보관하여 Raspberry Pi Imager에서 바로 Writing이 불가하다.

위 링크에서 원하는 버전의 View archive를 누르면 아래와 같이 이전 버전을 다운로드 할 수 있다.

 

Index of /raspios_arm64/images

 

downloads.raspberrypi.com

 

*.img.xy를 다운로드


 

 

4. Raspberry Pi Imager 실행

 

장치 선택 - 사용할 디바이스 선택

 

운영체제 선택 - 사용자 정의 사용

 

위에서 다운로드 받은 파일 선택(*.img.xz 압축 풀 필요 없음)

 

저장소 선택 후 Writing

 

 

 

1. STM32CubeIDE for VS Code

- Code editing

- Project build

- Automation

- Simplified debugging

라고 설명하고 있다.

 

메뉴얼이라고 만들어 놓은 pdf는 설치, 삭제만 달랑 적어놔서 사용하는데 한참 헤맴.

 

https://www.st.com/content/st_com/en/stm32-mcu-developer-zone/software-development-tools/stm32cubevscode.html?ecmp=tt46154_jk_enews_sep2025&mkt_tok=ODU2LVBWUC03MTUAAAGdhFroKMOR1L8tsWFmBRiNFi0kgX75HcMnbqwDFDSPF6ZGHcUp0aD_DYg1hF-SjG4HmClsm_l84rkyyzg_A120FUhrmTjauxAEWrPaajPs3JruPsg%EF%BB%BF

 

STM32Cube for VS Code - STMicroelectronics - STMicroelectronics

 

www.st.com

 

2. STM32CubeIDE vs STM32CubeIDE for VS Code

항목
STM32CubeIDE
STM32CubeIDE VS Code
무게감
무겁고 로딩 느림 (Eclipse 기반)
가볍고 빠름
설정 난이도
자동 설정 많음 → 초보자 친화
직접 설정 필요 → 숙련자 친화
빌드 시스템
Makefile 기반 (CubeMX 자동 생성)
CMake 기반 (자동화·CI에 유리)
디버깅
ST-LINK 완전 통합, 안정적
ST-LINK + Cortex-Debug로 가벼움
CubeMX 통합
IDE 내부에서 GUI 설정
CubeMX 따로 실행하거나 CLT 이용
확장성
제한적 (Eclipse 한계)
VS Code 확장 풍부, Git·Lint 등 연동 용이
대규모 프로젝트
안정적이지만 무거움
빠르지만 세팅 관리 중요
학습 곡선
낮음
중간 이상 (툴체인, CMake 이해 필요)

 

3. VSCode STM32CubeIDE 플러그인 설치

: VSC에서 Extension에서 STMCubeIDE 검색하여 install

: CubeCLT 설치 할 필요 없음. 필요한 파일은 위 통합팩에 다 들어있음.

 

4. STM32CubeMX에서 새 프로젝트 생성

VS Code에서 사용하는 여러 방법이 있겠지만 나는 아래 방법으로 하였다.

! CubeIDE에서 Toolchain 변경 안됨(하는 방법이 있긴 하나 억지로 건드려야 함)

! 결국 STM32CubeMX를 6.14.0 이후 버전을 설치(이후 버전 부터 Toolchain이 cmake 지원된다고 함)

! STM32CubeMX에서 새 프로젝트 생성

 

: STM32CubeMX

- MCU 선택

 

- Project Name, Location 입력, Toolchain → CMake 선택

 

- 기본 설정 & GENERATE CODE

 

: VS Code

- File - Open Folder... - 위에서 만든 폴더 오픈

 

- 하단 우측에 메시지가 뜨는데 'Bad CMake~'는 무시하고 아래의 'Would you like to configure discovered CMake project(s) as STM32Cube project(s)'는 Yes 클릭

 

- 하단의 Build 클릭

 

- Debug or Release 어느것으로 Build할껀지 선택 하여 Build

 

- 좌측 Run and Debug를 클릭해 STLink 확인(STLink를 연결한 상태)

 

- ST-Link Firmware 업그레이드

 

- 하단 우측에 'Successfully updated STLink Firmware' 메시지 확인

 

- STM32Cube:STLink GDB Server 클릭

 

- Build 성공 후, Debugger 연결이 안되서 STM32CubeProgrammer로 Download해 Build 확인 완료.

 

'ST > 개발 환경 및 구조' 카테고리의 다른 글

STM32F103x Core registers  (0) 2025.03.18
STM32F103x Memory map  (0) 2025.03.18
ST MCU/MPU Security Features  (0) 2025.03.18
CMSIS  (0) 2025.03.18
STM32 CubeMX LL driver  (0) 2025.03.18

 

기존 방법들의 단점:

  • SSH (PuTTY): 빠르지만 VI/NANO 같은 터미널 에디터만 사용 가능 → 불편함
  • 원격 제어 (VNC, XRDP): GUI 사용 가능하지만 느리고 딜레이 심함

 

VSCode + Remote-SSH 방식:

  • GUI 환경에서 편집 가능
  • 빠른 속도 (SSH 기반)
  • 파일/디렉터리 한눈에 확인
  • 무료 (Microsoft 개발)
 

VSCode 원격 접속 설정 방법

 

1. Raspberry pi : SSH 설정

: Preferences - Raspberry Pi Configuration

: Terminal 열어 ifconfig로 ip 확인


 

2. VSCode 다운로드 및 설치

https://code.visualstudio.com/

 
 

Visual Studio Code - Code Editing. Redefined

Visual Studio Code redefines AI-powered coding with GitHub Copilot for building and debugging modern web and cloud applications. Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows.

code.visualstudio.com

 

3. VSCode Remote-SSH 플러그인 설치

: VSC에서 Extension에서 remote -ssh 검색하여 install

 

4. VSCode SSH 접속 설정

: VSC에서 Remote Explorer - New Remote

: id(지정 안했으면 기본 'pi')@(Raspberrypi에서 확인한) ip 입력

 

또는,

: Open a Remote Window

: Connec to Host

: id(지정 안했으면 기본 'pi')@(Raspberrypi에서 확인한) ip 입력

 

: 접속이 되면 다음과 같이 어떤 플랫폼인지 선택

: 비밀번호 입력(지정 안했으면 기본 'pi')

: 접속 중

: 하단 왼쪽에 접속 확인

 

: VSC에서 Terminal - New Terminal

 

파일 열어서 편집도 가능

빠르면서도 편리한 GUI 기반 개발 가능!

 

 

 

 

1. Gemini Code Assist 설치

: Visual Studio Code가 설치 되어 있어야 한다.(이하 VSC)

: VSC에서 Extension에서 Gemini Code Assist를 검색하여 install

 

2-2. 왼쪽 다이아몬드 모양을 누르면 아래와 같이 사용 가능


2. GitHub Copilot 설치

: VSC에서 Extension에서 GitHub Copilot + GitHub Copilot Chat 검색하여 install

 

2-1. GitHub 계정 연결

: 상단 중앙 또는 하단의 개구리 모양(고글 쓴 로봇)을 누르면 사용 가능

 

Sign in to use Copilot for free 버튼을 클릭하여 Github 계정 연결.

GitHub 계정이 있으면 연결

없으면 Create an account 버튼 눌러서 계정 생성

 

2-2. GitHub Copilot 설정

https://github.com/settings/copilot/features

 

GitHub · Build and ship software on a single, collaborative platform

Join the world's most widely adopted, AI-powered developer platform where millions of developers, businesses, and the largest open source community build software that advances humanity.

github.com

 

: Settings - Copilot - Features

: 처음 접속하면 You are using Copilot for free 라고 뜨는데, 밑에 Start a free trial 버튼 클릭

 

: Copilot in GitHub.com → Enabled

: Copilot in GitHub Desktop → Enabled

 

 

'AI' 카테고리의 다른 글

Claude(클로드)에 Notion MCP Server 연결  (0) 2025.08.28
Claude(클로드)에 Figma MCP Server 연결  (0) 2025.08.26
클라우드 플랫폼이란?  (1) 2025.08.26

+ Recent posts