마이크로 컨트롤러의 DFU 모드를 사용하여 현장에서 펌웨어 업데이트

작성자: Jacob Beningo

DigiKey 북미 편집자 제공

거의 모든 내장형 시스템은 현장에서 펌웨어를 업데이트하여 새로운 기능을 추가하거나 버그를 수정할 수 있는 기능이 필요합니다. 하지만 현장에서 펌웨어를 업데이트하려면 개발자가 부트로더를 프로그래밍하거나 타사 부품 제조업체로부터 부트로더를 조달해야 하는 어려움이 있습니다.

더 간단한 방법이 하나 있습니다. 이 기사에서는 많은 마이크로 컨트롤러에 내장되어 있지만 간과되기 쉬운 장치 펌웨어 업데이트(DFU) 기능을 사용하는 방법을 보여줍니다.

펌웨어 업데이트 옵션

부트로더를 처음부터 다시 개발하는 것은 간단하지 않습니다. 개발자는 여러 애플리케이션이 공존할 수 있도록 플래시 공간을 세밀히 분석해야 합니다. 그런 다음 프로그래밍 도구를 사용하지 않고 컴파일된 이진 표현을 마이크로 컨트롤러로 전송할 수 있는 몇 가지 방법을 개발해야 합니다. 이를 위해 통신 프로토콜을 개발하거나 새 이미지를 저장할 외장형 메모리를 추가하여 시스템 복잡성을 늘려야 합니다. 마이크로 컨트롤러에 있는 내장형 메모리의 양을 늘릴 수도 있습니다.

또한 부트로더는 시스템 상태를 설정하고 애플리케이션 코드로 바로 이동하는 것이 안전한지를 파악해야 하므로 소프트웨어가 자체적으로 복잡해질 수 있습니다.

맞춤형 부트로더를 사용하면 개발자에게 응용 분야에 필요한 높은 유연성을 제공할 수 있지만, 대부분의 응용 분야에는 개발자에게 해당되지 않는 펌웨어 업데이트 표준(예: USB 표준의 내장형 장치 펌웨어 업데이트(DFU) 클래스)이 있습니다. 이 방법을 사용하여 USB 포트를 통해 현장에서 마이크로 컨트롤러의 애플리케이션 코드를 업데이트하면 펌웨어 업데이트 프로세스와 개발 주기를 획기적으로 단축할 수 있습니다.

DFU가 널리 퍼짐에 따라 STMicroelectronics와 같은 일부 마이크로 컨트롤러 업체에서 ROM에 하드 코딩된 업데이트를 수행하는 데 필요한 소프트웨어를 제공하고 있습니다. 소프트웨어를 제공하지 않는 업체 중에는 DFU 지원 방법에 관한 예시 코드를 제공하는 경우도 있습니다.

DFU 지원 마이크로 컨트롤러 선택

DFU를 지원하는 가장 쉬운 방법은 DFU가 ROM에 이미 포함된 마이크로 컨트롤러(예: STMicroelectronics의 STM32 마이크로 컨트롤러)를 선택하는 것입니다. 물론, 개발자가 실험하는 데 가장 흥미 있는 장치는 STM32 IoT Discovery NodeSTM32F429 Discovery 키트 내의 장치입니다.

STMicroelectronics의 STM32 IoT Discovery Node 이미지

그림 1: STMicroelectronics STM32 IoT Discovery Node는 펌웨어 업데이트를 위한 DFU 모드 기능을 포함하는 STM32L475 MCU를 실행하는 ARM® Cortex®-M4 코어를 기반으로 합니다. 이 특정 장치는 IoT 노드로 사용하도록 설계되었습니다. (이미지 출처: STMicroelectronics)

STM32 IoT Discovery Node는 IoT 센서 모드로 사용하도록 설계된 경제적인 개발 기판입니다. 이 기판은 기판을 연결하는 데 필요한 다양한 인터페이스(Wi-Fi, Bluetooth 등)를 포함합니다. 내장 STM32L475를 사용하면 개발자가 인터넷에 연결하도록 설계된 장치에서 DFU 기능을 테스트 및 사용할 수 있습니다.

일반 독립형 장치에서 DFU를 테스트하려는 개발자에게는 STM32F429 Discovery 키트가 STM32F4 마이크로 컨트롤러 계열을 위한 경제적인 개발 키트로 잘 알려져 있습니다. 개발자가 이러한 마이크로 컨트롤러에서 DFU 테스트에 착수하는 방법에 대해 살펴보겠습니다.

STMicroelectronics의 STM32F429 Discovery 키트 이미지

그림 2: STMicroelectronics STM32F429 Discovery 키트ARM® Cortex®-M4 코어를 기반으로 합니다. 또한 이 경제적인 개발 기판의 MCU에는 펌웨어 업데이트를 위한 DFU 모드 기능이 포함되어 있습니다. (이미지 출처: STMicroelectronics)

간단한 DFU 예

DFU에 접근하는 방법은 마이크로 컨트롤러마다 다릅니다. 간단한 예로 개발자가 STM32L475 MCU를 실행 중인 장치에서 펌웨어를 업데이트하는 방법을 살펴보겠습니다.

앞서 언급한 대로 STM32 마이크로 컨트롤러에는 DFU 부트로더가 ROM에 내장되어 있습니다. 부트로더에 접근하기 위해 개발자는 MCU가 시작되는 동안 부트 핀 중 하나를 땅으로 당겨야 합니다. 부트 핀은 MCU가 부팅되는 모드를 제어합니다(예: 플래시, RAM 또는 DFU USB 모드(기본값)에서 부팅).

DFU를 사용하여 애플리케이션을 다운로드하기 위해 개발자가 별도의 작업을 수행할 필요가 없습니다. 많은 다른 도구 체인과 함께 GCC(GNU 컴파일러 모음)가 애플리케이션을 컴파일할 때 DFU 파일 생성을 지원합니다. 여기서 개발자는 파일을 저장할 위치만 결정하면 됩니다. 일반 애플리케이션과 마찬가지로 디버그 또는 개체 폴더에서 .dfu 파일을 찾을 수 있습니다.

DFU 파일은 이진, s-레코드, 16진수 파일 등과 같은 다른 애플리케이션 기록 형식과 유사합니다. 이 파일 형식에는 USB를 통해 중계되어 처리된 다음 플래시 내의 지정된 위치에 기록되는 주소 및 데이터 정보가 포함되어 있습니다. 프로세스는 매우 원활하게 진행되므로 개발자가 사용 중인 프로토콜을 검사할 필요가 거의 없습니다. 모든 작업이 백그라운드에서 추상화되므로 펌웨어 업데이트 프로세스와 개발 작업이 간소화됩니다.

개발자가 DFU를 사용하여 애플리케이션을 마이크로 컨트롤러에 전송하는 데 사용할 수 있는 다양한 도구가 있습니다. 사용 가능한 일반 명령줄 도구는 dfu-util이며, Linux 및 Windows®에서 오픈 소스 소프트웨어 패키지로 제공됩니다. 개발자가 STM 도구 체인을 사용하는 경우 STMicroelectronics의 DfuSe 애플리케이션(그림 3)을 활용할 수 있습니다.

STMicroelectronics의 DfuSe 도구 이미지

그림 3: STMicroelectronics DfuSe 도구를 사용하여 GCC 등과 같은 컴파일러에서 생성되고 DFU 지원 마이크로 컨트롤러에 로드되는 DFU 파일을 프로그래밍할 수 있습니다. (이미지 출처: Beningo Embedded Group)

DfuSe는 DFU 모드에서 켜지고 USB를 통해 컴퓨터에 연결되는 STM32 장치를 감지하는 Windows GUI 유틸리티입니다. 개발자는 프로그래밍된 업체 및 제품 ID와 같은 정보를 검색할 수 있습니다. 플래시 공간이 적절히 확보되지 않을 경우 MCU의 메모리 내용을 복사한 후 업로드 작업 대화 상자를 사용하여 컴퓨터에 저장할 수 있습니다.

개발자는 DfuSe를 사용할 때 일반적으로 업그레이드 또는 확인 작업 섹션만 사용합니다. 이 영역에서 개발자는 DFU 애플리케이션 파일을 선택한 다음 업그레이드 버튼을 선택할 수 있습니다. 그러면 DfuSe에서 전체 파일이 MCU에 로드될 때까지 펌웨어 업데이트 프로세스를 자동으로 조정합니다. 그런 다음 개발자는 이미지가 성공적으로 수신되었는지 확인할 수 있습니다. 확인 후 부트 핀을 기본 구성(예: 플래시로 부팅)으로 다시 설정할 수 있습니다. 그러면 업데이트된 펌웨어를 로드하여 실행할 수 있도록 ‘DFU 나가기’ 모드가 선택됩니다.

DFU를 지원하지 않는 장치에서 DFU 사용

마이크로 컨트롤러의 ROM에는 DFU 부트로더가 포함되어 있지 않으므로 개발자가 DFU 기능을 활용할 수 없습니다. DFU는 USB 클래스이며 많은 USB 스택에서 지원됩니다. 즉, 개발자가 애플리케이션 프레임워크에 DFU 기능을 쉽게 추가하여 DFU 업데이트를 계속 수행할 수 있습니다.

예를 들어, Microchip TechnologyAT32UC3A3에는 DFU 모드가 내장되어 있지 않습니다(그림 4). 개발자는 DFU 작동 방식과 개발자가 DFU를 지원하도록 마이크로 컨트롤러를 적절히 구성하는 방법을 설명하는 간단한 응용 예제를 따를 수 있습니다.

Atmel의 AT32UC3A3 UC3-A3 XPLD AVR®32 MCU 32비트 AVR 내장형 평가 기판 이미지

그림 4: AT32UC3A3 UC3-A3 XPLD AVR®32 MCU 32비트 AVR 내장형 평가 기판에는 DFU 온칩이 포함되어 있지 않지만 DFU 펌웨어 업데이트 기능을 지원하는 프레임워크 USB 코드를 추가할 수 있습니다. (이미지 출처: Microchip Technology)

펌웨어 업데이트를 수행하기 위한 유용한 정보

현장에서 펌웨어를 업데이트할 때 반드시 DFU 지원 마이크로 컨트롤러에서 작업을 수행할 필요는 없습니다. 개발자는 펌웨어를 업데이트하는 대체 방식이 필요하거나 더 실질적인지를 판단할 수 있습니다. 이러한 경우 펌웨어 업데이트 프로세스와 관련하여 개발자가 명심해야 하는 몇 가지 팁이 있습니다. 모듈 키트에는 다음이 포함됩니다.

  • 체크섬 또는 해시를 사용하여 마이크로 컨트롤러 메모리에 기록될 애플리케이션을 확인합니다.
  • 문제가 발생할 경우 펌웨어 버전을 롤백할 수 있도록 펌웨어 백업 복사본을 저장하는 데 충분한 메모리가 있는 마이크로 컨트롤러를 선택합니다.
  • 마이크로 컨트롤러에 내장된 플래시로더가 있고 최종 사용자가 실수로 플래시로더를 트리거할 수 있는지 여부를 확인합니다.
  • 소프트웨어 부트로더가 컴파일되고 크기에 맞게 최적화되어 있는지 확인합니다.
  • 애플리케이션을 메모리에서 읽고 리버스 엔지니어링할 수 없도록 플래시 주변 소자를 잠급니다.
  • 항상 스택 포인터, 벡터 테이블 및 프로그램 카운터 레지스터가 적절한 애플리케이션 값으로 설정되어 있는지 확인합니다.
  • KL46Z Freedom Board에서 설명한 대로 대체 업데이트 방법(예: USB MSD를 사용하여 드래그 앤 드롭 업데이트)을 사용해 보세요(그림 5).

NXP Semiconductor의 KL46Z Freedom Board 이미지

그림 5: NXP Semiconductor의 KL46Z Freedom Board는 기본적으로 DFU를 지원하지 않는 경제적인 개발 기판입니다. 개발자는 새 펌웨어 이미지를 내장 메모리로 끌어서 놓는 USB MSD와 같은 대체 업데이트 방법을 사용할 수 있습니다. (이미지 출처: NXP Semiconductor)

결론

거의 모든 내장형 시스템은 리콜 방지를 위해 현장에서 애플리케이션 코드를 업데이트할 수 있는 방법이 필요합니다. 부트로더를 처음부터 생성하거나 기존 부트로더를 수정할 경우 작업이 복잡할 뿐 아니라 개발 주기에 통합해야 하는 문제가 있습니다.

개발자는 USB 표준에 내장된 검증된 DFU 기능을 활용하여 힘들이지 않고 현장 업그레이드를 매우 빠르고 효율적으로 수행할 수 있습니다. 이 작업을 원활하게 수행하기 위해 개발자는 마이크로 컨트롤러를 주의해서 검토하고 DFU가 마이크로 컨트롤러에 내장되어 있는지 아니면 DFU 기능을 지원하는 소프트웨어 스택을 포함해야 하는지 여부를 결정해야 합니다.
DigiKey logo

면책 조항: 이 웹 사이트에서 여러 작성자 및/또는 포럼 참가자가 명시한 의견, 생각 및 견해는 DigiKey의 의견, 생각 및 견해 또는 DigiKey의 공식 정책과 관련이 없습니다.

작성자 정보

Image of Jacob Beningo

Jacob Beningo

Jacob Beningo는 임베디드 소프트웨어 컨설턴트로서 현재 십여 개국 이상의 국가에 있는 고객들과 협력하여 제품 품질, 비용, 출시 기간을 향상시켜 고객의 비즈니스를 극적으로 변화시키고 있습니다. 그는 인기 있는 강연자이자 기술 교육자이며 임베디드 소프트웨어 개발 기술에 대해 200개 이상의 기사를 발표했습니다. 그는 미시간 대학교 공학 석사 학위를 비롯하여 세 개의 학위를 소지하고 있습니다. 월간 Embedded Bytes 뉴스레터를 수신하려면 jacob@beningo.com 및 Jacob Beningo의 웹 사이트인 www.beningo.com으로 언제든지 문의해 주세요.

게시자 정보

DigiKey 북미 편집자