오늘 오랜만에 nRF51822의 부트로더 개발을 다시 하게 되었다.

그런데 젠장 인간의 두뇌는 역시 한계가 있나보다 2년전에 분명히 잘되었던 것 같은데

SDK에서 부트로더 예제를 컴파일하고 플래시에 다운로드하니까 신호도 안뜨네 ^^;;


몇 시간 삽질 한 끝에 내가 만든 Custom PCB는 32khz 크리스탈이 없다. 기본적으로 SDK는 하드웨어에 32khz 크리스탈이 있다고 보고 만들었다. 만약 제품 개발을 위해 만든 nRF51822 보드에서 신호조차 뜨지 않는다면 아래 코드를 체크해야 한다.

이 부분에서 맨날 까먹고 고생한다. ㅎㅎㅎ


main.c에서


static void ble_stack_init(bool init_softdevice){...} 라는 함수가 있는데 BLE 스택을 초기화한다. 여기에서 아래처럼 32khz 크리스탈을 초기화 한다. 기본적으로 외부에 달려있는 크리스탈을 초기화 하도록 되어 있다.


    SOFTDEVICE_HANDLER_APPSH_INIT(NRF_CLOCK_LFCLKSRC_XTAL_20_PPM, true);


 이것을 칩 내부 RC 오실레이터로 변경한다. 적당히 Calibration 구간을 선택한다. 타이밍 이슈만 없다면 아래 플래그로 세팅하면 정상적으로 BLE 신호가 뜬다.
        SOFTDEVICE_HANDLER_APPSH_INIT(NRF_CLOCK_LFCLKSRC_RC_250_PPM_8000MS_CALIBRATION,true);


그리고 나서 빌드 후 테스트를 하는데 또 문제가 발생했다. 이번엔 플래시 다운로드에서 문제 였다.

부트로더는 Keil 개발환경 자체의 다운로드 방식을 사용하지 않고 외부 nrfjprog.exe를 사용해서 다운로드 하도록 되어 있다. 


그런데 잘 안된다. success라고 떴는데도 안되네...보드를 on/off해도 안되어서 사용법을 찾아 봤다.


그냥 리눅스 처럼 콘솔을 열어서 바이너리 경로로 찾아가서 직접 커맨드를 사용한다.


먼저 소프트디바이스를 플래시 다운로드한다. 이 때 칩을 모두 지우고 프로그래밍하도록 --chiperase를 한다.


nrfjprog.exe --family NRF51 --program s110_nrf51_8.0.0_softdevice.hex --chiperase --verify


부트로더를 다운로드한다.

nrfjprog.exe --family NRF51 --program bootloader.hex --verify


리셋한다. 리셋을 안하면 동작하지 않는다.


nrfjprog.exe --family NRF51 --reset


아래 포럼을 참고했다.

https://devzone.nordicsemi.com/question/56373/flashing-softdevice-with-the-latest-nrfjprog/



+ Recent posts