펌웨어로 개발을 하다보면 부트로더의 개발은 선택이 아닌 필수가 된다.
부트로더는 보통 하드웨어 또는 환경설정( 예:맥어드레스..) 초기화를 하거나 프로그램 다운로드 및 업데이트를 진행한다.

내가 그동안 개발했던 펌웨어 부트로더는 Romless cpu+ Nor flash(또는 spi flash) + sdram 인 케이스, 내부플래쉬에서 점프하는 가장 맘편한 케이스 그리고 지금하는 qspi flash에서 점프하는 케이스가 있다.

Romless cpu+ Nor flash(또는 spi flash) + sdram 인 케이스는 NXP의 lpc1820으로 개발한 경우였다. spi flash로 부팅하고 sdram에 메인 프로그램을 복사한 뒤, vector와 스택포인터만 변경해 주면 문제없이 점프를 했다.

내부 플래쉬에서 점프하는 케이스는 보통 내부 플래쉬가 용량이 충분해서 일부를 부트로더로 하고 나머지를 메인 프로그램으로 구동하는 케이스이다. 여기도 vector와 스택포인터만 변경해 주면 문제없이 점프를 했다.

참고로 펌웨어에서 다른 영역으로 점프시 모든인터럽트 비활성화를 하고 가야 한다. usart, systick 등

마지막으로 지금 개발중인 qspi flash를 이용한 케이스인데 이 플래쉬는 Excute-in-place(xip)가 지원되는 모델이다.

xip모드로 설정한 뒤, 플래쉬 어드레스의 첫번째 주소에 있는 벡터를 vtor 어드레스에 설정하고 reset handler로 점프하면 되었다.


하지만 프로그램 실행중에 저장을 해야 하는데 xip모드에서는 write를 하려면 xip모드를 꺼야 하는데 이게 flash를 reset도 해야 하고 램함수도 만들어야 하는데 잘 안되서 구글링을 해도 xip 시에는 다른 flash에 저장해라 라는 의견이 대다수였다.

​하지만 타켓 cpu는 STM32H 시리즈였고 플래쉬는 1섹터만 가진 녀석이였다.

(하드웨어팀은 EVB kit을 그대로 보고 만든거라 부팅이고 뭐고 생각을 안하고 만들었다..)

다행이 개발제품은 내부 램이 800K가 넘는 모델이었고 LCD프레임버퍼 같이 큰 램 사용량이 필요 없어서
내부 램으로 모든 프로그램을 올려서 점프하려고 계획했다.

(하지만 여기서 3일간 머리를 쥐어 뜯으리는 몰랐다..)

링커 스크립트를 수정하고 qspi flash에 프로그램을 저장하고 내부램으로 복사하고 벡터를 수정하고 점프를 하는데 자꾸 hard fault exception 이 발생했다.

링커도 맞고 복사한 프로그램 체크섬도 맞는데 자꾸만 발생하는 hard fault,memory error..
단순히 점프만 하는건데 왜 안되지 하다가 결국 데이터 시트 정독을 시작했다.

https://www.st.com/resource/en/application_note/dm00272912-managing-memory-protection-unit-in-stm32-mcus-stmicroelectronics.pdf


어? 첫장부터 sram에 대한 내용이 있다. 코드 인젝션공격을 방지하기 위해 sram 에서의 권한에 대한 내용이다..

MPU_RASR 레지스터의 XN비트의 내용을 보면 Fault exception이 발생하고 이것들은.. 내가 겪은 에러들..

데이터시트를 참조해서 MPU를 세팅해보니..

정상적으로 점프가 된다.. 그래도 모르니 보드별로 테스트를 하고 점프 프로그램에 USB 프로그램을 돌려봐도 잘 동작한다..


이 내용도 참조가 되었다.