[STM32] Boot Loader + Application
STM32F412ZG 보드의 Flash memory에 Boot loader와 Application을 다운로드 해서 동작을 확인한다.
먼저, F412ZG 유저 메뉴얼을 통해서 메모리 맵을 확인한다.
Flash memory의 시작 주소는 0x0800 0000 이고, 사이즈는 1024KB, 1,048,576 bytes 이다. Boot loader와 Application을 저장할 주소는 각각 다음과 같다.
추가로 확인해야 할 사항은 Boot 모드이다. F412ZG 는 3가지 Boot 모드를 지원한다.
이 중에서 사용할 boot mode는 Main Flash memory 모드다. Flash 메모리에 boot loader를 올려 직접 application을 실행할 수 있게 한다.
Main Flash memory 모드는 BOOT0 핀이 0이면 무조건 해당 모드이기 때문에 BOOT1 핀은 don't care다. 그럼 BOOT0 핀은 어디있는지 보자.
BOOT0는 풀다운 저항으로 연결되어 있어 기본적으로 LOW 이다. 하지만 다른 모드를 선택하고 싶다면 아래 핀을 HIGH 인가한다.
BOOT 모드 설정하고 Flash memory 구성을 했다면 STM32CubeIDE를 실행하여 Boot loader와 Application 프로그램을 작성한다.
먼저 Boot Loader 프로젝트를 생성한다. STM32F412ZG 는 USB CDC 를 지원하기 때문에 해당 포트를 디버깅용으로 사용한다. 물론 디버깅이 꼭 필요하진 않다. LED로도 Boot Loader와 Application 실행 확인이 가능하다.
프로젝트를 생성 후 디버깅을 위한 코드를 추가한다. 해당 내용은 아래 링크에 작성되어 있다.
2024.08.16 - [ARM] - [STM32] USB CDC Debugging
[STM32] USB CDC Debugging
내가 사용하고 있는 보드 STM32F412ZG 는 ST-LINK 의 USB 포트 외에 추가 포트 1개가 더 있다. 아래 사진은 F412ZG는 아니지만 붉은색 박스와 같은 위치에 포트가 있다. (LAN 포트만 없다고 생각하면 된다)
gunwooyun.tistory.com
Boot Loader 에서 다음 할일은 Application 영역으로 jump 하는 기능이다.
static void JumpToApp(void)
{
printf("Jump to Application...\r\n");
void (*app_reset_handler)(void) = (void *)(*((volatile uint32_t *)(0x8040000 + 4U)));
app_reset_handler();
}
함수 포인터 app_reset_handler 에 application 시작 주소를 대입한다. 해당 함수 JumpToApp을 실행하며 Application 프로그램이 실행되는 주소 0x8040000으로 jump 하게 된다.
다음은 boot lodaer의 scatter 파일을 수정한다. 수정 내용은 이 코드가 다운로드되는 Flash memory 영역과 사이즈를 지정해준다. STM32F412ZGTX_FLASH.ld 파일에서 MEMORY 영역의 FLASH 부분을 Boot loader 사이즈만큼로 지정한다.
그리고 바이너리 파일을 생성하기 위한 설정을 아래와 같이 진행한다.
여기까지 Boot Loader 프로젝트 생성 방법이다. 다음은 Application 프로젝트를 생성해본다. 마찬가지로 디버깅을 위한 USB CDC 코드를 삽입한다. 그리고 해당 영역이 실행되고 있는지 확인하기 위한 출력 코드나 LED 토글과 같은 코드를 삽입한다.
scatter 파일도 Boot Loader 프로젝트와 마찬가지로 수정한다. Application 영역 시작주소와 사이즈를 지정한다.
Application 코드에서는 한가지 더 추가로 작업해야될 내용이 있다. Core/Src/system_stm32f4xx.c 에서 주석처리 되어있는 #define USER_VECT_TAB_ADDRESS 를 주석 해제한다.
Application을 빌드해서 bin 파일을 출력한다. 여기까지 한다면 boot loader 와 application의 bin 파일 두개가 생성되었다. 이제 ST보드에 해당 bin 파일들을 다운로드 한다. 다운로드 툴은 ST 에서 제공하는 STM32CubeProgrammer 이다.
https://www.st.com/en/development-tools/stm32cubeprog.html
STM32CubeProg - STMicroelectronics
STM32CubeProg - STM32CubeProgrammer software for all STM32, STM32CubePrg-W32, STM32CubePrg-W64, STM32CubePrg-Lin, STM32CubePrg-Mac, STMicroelectronics
www.st.com
위 프로그램을 다운로드한 후 설치하면 아래와 같은 인터페이스의 프로그램이 실행할 수 있다.
Connect 연결 후 0x8000000 번지 주소를 Read 해본다. 이때 실행 방법은 Read 버튼을 클릭한다. 만약 Flash 가 지워져있다면 FFF.. 로 채워져있을 것이고, 다른 프로그램이 올라가 있다면 해당 값들이 써져있을 것이다.
이제 바이너리 파일을 다운로드한다. 좌측 두번째 버튼을 클릭하면 펌웨어 다운로드 페이지가 나온다. 여기서는 바이너리 파일을 추가하고 boot loader 의 시작주소를 입력한 후 Start Programming 버튼을 클릭한다.
Application 도 위와 같은 방법으로 펌웨어를 다운로드 한다. 다운로드가 모두 완료되었다면 Boot Loader와 Application이 잘 실행되는지 확인해본다.
이 내용은 유튜브를 참고하여 작성하였다. 해당 유튜브는 아래 링크와 연결되어 있다.
https://youtu.be/ppQx_scTsvQ?si=JIec8dOqQ1ffzDv2