안녕하세요? 러찌입니다.
이번 시간에는 nRF52840 USB Dongle을 이용해서 펌웨어를 개발할 때,
디버깅 하는 방법에 대해서 알아보겠습니다.
nRF52840 USB Dongle은 nRF52840 DK 보드와 달리,
디버거가 내장되어 있지 않습니다.
그래서 별도로 J-Link를 USB Dongle과 연결해서,
펌웨어 디버깅을 해야 합니다.
J-Link와 연결하기 위해서는,
첫 번째로 nRF52840 USB Dongle에 하드웨어 수정을 해줘야 합니다.
다음과 같이, 붉은 표시의 핀(SWDIO, SWDCLK)에,
케이블을 연결할 수 있도록 헤더 핀을 만들어야 합니다.
다음과 같이, nRF52840 USB Dongle에 헤더 핀을 구성하였습니다.
J-Link 연결을 위해서는 Dongle의 USB 커넥터 앞부분의 2개 핀만 사용하면 됩니다.
그래서 위 사진처럼 헤더 핀을 모두 구성할 필요는 없습니다.
첫 번째 사진의 붉은 표시만 헤더 핀을 만들어 주면 되겠습니다.
두 번째로 J-Link 연결 방법입니다.
J-Link와 연결하는 방법은 7번 핀의 SWDIO와 9번 핀의 SWDCLK핀을
nRF52840 USB Dongle과 연결해 주면 됩니다.
전원과 GND는 USB로부터 공급하도록 하면 됩니다.
구성도는 다음과 같습니다.
위와 같이 구성한 후, J-Link와 USB Dongle을
개발 PC의 USB 포트에 각각 연결해 주면 됩니다.
이제 디버깅 환경은 구성되었습니다.
마지막으로, SES를 이용한 디버깅 방법에 대해 설명하겠습니다.
nRF52 SDK 15.3 버전에서,
nRF52840 USB Dongle용 Blinky 예제를 SES에서 열어 보겠습니다.
nRF5_SDK_15.3\examples\ble_peripheral\ble_app_blinky\pca10059\s140\ses\ble_app_blinky_pca10059_s140.emProject
Blinky 프로젝터를 Open한 후에, J-Link 연결이 잘 되어 있는지 확인하기 위해서,
SES 메뉴에서 “Target” – “Connect J-Link”를 선택합니다.
만약 다음과 같은 에러 창이 뜨면, J-Link가 PC에 USB 연결이 되지 않은 것입니다.
그리고, 다음과 같은 에러 창이 뜨면,
J-Link는 연결되었지만, nRF52840 USB Dongle을 찾을 수 없는 것입니다.
J-Link와 USB Dongle의 연결을 확인하거나, USB Dongle의 상태를 확인해야 합니다.
연결이 잘 되었다면, 다음처럼 Target 메뉴들이 활성화됩니다.
Target 메뉴들을 하나씩 실행해서 동작을 확인해 보면 됩니다.
여기서 “Erase All” 명령은 꼭 필요할 때만 쓰시기 바랍니다.
“Erase All” 명령을 하면, nRF52840 USB Dongle의 모든 데이터가 삭제됩니다.
부트로더도 삭제됩니다.
그래서 Dongle에 펌웨어가 존재하지 않기 때문에,
Reset 핀이 Low로 되는 현상이 생깁니다.
그렇게 되면, J-Link로도 연결이 안되는 경우가 있으므로,
되도록이면 “Erase All” 명령은 하지 않는 것이 좋습니다.
“Connect J-Link”로 연결 확인을 하였다면, 이제 디버깅 테스트를 해보면 됩니다.
디버깅 환경은 Visual Studio의 디버깅 환경과 유사합니다.
우선 다음처럼, SES에서 Build Configuration을 “Debug”로 설정합니다.
“Build” 메뉴의 “Rebuild Solution”을 이용해서 프로젝트 빌드가 정상적으로 되는지 확인합니다.
성공적으로 빌드가 된다면 이제 디버깅을 할 수 있습니다.
키보드로 “Ctrl+F5” 를 누르면 펌웨어를 USB Dongle에서 직접 실행시킬 수 있습니다.
그리고 키보드로 “F5”를 누르면 디버깅을 할 수 있습니다.
디버깅이 시작되면, 다음 화면처럼 Main() 함수의 첫번째 라인에서 Break가 걸리게 됩니다.
이제부터는, Debug 메뉴에서 F9(Toggle Breakpoint), F10(Step Over), F11(Step Into),
Run to Cursor 등의 필요한 명령들을 통해 디버깅을 할 수 있습니다.
F9(Toggle Breakpoint)를 사용할 때 주의할 점은,
handler 함수에서 Break를 걸면, 디버깅이 중단됩니다.
그러므로, 디버깅은 main 함수에서만 사용하는 것이 좋습니다.
handler 함수는 NRF_LOG_INFO 함수를 통해서
UART 메시지로 디버깅하는 것을 추천합니다.
SES에서는 디버깅 기능으로 Output 창을 통한 디버그 메시지 출력도 볼 수 있습니다.
그리고, Call Stack, CPU 레지스터 등 다양한 디버그 정보를 보여줍니다.
이러한 기능들은 한번씩 해보시고, 확인해 보면 됩니다.
이렇게, J-Link로 nRF52840 USB Dongle의 펌웨어를 Write할 수도 있고,
디버깅할 수도 있습니다. 그런데, J-Link로 펌웨어를 Write하면,
Dongle에 있는 부트로더는 자동으로 삭제 됩니다.
그래서, 이후부터는 Reset 버튼을 아무리 눌러도 부트로더 모드로 진입하지 않게 됩니다.
이렇게 되면, nRF Connect 프로그램에서 제공하는 Programmer Tool을 이용할 수 없게 됩니다.
이 문제를 해결하기 위해서,
nRF52 SDK 15.3 에서는 Bootloader를 J-Link로 Write할 수 있도록
소스와 펌웨어를 제공하고 있습니다.
다음 경로에 있는 부트로더 프로젝트를 SES로 열어서,
“Ctrl+F5”를 실행하면, J-Link를 통해 부트로더가 Dongle에 Write됩니다.
nRF5_SDK_15.3\examples\dfu\open_bootloader\pca10059_usb_debug\ses\open_bootloader_usb_mbr_pca10059_debug.emProject
정상적으로 Write되었다면,
이후부터 Reset 버튼을 누르면, 부트로더가 실행되며 익숙한 Red LED가 깜빡일 것입니다.
그러면 Programmer Tool을 사용해서 Write할 수 있습니다.
nRF52840 DK 보드처럼 디버깅 환경을 제공하진 않지만,
nRF52840 USB Dongle에 대한 디버깅 환경에 익숙해진다면,
DK 보드처럼 쉽게 펌웨어를 개발할 수 있을 것입니다.
지금까지 nRF52840 USB Dongle의 디버깅 방법을 설명 드렸습니다.
다음은 nRF52840 USB Dongle의 디버깅 관련 영상입니다.
* 다음 링크는 저희 페이스북입니다. 방문해 주시면 감사하겠습니다.
https://www.facebook.com/wearedev1
* 유튜브 채널 구독 부탁 드립니다.
https://www.youtube.com/c/WeAreDev
감사합니다.
안녕히 계십시오.