DFU란 여러 곳에서 잘 정의 해줬는데 나는 다음과 같이 생각한다. 임의의 통신프로토콜(BLE, UART 등등)로 firmware를 업데이트 해주는 과정을 말한다. firmware란 하드웨어에 반영구적으로 저장되어 있는 소프트웨어라 하는데 그냥 우리는 softdevice + bootloader + application 을 통틀어 말하는 거라고 보면 된다.(nRF 칩에 올라가는 모든 소프트웨어들)
DFU를 쓰는 이유는 귀찮게 USB케이블로 pc와 DK 보드를 연결한 뒤 프로그래밍할 필요 없이 BLE나 다른 편리한 통신으로 firmware를 업뎃 할 수 있어서다. 좀 더 쉽게 말하면 DK 보드는 안에 Jlink가 내장되있어 그나마 편리하게 소프트웨어들을 업로드 할 수 있지만 다른 nRF 모듈들은 비싼 디버깅 케이블을 사서 연결해야만 가능하다.
먼저 DK 보드를 통해서 DFU를 해보고 다른 nRF 모듈에 적용해보길 바란다!
DFU를 하기 위해선 또다른 소프트웨어가 필요하다. 바로 bootloader 이다. 흔히 bootloader라고하면 pc를 시작시킬 때 가장 먼저 작동하는 소프트웨어로, 다른 중요한 소프트웨어들을 RAM에 올려주고 시작시켜주는 소프트웨어인데 여기서는 좀 다른 의미인 것 같다. nRF에서 제공하는 bootloader에 대해 깊이 공부하진 않았지만 이녀석은 nRF 칩이 처음 시동될 때 DFU 모드로 들어가줄 수 있게 해주는 장치라고 보면 된다.
nRF 51 DK를 예로 들면 처음 전력이 공급 될 때 button 4가 눌려있으면 DFU 모드로 진입하고 그렇지 않다면 프로그래밍한 application을 실행시켜 준다.
그러므로 DFU를 사용하지 않을 경우 처음부터 bootloader를 nRF 칩에 올릴 필요도 없다.
nRF 51 DK에 Bootloader 올리기
1. nRFgo studio를 통해 칩위의 프로그램들을 eraseall 한다.2. SDK v11.xxx 에 있는 softdevice s130를 올린다. (nordic 사에서 제공해주는 튜토리얼을 토대로 공부했는데 v11를 기준으로 설명했으므로 여기서도 그렇게 하자.)
3. nRF5_SDK_xxx\examples\dfu\bootloader\pca10028\dual_bank_ble_s130\arm5_no_packs\dfu_dual_bank_ble_s130_pca10028.uvprojx 을 실행시켜 컴파일 및 보드에 업로드 한다.
(여기서 에러가 뜬다면
Keil MDK 의 상단 탭 메뉴중에 Project>Option For Target 'xxx'>Utillities 상단탭 에 들어간다.
Configure Flash Menu Command 부분에서 Use External Tool for Flash Programming 을 체크하고 Command 에는 nrfjprog.exe, Arguments에는 --reset --program "#H"을 기입한다.
자세한 건 https://devzone.nordicsemi.com/tutorials/9/여기 참고)
짠! 그러면 보드 LED1,3가 반짝 빛나고 있을 것이다. 위 3번과정이 DK 보드에 bootloader를 올리는 과정이었다. 이제 앞으로 여기에 어떤 application을 넣어도 DK 보드에 전원을 넣을 시 button4를 누르고 있으면 DFU모드로 들어갈 것이다.
그럼 DFU 를 이용해 application을 업로드 해봅시다. 그럴려면 핸드폰을 통해서 업로드하는게 편리한데 nRF toolbox라는 앱을 깔아 놔야한다. 그리고 application 파일을 특정 포맷인 zip 파일로 변환하는 과정이 필요하다. zip파일로 변환 후 핸드폰에 파일을 옮기고 nRF toolbox로 application을 업로드하면 된다.
application을 zip파일로 변환하는 방법
1. zip 파일로 변환 하기 위해선 MCP(master control panel)를 설치해야한다. 이녀석의 설치 경로는 다음과 같다.https://www.nordicsemi.com/eng/Products/nRF51-DK 여기에 들어간 후 DOWNLOADS 탭에 들어가면 아래와 같은 항목이 있는데 윈도우 버젼에 맞게 설치한다.
nRF-MCP-x64 | Master Control Panel with Master Emulator API (64-bit) | 3.10.0 |
nRF-MCP-x86 | Master Control Panel with Master Emulator API (32-bit) | 3.10.0 |
2. 원하는 application을 Keil MDK를 통해 컴파일 한 후 컴파일 된 hex 파일을(_build 폴더 내에 있음) 다음의 위치에 복사한다.
C:\program files\Nordic Semiconductor\Master Control Panel\3.10.0.14\nrf
그 후에 cmd를 관리자 권한으로 실행한 후 위의 디렉토리로 이동해 다음의 명령어를 실행 한다.
nrfutil.exe dfu genpkg application.zip --application application.hex --application-version 0xffffffff --dev-revision 0xffff --dev-type 0xffff --sd-req 0xfffe
위에서 빨간색 부분에 복사해온 hex파일 이름을 넣어 주면된다. 만일 application이 아닌 softdevice, bootloader를 zip으로 변환하고 싶다면 --aplication 을 --softdevice 또는 --bootloader 로 바꿔주면 된다.
위 명령어는 version이나 type 등을 다 default로 넣어주었지만 customizing 하고 싶다면 다음을 참고해주면 된다.
폰에서 nRF 칩으로 DFU 하기
1. 위 과정을 통해 얻은 zip파일을 드라이브 앱등을 통해 폰으로 옮긴다.
2. nRF toolbox 앱을 실행한 후 DFU에 들어간다.
3. Select File에서 저장한 zip파일을 선택하고 Select Device에서 DfuTarg 또는 DfuTest를 선택 한다.
4. Upload 하면 끝!!! 만일 여기서 upload 과정(퍼센티지 뜨는 거)이 안나오면 해당 application 과 softdevice가 호환이 안되서 그럴 가능성이 크다.
주의할 점!!!!!
이제 다른 nRF 모듈에서 DFU를 사용해 firmware를 올릴건데 bootloader를 업데이트할 때는 반드시 bootloader의 버전과 모듈의 버전이 같은지 확인하고 올리자. 만일 다른걸 올리게 될 경우 벽돌이 될 수도 있다....