로직 레벨은 0과 1을 인식하는 전압을 의미한다. 아두이노를 사용할 때 보통 1 (High)는 5V를 의미하고 0 (Low)는 0V를 의미한다. 하지만, 4.8V를 입력하면 아두이노는 1로 인식하지 못한다는 것은 아니다.
아두이노에 사용되는 ATmega328의 datasheet을 보면 다음과 같다.
- voltage lower than 0.3*VCC = LOW - voltage higher than 0.6*VCC = HIGH
아두이노는 보통 5V 이상에서 구동되므로 3V 이상이면 1, 1.5V이하이면 0으로 인식한다. 1.5V~3V 전압은 0일지 1일지 장담할 수 없다.
문제는 3.3V 로직 레벨을 가진 장치가 5V의 신호를 받게 되면 터져버릴 수도 있다는 것이다. 예를 들어, 5V 로직 레벨을 사용하는 아두이노의 GPIO를 3.3V 로직 레벨을 사용하는 ESP8266의 GPIO에 직접 연결하면 ESP8266의 GPIO가 손상될 수 있다.
혹은 1.8V 로직 레벨을 가진 장치의 High 신호를 아두이노는 High로 인식하지 못할 수도 있다. 1.8V는 확실히 1이라고 할 수도 없고 확실히 0이라고 할 수도 없는 애매한 영역에 속하기 때문이다.
이와 같은 경우에 로직 레벨을 바꿔주는 변환기가 필요하다. 저항으로 전압분배기를 만들어 로직 레벨을 바꿔주는 방법도 있지만 0과 1 사이에서 신호가 빠르게 바뀌는 통신에서는 저항으로 인해 transient time이 길어지며 문제가 생길 수 있다. 그래서 안정적인 작동을 위해서라면 logic converter를 사용하는 것이 좋다.
BLE 개발을 위한 NRF52 DK 개발 보드 기본 사용법을 설명한다. Adafruit 등의 다양한 DK가 있지만 가장 범용성이 큰 PCA10056기반의 DK를 구매했다. 해외 구매를 해야 하고 현재는 eleparts를 통해 구매하는 게 가장 간단해 보인다.
NRF52 DK PCA10056
개발을 위해 필요한 툴은 다음과 같다.
GNU Tools ARM Embedded
nRF Command Line Tools
NRF5 SDK
GNU Make
다음 글은 Windows 10 기준이다.
GNU Tools ARM Embedded 설치
소스코드 컴파일을 위해서 필요한 툴이다. 다운로드 링크에 들어가서 개발환경에 맞는 파일을 다운받는다. 나는 최신 버전을 받았을 때 컴파일 작업에서 오류가 나서 7 2018-q2-update로 설치했다. 설치 마지막 단계에서 환경 변수 추가 옵션을 체크해준다. 체크를 하지 않은 경우는 사진을 참고해서 (INSTALL_DIR)\(VERSION)\bin 을 "Path" 환경 변수에 추가해준다.
잘 모르겠으면 exe 파일 다운로드 후 실행
마지막 단계에서 환경변수 추가(세 번째) 옵션을 체크
설치가 됐는지 확인하기 위해 PowerShell이나 cmd 등의 shell에서 다음을 입력한다.
arm-none-eabi-gcc --version
버전 정보를 나중에 입력해야하니 기억하자. 여기서는 7.3.1 이다.
PS C:\Users\HyunsungKim> arm-none-eabi-gcc --version
arm-none-eabi-gcc.exe (GNU Tools for Arm Embedded Processors 7-2018-q2-update) 7.3.1 20180622 (release) [ARM/embedded-7-branch revision 261907]
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
nRF Command Line Tools 설치
커맨드라인에서 컴파일 작업, 펌웨어 업로드 등의 작업을 하기 위한 툴이다. 다운로드 링크에 들어가서 아래쪽의 Download 탭에서 설치 파일을 다운로드하여 설치한다. 중간에 뜨는 Segger J-Link USB Driver도 설치한다.
개발을 위한 소스파일과 예제 파일을 담고 있다. 다운로드 링크에 들어가서 원하는 버전의 zip 파일을 받은 후 압축해제 하면 된다. 나는 현재 최신 버전인 nRF5_SDK_15.3.0_59ac345.zip 을 받았다.
GNU Make 설치
다음을 shell에 입력한다.
make --version
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
This program built for i386-pc-mingw32
버전 정보가 뜬다면 이미 설치가 돼있는 것이며, 오류가 뜬다면 링크를 참고해서 설치를 하고 환경 변수 C:\Program Files (x86)\GnuWin32\bin 추가까지 완료한다.
Makefile.windows의 내용을 편집한다. GNU_INSTALL_ROOT는 GNU Tools ARM Embedded 설치 경로, GNU_VERSION은 쉘에서 확인했던 버전 정보를 넣는다. 아래는 나의 개발 환경에서의 예시이며 잘못 기입할 경우 이후에 컴파일이 되지 않는다.
Makefile.common은 건드릴 것이 없고 리눅스 사용자는 Makefile.posix를 같은 방식으로 편집해준다.
예제 컴파일 및 펌웨어 업로드
예제 파일을 업로드해서 스마트폰과 DK 사이의 BLE 통신을 해보자. DK 보드가 peripheral, 스마트폰이 central이 된다. 예제 파일 디렉토리 (NRF SDK 설치 경로)\examples\ble_peripheral\ble_app_uart\pca10056\s140\armgcc 으로 이동한 후 위쪽 창에 powershell을 입력하여 shell 창을 띄운다.
make
정상적으로 진행될 경우 아래와 같이 보여지며 _build 폴더 안에 컴파일된 hex 파일이 생성된다.
DK 보드가 USB로 연결된 상태에서 다음 명령어를 차례로 입력한다. 각각, 기존의 펌웨어를 지우고, softdevice라는 protocol stack을 업로드하고, 마지막으로 위의 make로 컴파일 된 hex파일을 업로드 하는 것이다.
make erase
make flash_softdevice
make flash
정상적으로 진행될 경우 아래와 같이 보여진다.
PS D:\Downloads\nRF5_SDK_15.3.0_59ac345\examples\ble_peripheral\ble_app_uart\pca10056\s140\armgcc> make erase
nrfjprog -f nrf52 --eraseall
Erasing user available code and UICR flash areas.
Applying system reset.
PS D:\Downloads\nRF5_SDK_15.3.0_59ac345\examples\ble_peripheral\ble_app_uart\pca10056\s140\armgcc> make flash_softdevice
Flashing: s140_nrf52_6.1.1_softdevice.hex
nrfjprog -f nrf52 --program ../../../../../../components/softdevice/s140/hex/s140_nrf52_6.1.1_softdevice.hex --sectorerase
Parsing hex file.
Erasing page at address 0x0.
Erasing page at address 0x1000.
( . . . )
Erasing page at address 0x23000.
Erasing page at address 0x24000.
Erasing page at address 0x25000.
Applying system reset.
Checking that the area to write is not protected.
Programming device.
nrfjprog -f nrf52 --reset
Applying system reset.
Run.
PS D:\Downloads\nRF5_SDK_15.3.0_59ac345\examples\ble_peripheral\ble_app_uart\pca10056\s140\armgcc> make flash
DONE nrf52840_xxaa
Flashing: _build/nrf52840_xxaa.hex
nrfjprog -f nrf52 --program _build/nrf52840_xxaa.hex --sectorerase
Parsing hex file.
Erasing page at address 0x26000.
( . . . )
Erasing page at address 0x2F000.
Applying system reset.
Checking that the area to write is not protected.
Programming device.
nrfjprog -f nrf52 --reset
DK 보드를 관찰하면 LED1이 2초 주기로 점멸하는 것을 알 수 있다. 아래의 표에 따르면 advertising 상태라는 의미이며 스마트폰의 연결을 기다리고 있다는 뜻이다.
STM32F4DISCOVERY나 mbed 계열 개발보드는 ST-Link를 내장하고 있지만 커스텀 보드를 제작할 경우 아래 사진과 같은 ST-Link 를 이용해 프로세서를 프로그래밍 해줘야한다. 하지만 이것이 없어도 개발보드가 있다면 보드에 내장된 ST-Link를 이용하면 아래의 장치 없이 프로그램이 가능하다.
ST-Link/V2 디바이스. 가격은 3만원 이상.
보드에 내장된 on-board ST-Link 회로는 기본적으로 아래쪽의 프로세서와 연결돼있다. 그리고 동시에 CN2 점퍼 (SWD connector)와 연결돼 있기 때문에 외부 STM32 프로세서를 프로그래밍 할 수 있다.
보드의 상부가 ST-Link이며 CN3를 통해 하부의 STM32 프로세서와 연결돼있다.
CN3 점퍼 2개를 모두 제거하고, CN2 (SWD) 커넥터를 Table 3.에 따라서 외부 STM32의 핀과 연결해주면 된다. 커스텀 보드에 전원이 공급돼있다면 2번 핀(SWCLK), 3번 핀(GND), 4번 핀(SWDIO) 만 연결해도 프로그래밍과 디버깅이 모두 가능하다.
사진 상에서 위쪽부터 1번 핀
인식이 안될 경우 체크해봐야할 것들
이유는 모르겠지만 커스텀보드의 GND를 SWD GND에 직접 연결하지 않고 아래쪽의 GND에 연결하면 인식이 안되는 경우가 많다.
커스텀 보드 전원을 USB로 공급할 경우 순간적으로 전력이 부족하여 인식이 안될 수 있다.