-
Notifications
You must be signed in to change notification settings - Fork 0
Nucleo board에 프로그램 굽는 법
본 문서에서는 우리가 빌드한 프로그램을 실제로 STM32 Nucleo 보드에 굽는 법에 대해 알아본다.
- stlink - 호스트 개발환경과 보드를 USB로 바꿔주는 프로그램.
- USB Type-A to Mini-B cable
엄밀히 말하자면, stlink는 ST 사의 보드에 딸려 있는, USB 명령어를 JTAG으로 바꿔주는 칩을 의미하기도 한다. 여기선 그냥 프로그램만을 지칭하기로 한다.
원래 stlink는 ST 사에서 배포하는 공식 소프트웨어이다. 하지만 우리는 힙스터 기질이 다분하고 돈이 궁한 대학생이므로, 오픈소스를 쓰기로 한다. texane 님의 오픈소스 버전 stlink 레포지토리를 들어가서, 클론한다. 우리 코드가 들어가는 프로젝트 디렉토리와 별개의 디렉토리에 클론하는 것을 권한다. Ubuntu의 경우, 한 번에 깔기 좋게 나온 패키지 같은 게 없다. 우분투에서 설치하는 법을 보고, 소스를 클론해서 직접 컴파일 해 줘야 한다. 문서에서 시키는대로만 하면 별 탈 없이 끝나니 너무 겁먹지 말자.
운 나쁘면 프로그래머 보드의 점퍼캡이 잘못 씌워진 경우가 있다. 구글 이미지 검색을 통해 STM32L476RG 보드 그림을 보고, 자신의 보드의 점퍼캡 상태와 전부 일치하는지 꼭 확인하자. 프로그래머 보드 점퍼가 잘못되면 stlink를 이용한 통신이 제대로 되지 않는다.
STM32 보드의 플래시 메모리에 읽고 쓰기를 수행해주는 프로그램이다.
읽고 쓰기를 비롯한 여러 명령이 있지만, 우리가 주로 쓰게 될 건 결국 write 옵션이다.
st-flash write ./main.bin 0x08000000
위의 명령어는 "./main.bin이라는 이진 파일을 ST보드의 0x08000000번지에서부터 write 하시오" 라는 의미이다. 파라미터는 알아서 바꿔넣어도 되지만, 아마 실행파일 이름 빼고는 바꿀 일이 없을 것이다.
이진파일 확장자가 bin인 점에 주목하자. st-flash 는 ELF파일에서 헤더 등 메타데이터를 제외한 bin 파일만 쓸 수 있다. ELF 파일을 bin 파일로 바꾸려면
arm-none-eabi-objcopy -O binary main.elf main.bin
와 같이 명령어를 입력하면 된다. 이는 본 레포지토리의 build.sh에서 확인할 수 있다.
필자가 st-flash write 를 연속해서 실행해 보니, 두 번에 한 번은 write가 실패했다. 지금도 정확한 원인은 모르겠지만, 플래시에 무슨 메타데이터 같은 것이 남아 있는 것 같다.
st-flash erase
위 명령어를 통해 플래시의 데이터를 싹 지우고 st-flash write를 수행하면 해결된다.
본 레포지토리의 burn.sh 에서 erase와 write를 같이 쓰는 모습을 볼 수 있다.
st-util
이라는 명령어만 치면 st 보드에 들어간 프로그램에 대한 gdb 서버가 생성된다.
터미널을 하나 더 켜고,
arm-none-eabi-gdb -q
명령어를 입력한 후, tar ext :4242
를 입력하면 4242번 포트를 통해 로컬호스트의 디버깅 서버에 연결해서 프로그램 실행을 보다 세밀하게 분석 할 수 있다.
st-util은 USB 장치에 대한 파일 서술자를 쥐고 있으므로, st-util 디버깅 서버가 실행 중일 때는 st-flash를 이용한 작업이 불가능하다. st-flash가 안 먹히면 먼저 st-util 디버깅 서버를 다 껐는지 확인하도록 하자.